00001 #include <stdio.h>
00002 #include <assert.h>
00003 #include "videomux4_env.h"
00004
00005 VideoMux4Env::VideoMux4Env
00006 (
00007 const Id& n,
00008 In<videomux_args_t>& muxArguments,
00009 In<pT_header>& seqInfoF,
00010 Out<imagePosition>& YimgPosF0,
00011 Out<imagePosition>& UVimgPosF0,
00012 Out<imagePosition>& YimgPosF1,
00013 Out<imagePosition>& UVimgPosF1,
00014 Out<imagePosition>& YimgPosF2,
00015 Out<imagePosition>& UVimgPosF2,
00016 Out<imagePosition>& YimgPosF3,
00017 Out<imagePosition>& UVimgPosF3
00018 )
00019 :
00020
00021 Process(n),
00022
00023 muxArgumentsP(id("muxArgumentsP"),muxArguments),
00024 seqInfoP(id("seqInfoP"),seqInfoF),
00025 YimgPosP0(id("YimgPosP0"),YimgPosF0),
00026 UVimgPosP0(id("UVimgPosP0"),UVimgPosF0),
00027 YimgPosP1(id("YimgPosP1"),YimgPosF1),
00028 UVimgPosP1(id("UVimgPosP1"),UVimgPosF1),
00029 YimgPosP2(id("YimgPosP2"),YimgPosF2),
00030 UVimgPosP2(id("UVimgPosP2"),UVimgPosF2),
00031 YimgPosP3(id("YimgPosP3"),YimgPosF3),
00032 UVimgPosP3(id("UVimgPosP3"),UVimgPosF3)
00033 {
00034 }
00035
00036 void VideoMux4Env::main()
00037 {
00038 while(true)
00039 {
00040 const int N = 4;
00041
00042 pT_header seqInfo;
00043 pT_color colorInfo;
00044 int nrImages;
00045 int interlaceFactor;
00046 videomux_args_t arguments;
00047
00048 imagePosition YimgPos[N];
00049 imagePosition UVimgPos[N];
00050
00051 read(muxArgumentsP, arguments);
00052 assert(arguments.NSTRM == N);
00053
00054 #ifdef VERBOSE
00055 printf("%s:\n",fullName());
00056 #endif
00057
00058 for(int i=0; i<N; i++)
00059 {
00060 YimgPos[i].x = arguments.hpos[i];
00061 YimgPos[i].y = arguments.vpos[i];
00062 YimgPos[i].z = arguments.depth[i];
00063
00064 #ifdef VERBOSE
00065 printf(" Stream %d position=(%d,%d), depth=%d\n",
00066 i, YimgPos[i].x, YimgPos[i].y, YimgPos[i].z);
00067 #endif
00068 }
00069 #ifdef VERBOSE
00070 printf("\n");
00071 #endif
00072
00073 read(seqInfoP, seqInfo);
00074 if (p_is_interlaced(&seqInfo))
00075 interlaceFactor = 2;
00076 else
00077 interlaceFactor = 1;
00078 colorInfo = p_get_color_format(&seqInfo);
00079
00080 nrImages = interlaceFactor * p_get_num_frames(&seqInfo);
00081 for (int i=0; i<N; i++)
00082 {
00083 YimgPos[i].y = YimgPos[i].y / interlaceFactor;
00084
00085 if ((colorInfo == P_COLOR_420) || (colorInfo == P_COLOR_420_PL))
00086 {
00087 UVimgPos[i].x = YimgPos[i].x / 2;
00088 UVimgPos[i].y = YimgPos[i].y / 2;
00089 UVimgPos[i].z = YimgPos[i].z;
00090 }
00091 else if ((colorInfo == P_COLOR_422) || (colorInfo == P_COLOR_422_PL))
00092 {
00093 UVimgPos[i].x = YimgPos[i].x / 2;
00094 UVimgPos[i].y = YimgPos[i].y;
00095 UVimgPos[i].z = YimgPos[i].z;
00096 } else
00097 {
00098 UVimgPos[i].x = YimgPos[i].x;
00099 UVimgPos[i].y = YimgPos[i].y;
00100 UVimgPos[i].z = YimgPos[i].z;
00101 }
00102 }
00103
00104 for (int i=0; i<nrImages; i++)
00105 {
00106 write(YimgPosP0, YimgPos[0]);
00107 write(UVimgPosP0, UVimgPos[0]);
00108 write(YimgPosP1, YimgPos[1]);
00109 write(UVimgPosP1, UVimgPos[1]);
00110 write(YimgPosP2, YimgPos[2]);
00111 write(UVimgPosP2, UVimgPos[2]);
00112 write(YimgPosP3, YimgPos[3]);
00113 write(UVimgPosP3, UVimgPos[3]);
00114 }
00115 }
00116 }