00001 #include "videomux4.h"
00002 #include <algorithm>
00003
00004 using namespace std;
00005
00006 VideoMux4::VideoMux4 (
00007 const Id& n,
00008
00009 In<VYApixel>& CinF0,
00010 In<VYAimageWidth>& imgWidthInF0,
00011 In<VYAimageHeight>& imgHeightInF0,
00012 In<imagePosition>& imgPosInF0,
00013
00014 In<VYApixel>& CinF1,
00015 In<VYAimageWidth>& imgWidthInF1,
00016 In<VYAimageHeight>& imgHeightInF1,
00017 In<imagePosition>& imgPosInF1,
00018
00019 In<VYApixel>& CinF2,
00020 In<VYAimageWidth>& imgWidthInF2,
00021 In<VYAimageHeight>& imgHeightInF2,
00022 In<imagePosition>& imgPosInF2,
00023
00024 In<VYApixel>& CinF3,
00025 In<VYAimageWidth>& imgWidthInF3,
00026 In<VYAimageHeight>& imgHeightInF3,
00027 In<imagePosition>& imgPosInF3,
00028
00029 Out<VYApixel>& CoutF,
00030 Out<VYAimageWidth>& imgWidthOutF,
00031 Out<VYAimageHeight>& imgHeightOutF)
00032 :
00033 Process(n),
00034
00035 CinP0(id("CinP0"), CinF0),
00036 imgWidthInP0(id("imgWidthInP0"), imgWidthInF0),
00037 imgHeightInP0(id("imgHeightInP0"), imgHeightInF0),
00038 imgPosInP0(id("imgPosInP0"), imgPosInF0),
00039
00040 CinP1(id("CinP1"), CinF1),
00041 imgWidthInP1(id("imgWidthInP1"), imgWidthInF1),
00042 imgHeightInP1(id("imgHeightInP1"), imgHeightInF1),
00043 imgPosInP1(id("imgPosInP1"), imgPosInF1),
00044
00045 CinP2(id("CinP2"), CinF2),
00046 imgWidthInP2(id("imgWidthInP2"), imgWidthInF2),
00047 imgHeightInP2(id("imgHeightInP2"), imgHeightInF2),
00048 imgPosInP2(id("imgPosInP2"), imgPosInF2),
00049
00050 CinP3(id("CinP3"), CinF3),
00051 imgWidthInP3(id("imgWidthInP3"), imgWidthInF3),
00052 imgHeightInP3(id("imgHeightInP3"), imgHeightInF3),
00053 imgPosInP3(id("imgPosInP3"), imgPosInF3),
00054
00055 CoutP(id("CoutP"), CoutF),
00056 imgWidthOutP(id("imgWidthOutP"), imgWidthOutF),
00057 imgHeightOutP(id("imgHeightOutP"), imgHeightOutF)
00058 {
00059 }
00060
00061 const char* VideoMux4::type() const
00062 {
00063 return "VideoMux4";
00064 }
00065
00066 void VideoMux4::main()
00067 {
00068
00069
00070
00071 const unsigned int N = 4;
00072
00073 imagePosition imgPos[N];
00074 VYApixel* line[N+1] = { 0, 0, 0, 0, 0 };
00075 VYAimageWidth imgWidth[N+1] = { 0, 0, 0, 0, 0 };
00076 VYAimageHeight imgHeight[N+1] = { 0, 0, 0, 0, 0 };
00077
00078 VYAimageWidth prevImgWidth[N+1] = { 0, 0, 0, 0, 0 };
00079
00080 unsigned int mapToDepth[N];
00081
00082 while(true)
00083 {
00084 read(imgWidthInP0, imgWidth[0]);
00085 read(imgHeightInP0, imgHeight[0]);
00086 read(imgPosInP0, imgPos[0]);
00087
00088 read(imgWidthInP1, imgWidth[1]);
00089 read(imgHeightInP1, imgHeight[1]);
00090 read(imgPosInP1, imgPos[1]);
00091
00092 read(imgWidthInP2, imgWidth[2]);
00093 read(imgHeightInP2, imgHeight[2]);
00094 read(imgPosInP2, imgPos[2]);
00095
00096 read(imgWidthInP3, imgWidth[3]);
00097 read(imgHeightInP3, imgHeight[3]);
00098 read(imgPosInP3, imgPos[3]);
00099
00100 imgWidth[N] = 0;
00101 imgHeight[N] = 0;
00102 for(unsigned int i=0; i<N; i++)
00103 {
00104 imgWidth[N] = max(imgWidth[N], imgPos[i].x + imgWidth[i]);
00105 imgHeight[N] = max(imgHeight[N], imgPos[i].y + imgHeight[i]);
00106 }
00107 write(imgWidthOutP, imgWidth[N]);
00108 write(imgHeightOutP, imgHeight[N]);
00109
00110 for(unsigned int i=0; i<=N; i++)
00111 {
00112 if (imgWidth[i] != prevImgWidth[i])
00113 {
00114 if (!line[i]) delete [] line[i];
00115 line[i] = new VYApixel[imgWidth[i]];
00116 prevImgWidth[i] = imgWidth[i];
00117
00118 }
00119 }
00120
00121 for(unsigned int i=0; i<N; i++)
00122 {
00123 mapToDepth[i] = i;
00124 }
00125 for(unsigned int i=0; i<N-1; i++)
00126 {
00127 for (unsigned int j=i; j<N; j++)
00128 {
00129 if (imgPos[mapToDepth[i]].z > imgPos[mapToDepth[j]].z)
00130 {
00131 mapToDepth[i] = j;
00132 mapToDepth[j] = i;
00133 }
00134 }
00135 }
00136
00137 for(VYAimageHeight h=0; h<imgHeight[N]; h++)
00138 {
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 if ((imgPos[0].y<=h) && (h<imgHeight[0]+imgPos[0].y))
00153 {
00154 read(CinP0, &line[0][0], imgWidth[0]);
00155 }
00156 if ((imgPos[1].y<=h) && (h<imgHeight[1]+imgPos[1].y))
00157 {
00158 read(CinP1, &line[1][0], imgWidth[1]);
00159 }
00160 if ((imgPos[2].y<=h) && (h<imgHeight[2]+imgPos[2].y))
00161 {
00162 read(CinP2, &line[2][0], imgWidth[2]);
00163 }
00164 if ((imgPos[3].y<=h) && (h<imgHeight[3]+imgPos[3].y))
00165 {
00166 read(CinP3, &line[3][0], imgWidth[3]);
00167 }
00168
00169 for(unsigned int i=0; i<imgWidth[N]; i++)
00170 {
00171 line[N][i] = 0;
00172 }
00173
00174 for (unsigned int i=0; i<N; i++)
00175 {
00176 unsigned int mi = mapToDepth[i];
00177 if ((imgPos[mi].y<=h) && (h<imgHeight[mi]+imgPos[mi].y))
00178 {
00179 for(unsigned j=0; j<imgWidth[mi]; j++)
00180 {
00181 line[N][imgPos[mi].x+j] = line[mi][j];
00182 }
00183 }
00184 }
00185
00186 write(CoutP, &line[N][0], imgWidth[N]);
00187 }
00188 }
00189 }
00190