Main Page | Namespace List | Compound List | File List | Compound Members | File Members

videomux4.cc

Go to the documentation of this file.
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   /* N is the number of input streams */
00069   /* Index N+1 contains the output stream dimensions */
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       /*  If we allow read with port reference, we do not need line buffers 0..N.
00140         Input of length imgWidth[mi] can be read immediately in line[N][imgPos[mi].x],
00141         i.e.,
00142       
00143         for (unsigned int i=0; i<N; i++)
00144         {
00145           unsigned int mi = mapToDepth[i];
00146           if ((imgPos[mi].y<=h) && (h<imgHeight[mi]+imgPos[mi].y))
00147           {
00148             read(CinP[mi], &line[N][imgPos[mi].x], imgWidth[mi]);
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 

Generated on Wed Feb 15 14:52:44 2006 for videomux by doxygen 1.3.2