Ejemplo n.º 1
0
void CRedirectSOCKS_Thread::StartRedirect()
{	
	char svn;
	if(xRead(m_sClientSocket, &svn, 1)<1) { xClose(m_sClientSocket); return; }

	switch(svn)
	{
	case 69:
		break;
	case 4:
		{
			struct socks4_hdr hdr4; sockaddr_in addrHost; int sServer;

			if(xRead(m_sClientSocket,&hdr4.cd,sizeof(hdr4)-2)<1) { xClose(m_sClientSocket); return; }

			if(hdr4.cd==SOCKS4_CONNECT)
			{
				memset(&addrHost, 0, sizeof(addrHost)); addrHost.sin_family=AF_INET;
				addrHost.sin_port=hdr4.destport; addrHost.sin_addr.s_addr=hdr4.destaddr;
				
				sServer=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
				
				if(connect(sServer,(sockaddr*)&addrHost, sizeof(addrHost))==SOCKET_ERROR)
				{
					hdr4.vn=0; hdr4.cd=SOCKS4_REJECT;
					memset(&hdr4.userid, 0, 1024);
					xWrite(m_sClientSocket, (char*)&hdr4, 8);
					xClose(m_sClientSocket);
					return;
				}

				hdr4.vn=0; hdr4.cd=SOCKS4_GRANT;
				memset(&hdr4.userid, 0, 1024);
				xWrite(m_sClientSocket, (char*)&hdr4, 8);

				int iLen; char szBuf[1024]; fd_set fd;

				SET_SOCK_BLOCK(m_sClientSocket, 0); SET_SOCK_BLOCK(sServer, 0);

				while(true)
				{
					iLen=xRead(sServer, szBuf, sizeof(szBuf));
					if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); continue; }
					xWrite(m_sClientSocket, szBuf, iLen);

					iLen=xRead(m_sClientSocket, szBuf, sizeof(szBuf));
					if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); continue; }
					xWrite(sServer, szBuf, iLen);
				}

				xClose(m_sClientSocket); xClose(sServer);
			}

		}
		break;
	default:
		break;
	}
}
Ejemplo n.º 2
0
void CMSPeak::Write(std::ostream& FileOut, const EMSSpectrumFileType FileType,
 const EMSPeakListTypes Which) const
{
    if(!FileOut || FileType != eMSSpectrumFileType_dta) return;
    xWrite(FileOut, GetPeakLists()[Which]->GetMZI(),
        GetPeakLists()[Which]->GetNum());
}
Ejemplo n.º 3
0
void CMSPeak::CullChargeAndWhich(const CMSSearchSettings& Settings)
{
    int iCharges;
	for(iCharges = 0; iCharges < GetNumCharges(); iCharges++){
        int TempLen(0);
        CMZI *Temp = new CMZI [GetPeakLists()[eMSPeakListOriginal]->GetNum()]; // temporary holder
        copy(SetPeakLists()[eMSPeakListOriginal]->GetMZI(), 
             SetPeakLists()[eMSPeakListOriginal]->GetMZI() + 
             GetPeakLists()[eMSPeakListOriginal]->GetNum(), Temp);
        TempLen = GetPeakLists()[eMSPeakListOriginal]->GetNum();
        bool ConsiderMultProduct(false);

		CullPrecursor(Temp,
                      TempLen,
                      CalcPrecursorMass(GetCharges()[iCharges]),
                      GetCharges()[iCharges],
                      Settings.GetPrecursorcull() != 0,
                      Settings.GetChargehandling().GetNegative());

//#define DEBUG_PEAKS1
#ifdef DEBUG_PEAKS1
    {
	sort(Temp, Temp+TempLen , CMZICompare());
	ofstream FileOut("afterprecurse.dta");
	xWrite(FileOut, Temp, TempLen);
	sort(Temp, Temp+TempLen , CMZICompareIntensity());
    }
#endif

        if(GetCharges()[iCharges] >= ConsiderMult) ConsiderMultProduct = true;

    	SmartCull(Settings,
    			  Temp, TempLen, ConsiderMultProduct);
    
        // make the array of culled peaks
    	EMSPeakListTypes Which = GetWhich(GetCharges()[iCharges]);
        SetPeakLists()[Which]->CreateLists(TempLen);
        copy(Temp, Temp+TempLen, SetPeakLists()[Which]->GetMZI());
        SetPeakLists()[Which]->Sort(eMSPeakListSortIntensity);
        SetPeakLists()[Which]->Rank();
        SetPeakLists()[Which]->Sort(eMSPeakListSortMZ);

        delete [] Temp;
	}
}
Ejemplo n.º 4
0
char display_extent_page(
int64   address)
{
        int32           changed = 0;
        char            flag_names[64];
        dtpage_t        node;
        char            result;
        int8            *stbl;

        if (xRead(address << l2bsize, sizeof(dtpage_t), (char *)&node)) {
                fprintf(stderr, "display_extent_page: Error reading node\n");
                return 'u';
        }

redisplay5:
        *flag_names = 0;
        if (node.header.flag & BT_ROOT) {
                fputs("display_extent_page:  Warning!  extent dtree page has BT_ROOT flag set!\n",
                        stderr);
                strcat(flag_names, "BT_ROOT  ");
        }
        if (node.header.flag & BT_LEAF)
                strcat(flag_names, "BT_LEAF  ");
        if (node.header.flag & BT_INTERNAL)
                strcat(flag_names, "BT_INTERNAL  ");
        if (node.header.flag & BT_RIGHTMOST)
                strcat(flag_names, "BT_RIGHTMOST  ");
        if (node.header.flag & BT_LEFTMOST)
                strcat(flag_names, "BT_LEFTMOST  ");

        printf("Internal D-tree node at block %lld\n", address);

        printf("[1] flag\t0x%02x\t\t%s\n", node.header.flag, flag_names);
        printf("[2] nextindex\t%3d\n", node.header.nextindex);
        printf("[3] freecnt\t%3d\t\t", node.header.freecnt);
        printf("[7] rsrvd\tNOT DISPLAYED\n");
        printf("[4] freelist\t%3d\t\t", node.header.freelist);
        printf("[8] self.len\t0x%06x\n",node.header.self.len);
        printf("[5] maxslot\t%3d\t\t", node.header.maxslot);
        printf("[8] self.addr1\t0x%02x\n",node.header.self.addr1);
        printf("[6] stblindex\t%d\t\t", node.header.stblindex);
        printf("[9] \t0x%08x\n",node.header.self.addr2);

        if (node.header.nextindex) {
                result = prompt("dtree: Hit enter to see entries, [u]p or e[x]it: ");
                if (result == 'u' || result == 'x')
                        return(result);
        }
        else {
                fputs("display_extent_page: Strange ... empty d-tree node.\n",
                        stderr);
                return 'u';
        }

        stbl = (int8 *)&(node.slot[node.header.stblindex]);

        if (node.header.flag & BT_LEAF)
                result = display_leaf_slots(node.slot, stbl,
                                                node.header.nextindex,
                                                &changed);
        else
                result = display_internal_slots(node.slot, stbl,
                                                node.header.nextindex,
                                                &changed);

        if (changed) {
                if (xWrite(address << l2bsize, sizeof(dtpage_t), (char *)&node)) {
                        fputs("display_extent_page: error writing node\n\n", stderr);
                        return 0;
                }
                changed = 0;
        }
        if (result == 'u')
                goto redisplay5;

        return result;
}
Ejemplo n.º 5
0
char display_internal_xtpage(xad_t xad)
{
     int32           changed = 0;
     char            cmd_line[80];
     xtpage_t        xtree_area;
     xtpage_t        *xtree=&xtree_area;
     int32           field;
     char            flag_names[64];
     int64           xtpage_address;
     ino_t           inum;
     char            result = 'u';
     char            *token;
     ino_t           which_table = FILESYSTEM_I;


     xtpage_address = addressXAD(&xad);
     xtpage_address = xtpage_address*bsize;

     if (xRead(xtpage_address, sizeof(xtpage_t), (char *)xtree)) {
             fputs("xtree: error reading xtpage\n\n", stderr);
     }
     else {

redisplay:

        display_xtpage(xtree);

retry:
        if (xtree->header.nextindex > 2) {
                fputs("xtree: Hit enter to see entries, [m]odify, or e[x]it: ",
                        stdout);
        }
        else {
                fputs("xtree: [m]odify, or e[x]it: ", stdout);
        }

        gets(cmd_line);
        token = strtok(cmd_line, "      ");
        if (token) {
                if (*token == 'x')
                        return result;

          if (*token == 'm') {
                field = m_parse(cmd_line, 6, &token);
                if (field == 0)
                        goto retry;

                switch (field)
                {
                case 1:
                        xtree->header.flag = strtoul(token, 0, 16);
                        break;
                case 2:
                        xtree->header.nextindex = strtoul(token, 0, 0);
                        break;
                case 3:
                        xtree->header.maxentry = strtoul(token, 0, 0);
                        break;
                case 4:
                        xtree->header.self.len = strtoul(token, 0, 0);
                        break;
                case 5:
                        xtree->header.self.addr1 = strtoul(token, 0, 0);
                        break;
                case 6:
                        xtree->header.self.addr2 = strtoul(token, 0, 0);
                        break;
                }
                if (xWrite(xtpage_address, sizeof(xtpage_t), (char *)xtree)) {
                        fputs("xtree: error writing xtpage\n\n", stderr);
                        return result;
                }
                goto redisplay;
          }
        }
        if (xtree->header.nextindex <= 2)
                return result;

        if (xtree->header.flag & BT_LEAF)
                result = display_leaf_xads(xtree->xad,
                                xtree->header.nextindex, &changed);
        else
                result = display_internal_xads(xtree->xad,
                                xtree->header.nextindex, &changed);

        if (changed) {
                if (xWrite(xtpage_address, sizeof(xtpage_t), (char *)xtree)) {
                        fputs("xtree: error writing xtpage\n\n", stderr);
                        return result;
                }
                changed = 0;
        }

        if (result == 'u')
                goto redisplay;
     } /* end else */

     return result;
}
Ejemplo n.º 6
0
void xtree()
{
        int32           changed = 0;
        char            cmd_line[80];
        xtpage_t        *xtree;
        int32           field;
        char            flag_names[64];
        dinode_t        inode;
        int64           inode_address;
        ino_t           inum;
        char            result;
        char            *token;
        ino_t           which_table = FILESYSTEM_I;

        token = strtok(0, "     ");
        if (token == 0) {
                fputs("xtree: Please enter: inum [fileset]\ndtree> ",stdout);
                gets(cmd_line);
                token=strtok(cmd_line, "        ");
                if (token == 0)
                        return;
        }
        errno = 0;
        inum = strtoul(token, 0, 0);
        if (inum == 0 && errno) {
                fputs("xtree: invalid inum\n\n", stderr);
                return;
        }
        token = strtok(0, "     ");
        if (token) {
                if (token[0] == 'a')
                        which_table = AGGREGATE_I;
                else if (token[0] == 's')
                        which_table = AGGREGATE_2ND_I;
                else if (token[0] != '0') {
                        fputs("inode: invalide fileset\n\n", stderr);
                        return;
                }
        }
        if (strtok(0, "         ")) {
                fputs("xtree: Too many arguments\n\n", stderr);
                return;
        }

        if (find_inode(inum, which_table, &inode_address) ||
            xRead(inode_address, sizeof(dinode_t), (char *)&inode)) {
                fputs("xtree: error reading inode\n\n", stderr);
                return;
        }
        if ((inode.di_mode & IFMT) == IFDIR) {
                fputs("xtree: INODE IS A DIRECTORY!\n", stderr);
                return;
        }

        xtree = (xtpage_t *)&(inode.di_btroot);

redisplay:

        printf("Root X-Tree Node of inode %d\n\n", inode.di_number);
        display_xtpage(xtree);

retry:
        if (xtree->header.nextindex > 2) {
                fputs("xtree: Hit enter to see entries, [m]odify, or e[x]it: ",
                        stdout);
        }
        else {
                fputs("xtree: [m]odify, or e[x]it: ", stdout);
        }

        gets(cmd_line);
        token = strtok(cmd_line, "      ");
        if (token) {
                if (*token == 'x')
                        return;

        if (*token == 'm') {
                field = m_parse(cmd_line, 6, &token);
                if (field == 0)
                        goto retry;

                switch (field)
                {
                case 1:
                        xtree->header.flag = strtoul(token, 0, 16);
                        break;
                case 2:
                        xtree->header.nextindex = strtoul(token, 0, 0);
                        break;
                case 3:
                        xtree->header.maxentry = strtoul(token, 0, 0);
                        break;
                case 4:
                        xtree->header.self.len = strtoul(token, 0, 0);
                        break;
                case 5:
                        xtree->header.self.addr1 = strtoul(token, 0, 0);
                        break;
                case 6:
                        xtree->header.self.addr2 = strtoul(token, 0, 0);
                        break;
                }
                if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) {
                        fputs("xtree: error writing inode\n\n", stderr);
                        return;
                }
                goto redisplay;
        }
        }
        if (xtree->header.nextindex <= 2)
                return;

        if (xtree->header.flag & BT_LEAF)
                result = display_leaf_xads(xtree->xad,
                                xtree->header.nextindex, &changed);
        else
                result = display_internal_xads(xtree->xad,
                                xtree->header.nextindex, &changed);

        if (changed) {
                if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) {
                        fputs("xtree: error writing inode\n\n", stderr);
                        return;
                }
                changed = 0;
        }

        if (result == 'u')
                goto redisplay;

        return;
}
Ejemplo n.º 7
0
void dtree()
{
        int32           changed = 0;
        char            cmd_line[80];
        dtpage_t        *dtree;
        int32           field;
        char            flag_names[64];
        dinode_t        inode;
        int64           inode_address;
        ino_t           inum;
        char            result;
        dtroot_t        *root;
        char            *token;
        ino_t           which_table = FILESYSTEM_I;

        token = strtok(0, "     ");
        if (token == 0) {
                fputs("dtree: Please enter: inum [fileset]\ndtree> ",stdout);
                gets(cmd_line);
                token=strtok(cmd_line, "        ");
                if (token == 0)
                        return;
        }
        errno = 0;
        inum = strtoul(token, 0, 0);
        if (inum == 0 && errno) {
                fputs("dtree: invalid inum\n\n", stderr);
                return;
        }
        token = strtok(0, "     ");
        if (token) {
                if (token[0] != '0') {
                        fputs("dtree: invalide fileset\n\n", stderr);
                        return;
                }
        }
        if (strtok(0, "         ")) {
                fputs("dtree: Too many arguments\n\n", stderr);
                return;
        }

        if (find_inode(inum, which_table, &inode_address) ||
            xRead(inode_address, sizeof(dinode_t), (char *)&inode)) {
                fputs("dtree: error reading inode\n\n", stderr);
                return;
        }
        if ((inode.di_mode & IFMT) != IFDIR) {
                fputs("dtree: Not a directory!\n", stderr);
                return;
        }

        dtree = (dtpage_t *)&(inode.di_btroot);

redisplay:

        if (!(dtree->header.flag & BT_ROOT))
                        fputs("dtree: Should be at root of dtree, but BTROOT not set!\n", stderr);
        root = (dtroot_t *)dtree;

        *flag_names = 0;
        if (root->header.flag & BT_ROOT)
                strcat(flag_names, "BT_ROOT  ");
        if (root->header.flag & BT_LEAF)
                strcat(flag_names, "BT_LEAF  ");
        if (root->header.flag & BT_INTERNAL)
                strcat(flag_names, "BT_INTERNAL  ");
        if (root->header.flag & BT_RIGHTMOST)
                strcat(flag_names, "BT_RIGHTMOST  ");
        if (root->header.flag & BT_LEFTMOST)
                strcat(flag_names, "BT_LEFTMOST  ");

        printf("Root D-Tree Node of inode %d\n\n", inode.di_number);
        printf("[1] DASDlimit\t%lld\n", DASDLIMIT(&(root->header.DASD)));   /* @F1 */
        printf("[2] DASDused\t%lld\n", DASDUSED(&(root->header.DASD)));   /* @F1 */
        printf("[3] thresh (%%)\t%d\n", root->header.DASD.thresh );  /* @F1 */
        printf("[4] delta (%%)\t%d\n", root->header.DASD.delta );     /* @F1 */
        printf("\n");                                                                  /* @F1 */
        printf("[5] flag\t0x%02x\t\t%s\n", root->header.flag, flag_names); /* @F1 */
        printf("[6] nextindex\t%d\n", root->header.nextindex);       /* @F1 */
        printf("[7] freecnt\t%d\n", root->header.freecnt);              /* @F1 */
        printf("[8] freelist\t%d\n", root->header.freelist);               /* @F1 */
        printf("[9] idotdot\t%d\n", root->header.idotdot);               /* @F1 */
        printf("[10] stbl\t{%d,%d,%d,%d,%d,%d,%d,%d}\n",               /* @F1 */
                root->header.stbl[0], root->header.stbl[1],
                root->header.stbl[2], root->header.stbl[3],
                root->header.stbl[4], root->header.stbl[5],
                root->header.stbl[6], root->header.stbl[7]);

retry:
        if (root->header.nextindex) {
                fputs("dtree: Hit enter to see entries, [m]odify, or e[x]it: ",
                        stdout);
        }
        else {
                fputs("dtree: [m]odify, or e[x]it: ", stdout);
        }

        gets(cmd_line);
        token = strtok(cmd_line, "      ");
        if (token) {
                if (*token == 'x')
                        return;

        if (*token == 'm') {
                field = m_parse(cmd_line, 9, &token);
                if (field == 0)
                        goto retry;

                switch (field)
                {
                case 1:                                                                      /* @F1 */
                        setDASDLIMIT(&(root->header.DASD), strtoll(token, 0, 0) );  /* @F1 */
                        break;                                                               /* @F1 */
                case 2:                                                                      /* @F1 */
                        setDASDUSED(&(root->header.DASD), strtoll(token, 0, 0) );  /* @F1 */
                        break;                                                               /* @F1 */
                case 3:                                                                      /* @F1 */
                        root->header.DASD.thresh = strtoul(token, 0, 0);     /* @F1 */
                        break;                                                               /* @F1 */
                case 4:                                                                      /* @F1 */
                        root->header.DASD.delta = strtoul(token, 0, 0);       /* @F1 */
                        break;                                                               /* @F1 */
                case 5:                                                                      /* @F1 */
                        root->header.flag = strtoul(token, 0, 16);
                        break;
                case 6:                                                                      /* @F1 */
                        root->header.nextindex = strtoul(token, 0, 0);
                        break;
                case 7:                                                                      /* @F1 */
                        root->header.freecnt = strtoul(token, 0, 0);
                        break;
                case 8:                                                                      /* @F1 */
                        root->header.freelist = strtoul(token, 0, 0);
                        break;
                case 9:                                                                      /* @F1 */
                        root->header.idotdot = strtoul(token, 0, 0);
                        break;
                }
                if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) {
                        fputs("dtree: error writing inode\n\n", stderr);
                        return;
                }
                goto redisplay;
        }
        }
        if (root->header.nextindex == 0)
                return;

        if (root->header.flag & BT_LEAF)
                result = display_leaf_slots(root->slot, root->header.stbl,
                                root->header.nextindex, &changed);
        else
                result = display_internal_slots(root->slot, root->header.stbl,
                                root->header.nextindex, &changed);

        if (changed) {
                if (xWrite(inode_address, sizeof(dinode_t), (char *)&inode)) {
                        fputs("dtree: error writing inode\n\n", stderr);
                        return;
                }
                changed = 0;
        }

        if (result == 'u')
                goto redisplay;

        return;
}
Ejemplo n.º 8
0
__fi void xWrite64( u64 val )
{
	xWrite( val );
}
Ejemplo n.º 9
0
__fi void xWrite32( u32 val )
{
	xWrite( val );
}
Ejemplo n.º 10
0
__fi void xWrite16( u16 val )
{
	xWrite( val );
}
Ejemplo n.º 11
0
__fi void xWrite8( u8 val )
{
	xWrite( val );
}
Ejemplo n.º 12
0
// recursively culls the peaks
void CMSPeak::SmartCull(const CMSSearchSettings& Settings,
						CMZI *Temp, 
                        int& TempLen, 
                        const bool ConsiderMultProduct)
{
    int iMZI = 0;  // starting point

    // prep the data
    CullBaseLine(Settings.GetCutlo(), Temp, TempLen);
#ifdef DEBUG_PEAKS1
    {
	sort(Temp, Temp+TempLen , CMZICompare());
	ofstream FileOut("afterbase.dta");
	xWrite(FileOut, Temp, TempLen);
	sort(Temp, Temp+TempLen , CMZICompareIntensity());
    }
#endif
    CullIsotope(Temp, TempLen);
#ifdef DEBUG_PEAKS1
    {
	sort(Temp, Temp+TempLen , CMZICompare());
	ofstream FileOut("afteriso.dta");
	xWrite(FileOut, Temp, TempLen);
	sort(Temp, Temp+TempLen , CMZICompareIntensity());
    }
#endif
    // h20 and nh3 loss ignored until this cut can be studied
#if 0
    sort(Temp, Temp + TempLen, CMZICompareHigh());
    CullH20NH3(Temp, TempLen);
    sort(Temp, Temp + TempLen, CMZICompareIntensity());
#endif

    // now do the recursion
    int iTemp(0), jMZI;
    set <int> Deleted;
    map <int, int> MajorPeak; // maps a peak to it's "major peak"
    int HitsAllowed; // the number of hits allowed in a window
    int Window; // the m/z range used to limit the number of peaks
    int HitCount;  // number of nearby peaks
   
    // scan for isotopes, starting at highest peak
    for(iMZI = 0; iMZI < TempLen - 1; iMZI++) { 
        if(Deleted.count(iMZI) != 0) continue;
        HitCount = 0;
        if(!ConsiderMultProduct ||
           Temp[iMZI].GetMZ() > 
           Precursormz) {
            // if charge 1 region, allow fewer peaks
            Window = Settings.GetSinglewin(); //27;
            HitsAllowed = Settings.GetSinglenum();
        }
        else {
            // otherwise allow a greater number
            Window = Settings.GetDoublewin(); //14;
            HitsAllowed = Settings.GetDoublenum();
        }
        // go over smaller peaks
        set <int> Considered;
        for(jMZI = iMZI + 1; jMZI < TempLen; jMZI++) { 
            if(Temp[jMZI].GetMZ() < Temp[iMZI].GetMZ() + MSSCALE2INT(Window) + tol &&
               Temp[jMZI].GetMZ() > Temp[iMZI].GetMZ() - MSSCALE2INT(Window) - tol &&
               Deleted.find(jMZI) == Deleted.end()) {
                if(IsMajorPeak(Temp[iMZI].GetMZ(), Temp[jMZI].GetMZ(), tol)) {
                    // link little peak to big peak
                    MajorPeak[jMZI] = iMZI;
                    // ignore for deletion
                    continue;
                }
                // if linked to a major peak, skip
                if(MajorPeak.find(jMZI) != MajorPeak.end()) {
                    if(Considered.find(jMZI) != Considered.end())
                        continue;
                    Considered.insert(jMZI);
                    HitCount++;
                    if(HitCount <= HitsAllowed)  continue;
                }
                // if the first peak, skip
                HitCount++;
                if(HitCount <= HitsAllowed)  continue;
                Deleted.insert(jMZI);
            }
        }
    }
    
    // delete the culled peaks
    for(iMZI = 0; iMZI < TempLen; iMZI++) {
		if(Deleted.count(iMZI) == 0) {
			Temp[iTemp] = Temp[iMZI];
			iTemp++;
		}
    }
    TempLen = iTemp;

#ifdef DEBUG_PEAKS1
    {
	sort(Temp, Temp+TempLen , CMZICompare());
	ofstream FileOut("aftercull.dta");
	xWrite(FileOut, Temp, TempLen);
	sort(Temp, Temp+TempLen , CMZICompareIntensity());
    }
#endif

}
Ejemplo n.º 13
0
ErrVal
H264AVCEncoderTest::go()
{
  UInt                    uiWrittenBytes          = 0;
  const UInt              uiMaxFrame              = m_pcEncoderCodingParameter->getTotalFrames();
  UInt                    uiNumLayers             = ( m_pcEncoderCodingParameter->getMVCmode() ? 1 : m_pcEncoderCodingParameter->getNumberOfLayers() );
  UInt                    uiFrame;
  UInt                    uiLayer;
  UInt                    auiMbX                  [MAX_LAYERS];
  UInt                    auiMbY                  [MAX_LAYERS];
  UInt                    auiPicSize              [MAX_LAYERS];
  PicBuffer*              apcOriginalPicBuffer    [MAX_LAYERS];//original pic
  PicBuffer*              apcReconstructPicBuffer [MAX_LAYERS];//rec pic
  PicBufferList           acPicBufferOutputList   [MAX_LAYERS];
  PicBufferList           acPicBufferUnusedList   [MAX_LAYERS];
  ExtBinDataAccessorList  cOutExtBinDataAccessorList;
  Bool                    bMoreSets;

  
  //===== initialization =====
  RNOK( m_pcH264AVCEncoder->init( m_pcEncoderCodingParameter ) ); 


  //===== write parameter sets =====
  for( bMoreSets = true; bMoreSets;  )
  {
    UChar   aucParameterSetBuffer[1000];
    BinData cBinData;
    cBinData.reset();
    cBinData.set( aucParameterSetBuffer, 1000 );

    ExtBinDataAccessor cExtBinDataAccessor;
    cBinData.setMemAccessor( cExtBinDataAccessor );

    RNOK( m_pcH264AVCEncoder      ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
		if( m_pcH264AVCEncoder->getScalableSeiMessage() )
		{		
    RNOK( m_pcWriteBitstreamToFile->writePacket       ( &m_cBinDataStartCode ) );
    RNOK( m_pcWriteBitstreamToFile->writePacket       ( &cExtBinDataAccessor ) );
    
    uiWrittenBytes += 4 + cExtBinDataAccessor.size();
		}
    cBinData.reset();
  }

//JVT-W080, PDS SEI message
	if( m_pcEncoderCodingParameter->getMVCmode() && m_pcEncoderCodingParameter->getPdsEnable() )
	{
		//write SEI message
	  UChar   aucParameterSetBuffer[1000];
    BinData cBinData;
    cBinData.reset();
    cBinData.set( aucParameterSetBuffer, 1000 );

    ExtBinDataAccessor cExtBinDataAccessor;
    cBinData.setMemAccessor( cExtBinDataAccessor );

		const UInt uiSPSId = 0; //currently only one SPS with SPSId = 0
		UInt uiNumView       = m_pcEncoderCodingParameter->SpsMVC.getNumViewMinus1()+1;
		UInt* num_refs_list0_anc = new UInt [uiNumView];
		UInt* num_refs_list1_anc = new UInt [uiNumView];
		UInt* num_refs_list0_nonanc = new UInt [uiNumView];
		UInt* num_refs_list1_nonanc = new UInt [uiNumView];

		for( UInt i = 0; i < uiNumView; i++ )
		{
			num_refs_list0_anc[i]    = m_pcEncoderCodingParameter->SpsMVC.getNumAnchorRefsForListX( m_pcEncoderCodingParameter->SpsMVC.getViewCodingOrder()[i], 0 );
			num_refs_list1_anc[i]    = m_pcEncoderCodingParameter->SpsMVC.getNumAnchorRefsForListX( m_pcEncoderCodingParameter->SpsMVC.getViewCodingOrder()[i], 1 );
			num_refs_list0_nonanc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX( m_pcEncoderCodingParameter->SpsMVC.getViewCodingOrder()[i], 0 );
			num_refs_list1_nonanc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX( m_pcEncoderCodingParameter->SpsMVC.getViewCodingOrder()[i], 1 );		  
		}
//#define HELP_INFOR
#ifdef  HELP_INFOR
		printf("\n");
		for( UInt i = 0; i < uiNumView; i++ )
		{
			printf(" num_refs_list0_anchor: %d\tnum_refs_list0_nonanchor: %d\n num_refs_list1_anchor: %d\tnum_refs_list1_nonanchor: %d\n", num_refs_list0_anc[i], num_refs_list1_anc[i], num_refs_list0_nonanc[i], num_refs_list1_nonanc[i] );
		}
#endif

    UInt uiInitialPDIDelayAnc = m_pcEncoderCodingParameter->getPdsInitialDelayAnc();
    UInt uiInitialPDIDelayNonAnc = m_pcEncoderCodingParameter->getPdsInitialDelayNonAnc();
		if( uiInitialPDIDelayAnc < 2 )
			uiInitialPDIDelayAnc  = 2;
		if( uiInitialPDIDelayNonAnc < 2 )
			uiInitialPDIDelayNonAnc  = 2;
		RNOK( m_pcH264AVCEncoder->writePDSSEIMessage( &cExtBinDataAccessor
			                                           , uiSPSId
			                                           , uiNumView
			                                           , num_refs_list0_anc
																								 , num_refs_list1_anc
			                                           , num_refs_list0_nonanc
																								 , num_refs_list1_nonanc
																								 , uiInitialPDIDelayAnc
																								 , uiInitialPDIDelayNonAnc
																								) 
				);

		delete[] num_refs_list0_anc;
		delete[] num_refs_list1_anc;
		delete[] num_refs_list0_nonanc;
		delete[] num_refs_list1_nonanc;
		num_refs_list0_anc = NULL;
		num_refs_list1_anc = NULL;
		num_refs_list0_nonanc = NULL;
		num_refs_list1_nonanc = NULL;
	  if( m_pcEncoderCodingParameter->getCurentViewId() == m_pcEncoderCodingParameter->SpsMVC.m_uiViewCodingOrder[0] )
		{
			RNOK( m_pcWriteBitstreamToFile->writePacket       ( &m_cBinDataStartCode ) );
			RNOK( m_pcWriteBitstreamToFile->writePacket       ( &cExtBinDataAccessor ) );
			uiWrittenBytes += 4 + cExtBinDataAccessor.size();
		}

		cBinData.reset();
	}
//~JVT-W080
  //SEI {
  if( m_pcEncoderCodingParameter->getMultiviewSceneInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview scene information sei message
	  UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder ->writeMultiviewSceneInfoSEIMessage( &cExtBinDataAccessor ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
	  uiWrittenBytes += 4 + cExtBinDataAccessor.size();
	  cBinData.reset();
  }
  if( m_pcEncoderCodingParameter->getMultiviewAcquisitionInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview acquisition information sei message
	  UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder ->writeMultiviewAcquisitionInfoSEIMessage( &cExtBinDataAccessor ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
	  uiWrittenBytes += 4 + cExtBinDataAccessor.size();
	  cBinData.reset();
  }
  if( m_pcEncoderCodingParameter->getNestingSEIEnable() && m_pcEncoderCodingParameter->getSnapshotEnable() 
	  && m_pcEncoderCodingParameter->getCurentViewId() == 0 )
  {
   // add nesting sei message for view0
      UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder ->writeNestingSEIMessage( &cExtBinDataAccessor ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
	  RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
	  uiWrittenBytes += 4 + cExtBinDataAccessor.size();
	  cBinData.reset();
  }
//SEI }

  //===== determine parameters for required frame buffers =====
  for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
  {
    //auiMbX        [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameWidth () >> 4;
    //auiMbY        [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameHeight() >> 4;
    auiMbX        [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameWidthInMbs();
    auiMbY        [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameHeightInMbs();
    m_aauiCropping[uiLayer][0]     = 0;
    m_aauiCropping[uiLayer][1]     = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getHorPadding      ();
    m_aauiCropping[uiLayer][2]     = 0;
    m_aauiCropping[uiLayer][3]     = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getVerPadding      ();
    m_apcWriteYuv[uiLayer]->setCrop(m_aauiCropping[uiLayer]);

    UInt  uiSize            = ((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN);
    auiPicSize    [uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)*((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*3/2;
    m_auiLumOffset[uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)* YUV_Y_MARGIN   + YUV_X_MARGIN;  
    m_auiCbOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+  YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + uiSize; 
    m_auiCrOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+  YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + 5*uiSize/4;
    m_auiHeight   [uiLayer] =   auiMbY[uiLayer]<<4;
    m_auiWidth    [uiLayer] =   auiMbX[uiLayer]<<4;
    m_auiStride   [uiLayer] =  (auiMbX[uiLayer]<<4)+ 2*YUV_X_MARGIN;
  }

  //===== loop over frames =====
  for( uiFrame = 0; uiFrame < uiMaxFrame; uiFrame++ )
  {
    //===== get picture buffers and read original pictures =====
    for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
    {
      UInt  uiSkip = ( 1 << m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getTemporalResolution() );

      if( uiFrame % uiSkip == 0 )
      {
        RNOK( xGetNewPicBuffer( apcReconstructPicBuffer [uiLayer], uiLayer, auiPicSize[uiLayer] ) );
        RNOK( xGetNewPicBuffer( apcOriginalPicBuffer    [uiLayer], uiLayer, auiPicSize[uiLayer] ) );

        RNOK( m_apcReadYuv[uiLayer]->readFrame( *apcOriginalPicBuffer[uiLayer] + m_auiLumOffset[uiLayer],
                                                *apcOriginalPicBuffer[uiLayer] + m_auiCbOffset [uiLayer],
                                                *apcOriginalPicBuffer[uiLayer] + m_auiCrOffset [uiLayer],
                                                m_auiHeight [uiLayer],
                                                m_auiWidth  [uiLayer],
                                                m_auiStride [uiLayer] ) );
      }
      else
      {
        apcReconstructPicBuffer [uiLayer] = 0;
        apcOriginalPicBuffer    [uiLayer] = 0;
      }
    }

    //===== call encoder =====
    RNOK( m_pcH264AVCEncoder->process( cOutExtBinDataAccessorList,
                                       apcOriginalPicBuffer,
                                       apcReconstructPicBuffer,
                                       acPicBufferOutputList,
                                       acPicBufferUnusedList ) );

    //===== write and release NAL unit buffers =====
    UInt  uiBytesUsed = 0;
    RNOK( xWrite  ( cOutExtBinDataAccessorList, uiBytesUsed ) );
    uiWrittenBytes   += uiBytesUsed;
    
    //===== write and release reconstructed pictures =====
    for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
    {
      RNOK( xWrite  ( acPicBufferOutputList[uiLayer], uiLayer ) );
      RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
    }
  }

  //===== finish encoding =====
  UInt  uiNumCodedFrames = 0;
  Double  dHighestLayerOutputRate = 0.0;
  RNOK( m_pcH264AVCEncoder->finish( cOutExtBinDataAccessorList,
                                    acPicBufferOutputList,
                                    acPicBufferUnusedList,
                                    uiNumCodedFrames,
                                    dHighestLayerOutputRate ) );


  //===== write and release NAL unit buffers =====
  RNOK( xWrite  ( cOutExtBinDataAccessorList, uiWrittenBytes ) );

  //===== write and release reconstructed pictures =====
  for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
  {
    RNOK( xWrite  ( acPicBufferOutputList[uiLayer], uiLayer ) );
    RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
  }


  //===== set parameters and output summary =====
  m_cEncoderIoParameter.nFrames = uiFrame;
  m_cEncoderIoParameter.nResult = 0;

  if( ! m_pcEncoderCodingParameter->getMVCmode() )
	{
		UChar   aucParameterSetBuffer[1000];
		BinData cBinData;
		cBinData.reset();
		cBinData.set( aucParameterSetBuffer, 1000 );

		ExtBinDataAccessor cExtBinDataAccessor;
		cBinData.setMemAccessor( cExtBinDataAccessor );
		m_pcH264AVCEncoder->SetVeryFirstCall();
		RNOK( m_pcH264AVCEncoder      ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
		RNOK( m_pcWriteBitstreamToFile->writePacket       ( &m_cBinDataStartCode ) );
		RNOK( m_pcWriteBitstreamToFile->writePacket       ( &cExtBinDataAccessor ) );
		uiWrittenBytes += 4 + cExtBinDataAccessor.size();
		cBinData.reset();
	}
//SEI {
  if( m_pcEncoderCodingParameter->getViewScalInfoSEIEnable() )
  {
    //view scalability information sei message
     UChar   aucParameterSetBuffer[1000];
     BinData cBinData;
     cBinData.reset();
     cBinData.set( aucParameterSetBuffer, 1000 );

     ExtBinDataAccessor cExtBinDataAccessor;
     cBinData.setMemAccessor( cExtBinDataAccessor );
     RNOK( m_pcH264AVCEncoder->writeViewScalInfoSEIMessage( &cExtBinDataAccessor ) );
     RNOK( m_pcWriteBitstreamToFile->writePacket       ( &m_cBinDataStartCode ) );
     RNOK( m_pcWriteBitstreamToFile->writePacket       ( &cExtBinDataAccessor ) );
     uiWrittenBytes += 4 + cExtBinDataAccessor.size();
     cBinData.reset();

  }
//SEI }
  if( m_pcWriteBitstreamToFile )
  {
    RNOK( m_pcWriteBitstreamToFile->uninit() );  
    RNOK( m_pcWriteBitstreamToFile->destroy() );  
  }

//SEI {
  if( m_pcEncoderCodingParameter->getViewScalInfoSEIEnable() )
  {
    RNOK    ( ViewScalableDealing() );
  }
//SEI }
  if( ! m_pcEncoderCodingParameter->getMVCmode() )
  {
	RNOK	( ScalableDealing() );
  }

  return Err::m_nOK;
}
Ejemplo n.º 14
0
ErrVal
H264AVCEncoderTest::go()
{
  UInt                    uiWrittenBytes[MAX_LAYERS];
  const UInt              uiMaxFrame              = m_pcEncoderCodingParameter[0]->getTotalFrames();
  UInt                    uiNumViews             =  /*(m_pcEncoderCodingParameter[0]->getMVCmode() ? 1 :*/ m_pcEncoderCodingParameter[0]->getNumberOfLayers();
  UInt                    uiFrame=0;
  UInt                    uiView;
  UInt                    uiLayer;
  UInt                    auiMbX                  [MAX_LAYERS];
  UInt                    auiMbY                  [MAX_LAYERS];
  UInt                    auiPicSize              [MAX_LAYERS];
  PicBuffer*              apcOriginalPicBuffer    [MAX_LAYERS];//original pic
  PicBuffer*              apcReconstructPicBuffer [MAX_LAYERS];
  PicBufferList			  acPicBufferOutputList   [MAX_LAYERS];//rec pic
  PicBufferList           acPicBufferUnusedList   [MAX_LAYERS];
  ExtBinDataAccessorList  cOutExtBinDataAccessorList[MAX_LAYERS];
  Bool                    bMoreSets;

   //Buffers per evitar escriure a disc ELS DEFINIREM DINS DEL GO()
  ExtBinDataAccessorList	LayerBuffer[MAX_LAYERS];
  ExtBinDataAccessorList	StartCodeBuffer[MAX_LAYERS];
 
  UInt i=0;
  UInt j=0;

  //===== initialization =====
  for(uiView=0;uiView<uiNumViews;uiView++){ 
	RNOK( m_pcH264AVCEncoder[uiView]->init( m_pcEncoderCodingParameter[uiView] ) ); 
  }
  

  string ip_adress = m_pcEncoderCodingParameter[0]->getIPAdress();
  char adress[15];
  strcpy(adress,ip_adress.c_str());
  
  m_apcRtpPacker->init(adress,m_pcEncoderCodingParameter[0]->getUDPPort(),true);
  
  m_apcRtpPacker->setPeriod((int)m_pcEncoderCodingParameter[0]->getMaximumFrameRate());


  if(isVerbose)
	printf("Inici go()\n");

  //===== write parameter sets =====
  
  for(i=0;i<uiNumViews;i++){
	  //printf("Iteracio: %d\n",j);
	  for( bMoreSets = true; bMoreSets;  )
	  {
		 //printf("Moresets\n");
		  
		UChar   aucParameterSetBuffer[1000];
		BinData cBinData;
		cBinData.reset();
		cBinData.set( aucParameterSetBuffer, 1000 );

		ExtBinDataAccessor cExtBinDataAccessor;
		cBinData.setMemAccessor( cExtBinDataAccessor );

		
		//Pot estar aqui el problema dels fitxers d'entrada?
			
		RNOK( m_pcH264AVCEncoder[i]      ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
		
		//bMoreSets=true;
		//RNOK( m_pcH264AVCEncoder[1]      ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );

			if( m_pcH264AVCEncoder[i]->getScalableSeiMessage()&& i==0)
				{
				//printf("getScalableSeiMessage a Moresets per a Encoder %d\n",j);
				for(j=0;j<uiNumViews;j++){
					//RNOK( m_pcWriteBitstreamToFile[i]->writePacket       ( &m_cBinDataStartCode ) );
					//RNOK( m_pcWriteBitstreamToFile[i]->writePacket       ( &cExtBinDataAccessor ) );
					uiWrittenBytes[j] += 4 + cExtBinDataAccessor.size();
				}
				xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
				/*RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &m_cBinDataStartCode ) );
				RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &cExtBinDataAccessor ) );*/
				//OutputBuffer.push_back(&cExtBinDataAccessor);
				//if(i==2){bMoreSets=false;
			
		}
		cBinData.reset();
	  }
   bMoreSets = true;
  }

  //m_pcH264AVCEncoder[1]=m_pcH264AVCEncoder[0]; //PER AIxÒ APUNTA AL MATEIX PICENCODER ??????
  if(isVerbose)
	printf("Final de bulce moreSets\n------------------------\n");

//JVT-W080, PDS SEI message
  if( m_pcEncoderCodingParameter[1]->getMVCmode() && m_pcEncoderCodingParameter[1]->getPdsEnable() ){
	  if(isVerbose)
		  printf("\nJVT-W080, PDS SEI per la view 1\n");
  }
	if( m_pcEncoderCodingParameter[0]->getMVCmode() && m_pcEncoderCodingParameter[0]->getPdsEnable() )
	{
		if(isVerbose)
			printf("JVT-W080, PDS SEI\n");
		//write SEI message
		UChar   aucParameterSetBuffer[1000];
		BinData cBinData;
		cBinData.reset();
		cBinData.set( aucParameterSetBuffer, 1000 );

		ExtBinDataAccessor cExtBinDataAccessor;
		cBinData.setMemAccessor( cExtBinDataAccessor );

		const UInt uiSPSId = 0; //currently only one SPS with SPSId = 0
		//UInt uiNumView       = m_pcEncoderCodingParameter[0]->SpsMVC.getNumViewMinus1()+1;
		UInt* num_refs_list0_anc = new UInt [uiNumViews];
		UInt* num_refs_list1_anc = new UInt [uiNumViews];
		UInt* num_refs_list0_nonanc = new UInt [uiNumViews];
		UInt* num_refs_list1_nonanc = new UInt [uiNumViews];

		for(uiView = 0; uiView < uiNumViews; uiView++ )
		{
			num_refs_list0_anc[uiView]    = m_pcEncoderCodingParameter[0]->SpsMVC.getNumAnchorRefsForListX( m_pcEncoderCodingParameter[0]->SpsMVC.getViewCodingOrder()[uiView], 0 );
			num_refs_list1_anc[uiView]    = m_pcEncoderCodingParameter[0]->SpsMVC.getNumAnchorRefsForListX( m_pcEncoderCodingParameter[0]->SpsMVC.getViewCodingOrder()[uiView], 1 );
			num_refs_list0_nonanc[uiView] = m_pcEncoderCodingParameter[0]->SpsMVC.getNumNonAnchorRefsForListX( m_pcEncoderCodingParameter[0]->SpsMVC.getViewCodingOrder()[uiView], 0 );
			num_refs_list1_nonanc[uiView] = m_pcEncoderCodingParameter[0]->SpsMVC.getNumNonAnchorRefsForListX( m_pcEncoderCodingParameter[0]->SpsMVC.getViewCodingOrder()[uiView], 1 );		  
		}
//#define HELP_INFOR
#ifdef  HELP_INFOR
		printf("\n");
		for( UInt i = 0; i < uiNumView; i++ )
		{
			printf(" num_refs_list0_anchor: %d\tnum_refs_list0_nonanchor: %d\n num_refs_list1_anchor: %d\tnum_refs_list1_nonanchor: %d\n", num_refs_list0_anc[i], num_refs_list1_anc[i], num_refs_list0_nonanc[i], num_refs_list1_nonanc[i] );
		}
#endif

		UInt uiInitialPDIDelayAnc = m_pcEncoderCodingParameter[0]->getPdsInitialDelayAnc();
		UInt uiInitialPDIDelayNonAnc = m_pcEncoderCodingParameter[0]->getPdsInitialDelayNonAnc();

		if( uiInitialPDIDelayAnc < 2 )
			uiInitialPDIDelayAnc  = 2;
		if( uiInitialPDIDelayNonAnc < 2 )
			uiInitialPDIDelayNonAnc  = 2;

		for(uiView = 0; uiView < uiNumViews; uiView++ )
		{	
			if(isVerbose)
				printf("writePDSSEIMessage for view [%d]\n",uiView);
			
			RNOK( m_pcH264AVCEncoder[uiView]->writePDSSEIMessage( &cExtBinDataAccessor
			                                           , uiSPSId
			                                           , uiNumViews
			                                           , num_refs_list0_anc
																								 , num_refs_list1_anc
			                                           , num_refs_list0_nonanc
																								 , num_refs_list1_nonanc
																								 , uiInitialPDIDelayAnc
																								 , uiInitialPDIDelayNonAnc
																								) 
			);
		}

		delete[] num_refs_list0_anc;
		delete[] num_refs_list1_anc;
		delete[] num_refs_list0_nonanc;
		delete[] num_refs_list1_nonanc;
		num_refs_list0_anc = NULL;
		num_refs_list1_anc = NULL;
		num_refs_list0_nonanc = NULL;
		num_refs_list1_nonanc = NULL;
	  
		if( m_pcEncoderCodingParameter[0]->getCurentViewId() == m_pcEncoderCodingParameter[0]->SpsMVC.m_uiViewCodingOrder[0] )
		{

			if(isVerbose)
				printf("m_pcEncoderCodingParameter[0]->getCurentViewId() == m_pcEncoderCodingParameter[0]->SpsMVC.m_uiViewCodingOrder[0]\n");
			
			for(uiView=0;uiView<uiNumViews;uiView++){
				//RNOK( m_pcWriteBitstreamToFile[i]->writePacket       ( &m_cBinDataStartCode ) );
				//RNOK( m_pcWriteBitstreamToFile[i]->writePacket       ( &cExtBinDataAccessor ) );
				uiWrittenBytes[uiView] += 4 + cExtBinDataAccessor.size();
			}
			xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
			//RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &m_cBinDataStartCode ) );
			//RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &cExtBinDataAccessor ) );
			//OutputBuffer.push_back(&cExtBinDataAccessor);
				
			
		}

		cBinData.reset();
	}
//~JVT-W080
  //SEI {
	if( m_pcEncoderCodingParameter[1]->getMultiviewSceneInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview scene information sei message
	  if(isVerbose)
		  printf("getMultiviewSceneInfoSEIEnable a la view 1\n");
	}
  if( m_pcEncoderCodingParameter[0]->getMultiviewSceneInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview scene information sei message
	  if(isVerbose)
		  printf("getMultiviewSceneInfoSEIEnable\n");
	  
	  UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder[0] ->writeMultiviewSceneInfoSEIMessage( &cExtBinDataAccessor ) );
	  //Hardocejat a 2, caldrà fer-ho amb NUMLayers
		for(i=0;i<uiNumViews;i++){
		  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &m_cBinDataStartCode ) );
		  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &cExtBinDataAccessor ) );
		  uiWrittenBytes[i] += 4 + cExtBinDataAccessor.size();
		}
		xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
		//RNOK( m_pcWriteBitstreamToOutput->writePacket( &m_cBinDataStartCode ) );
		//RNOK( m_pcWriteBitstreamToOutput->writePacket( &cExtBinDataAccessor ) );
		//OutputBuffer.push_back(&cExtBinDataAccessor);
	  
	  cBinData.reset();
  }

  if( m_pcEncoderCodingParameter[1]->getMultiviewAcquisitionInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview acquisition information sei message
	  if(isVerbose)
		  printf("getMultiviewAcquisitionInfoSEIEnable a la view 1\n");
  }

  if( m_pcEncoderCodingParameter[0]->getMultiviewAcquisitionInfoSEIEnable() ) // SEI JVT-W060
  {
	  // Multiview acquisition information sei message
	  if(isVerbose)
		  printf("getMultiviewAcquisitionInfoSEIEnable\n");
	  
	  UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder[0] ->writeMultiviewAcquisitionInfoSEIMessage( &cExtBinDataAccessor ) );
	  //Hardocejat a 2, caldrà fer-ho amb NUMLayers
	for(i=0;i<uiNumViews;i++){
	  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &m_cBinDataStartCode ) );
	  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &cExtBinDataAccessor ) );
	  uiWrittenBytes[i] += 4 + cExtBinDataAccessor.size();
	}
	xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
	 //RNOK( m_pcWriteBitstreamToOutput->writePacket( &m_cBinDataStartCode ) );
	 //RNOK( m_pcWriteBitstreamToOutput->writePacket( &cExtBinDataAccessor ) );
	 //OutputBuffer.push_back(&cExtBinDataAccessor);
	  
	  
	  cBinData.reset();
  }

  if( m_pcEncoderCodingParameter[1]->getNestingSEIEnable() && m_pcEncoderCodingParameter[1]->getSnapshotEnable() 
	  && m_pcEncoderCodingParameter[1]->getCurentViewId() == 0 )
  {
   // add nesting sei message for view0
	  if(isVerbose)
		  printf("getNestingSEIEnable a la view 1\n");
  }

  if( m_pcEncoderCodingParameter[0]->getNestingSEIEnable() && m_pcEncoderCodingParameter[0]->getSnapshotEnable() 
	  && m_pcEncoderCodingParameter[0]->getCurentViewId() == 0 )
  {
   // add nesting sei message for view0
	 if(isVerbose)
		 printf("getNestingSEIEnable\n");
      UChar aucParameterSetBuffer[1000];
      BinData cBinData;
      cBinData.reset();
      cBinData.set( aucParameterSetBuffer, 1000 );
      ExtBinDataAccessor cExtBinDataAccessor;
      cBinData.setMemAccessor( cExtBinDataAccessor );
	  RNOK( m_pcH264AVCEncoder[0] ->writeNestingSEIMessage( &cExtBinDataAccessor ) );
	  //Hardocejat a 2, caldrà fer-ho amb NUMLayers
	for(i=0;i<uiNumViews;i++){
	  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &m_cBinDataStartCode ) );
	  //RNOK( m_pcWriteBitstreamToFile[i]->writePacket( &cExtBinDataAccessor ) );
	  uiWrittenBytes[i] += 4 + cExtBinDataAccessor.size();
	}
	xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
	//RNOK( m_pcWriteBitstreamToOutput->writePacket( &m_cBinDataStartCode ) );
	//RNOK( m_pcWriteBitstreamToOutput->writePacket( &cExtBinDataAccessor ) );
	//OutputBuffer.push_back(&cExtBinDataAccessor);
	  
	  cBinData.reset();
  }
//SEI }

  //===== determine parameters for required frame buffers =====
  for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
  {
    //auiMbX        [uiLayer] = m_pcEncoderCodingParameter[0]->getLayerParameters( uiLayer ).getFrameWidth () >> 4;
    //auiMbY        [uiLayer] = m_pcEncoderCodingParameter[0]->getLayerParameters( uiLayer ).getFrameHeight() >> 4;
    auiMbX        [uiLayer] = m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getFrameWidthInMbs();
    auiMbY        [uiLayer] = m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getFrameHeightInMbs();
    m_aauiCropping[uiLayer][0]     = 0;
    m_aauiCropping[uiLayer][1]     = m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getHorPadding      ();
    m_aauiCropping[uiLayer][2]     = 0;
    m_aauiCropping[uiLayer][3]     = m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getVerPadding      ();
    
	if(!m_pcEncoderCodingParameter[uiLayer]->isParallel()){
		m_apcWriteYuv[uiLayer]->setCrop(m_aauiCropping[uiLayer]);
	}

    UInt  uiSize            = ((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN);
    auiPicSize    [uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)*((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*3/2;
    m_auiLumOffset[uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)* YUV_Y_MARGIN   + YUV_X_MARGIN;  
    m_auiCbOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+  YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + uiSize; 
    m_auiCrOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+  YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + 5*uiSize/4;
    m_auiHeight   [uiLayer] =   auiMbY[uiLayer]<<4;
    m_auiWidth    [uiLayer] =   auiMbX[uiLayer]<<4;
    m_auiStride   [uiLayer] =  (auiMbX[uiLayer]<<4)+ 2*YUV_X_MARGIN;

	//printf("Dades dels parametres del Layer %d: auiMbX=%d auiMbY=%d\n",uiLayer,auiMbX,auiMbY);
  }

 
  

  //
  //Auqui ja pot anar la primera escriptura a oputput.264
  //

  //===== loop over frames =====
  printf("\n---------------------\nPreparation of the Encoder is finsihed. Let's start with the encoding.\n---------------------\n");
  printf("Total Frames: %d\n---------------------\n\n",uiMaxFrame);
system("pause");
printf("\n");

 // boost::thread workerThread(&H264AVCEncoderTest::xProcessingThread);
 // boost::thread workerThread(&xProcessingThread);

  //workerThread.join();

  //start(0,uiFrame,uiMaxFrame,uiLayer,auiPicSize[uiLayer],uiWrittenBytes[uiLayer],7,8);
  //start(1);
  //join(0);
  //join(1);

    for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
    {
		if(isVerbose)
			printf("Prova de processar la view %d en una funcio a part.\n",uiLayer);
		
		xSetProcessingInfo(uiFrame,uiMaxFrame,uiLayer);
		processView(m_apcProcessingInfo,auiPicSize[uiLayer],uiWrittenBytes[uiLayer],cOutExtBinDataAccessorList[uiLayer],apcOriginalPicBuffer[uiLayer],apcReconstructPicBuffer[uiLayer],acPicBufferOutputList[uiLayer],acPicBufferUnusedList[uiLayer]);
		
		//system("pause");
	  }

	//printf("pause");
	join();
	

	if(isVerbose){
		printf("Han acabat els dos threads\n ");
		printf("pause");
	}
  
//Tot això va dins del thread processView()
 // for( uiFrame = 0; uiFrame < uiMaxFrame; uiFrame++ )
 // {
	//  m_apcRtpPacker->increaseTimeStamp();
	//  printf("\nFrame: %d\n",uiFrame);
	//   //system("pause");
	//  
 //   //===== get picture buffers and read original pictures =====
 //   for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
 //   {
	//	//if(uiFrame>=3||uiLayer==0){ //La condició uiFrame>2 hem de deshardcodejar-ho per RecPicBuffer->uiMaxFramesInDPB
	//		//printf("\n\n//////////\nFIns a la frame 2 no imprimirem la Layer %d\n///////////\n\n",uiLayer);
	//	
	//	
	//		  UInt  uiSkip = ( 1 << m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( 0 ).getTemporalResolution() );
	//		  //UInt  uiSkip = ( 1 << m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getTemporalResolution() );
	//		  
	//		  //
	//		  //LLEGIM EL FRAME uiFrame PER LA VISTA uiLayer
	//		  //

	//		  if( uiFrame % uiSkip == 0 )
	//		  {
	//			RNOK( xGetNewPicBuffer( apcReconstructPicBuffer [uiLayer], uiLayer, auiPicSize[uiLayer] ) );
	//			RNOK( xGetNewPicBuffer( apcOriginalPicBuffer    [uiLayer], uiLayer, auiPicSize[uiLayer] ) );
	//			
	//			//printf("Reading Layer %d of frame %d\n",uiLayer,uiFrame);
	//			//m_apcReadYuv[uiLayer]->m_cFile.tell();
	//			RNOK( m_apcReadYuv[uiLayer]->readFrame( *apcOriginalPicBuffer[uiLayer] + m_auiLumOffset[uiLayer],
	//													*apcOriginalPicBuffer[uiLayer] + m_auiCbOffset [uiLayer],
	//													*apcOriginalPicBuffer[uiLayer] + m_auiCrOffset [uiLayer],
	//													m_auiHeight [uiLayer],
	//													m_auiWidth  [uiLayer],
	//													m_auiStride [uiLayer] ) );

	//			//printf("Frame %d, Layer %d, tamany original:%s\n",uiFrame,uiLayer,apcOriginalPicBuffer[uiLayer]);
	//			
	//		  }
	//		  else
	//		  {
	//			if(isVerbose)
	//				printf("Hi ha Hagut un SKIP a la part de readFrame()\n");

	//			apcReconstructPicBuffer [uiLayer] = 0;
	//			apcOriginalPicBuffer    [uiLayer] = 0;		
	//		  }
	//		  

	//		  //
	//		  //PROCESSEM EL FRAME uiFrame PER LA VISTA uiLayer
	//		  //

	//		  if(isVerbose)
	//			  printf("View %d\t",uiLayer);

	//		   RNOK( m_pcH264AVCEncoder[uiLayer]->process( cOutExtBinDataAccessorList[uiLayer],
	//										   apcOriginalPicBuffer[uiLayer],
	//										   apcReconstructPicBuffer[uiLayer],
	//										   &acPicBufferOutputList[uiLayer],
	//										   &acPicBufferUnusedList[uiLayer] ) );


	//		   //
	//		   //ESCRIVIM EL FRAME uiFrame PER LA VISTA uiLayer A DIFERENTS ARXIUS I BUFFERS(OUTPUT, REC, ETC...)
	//		   //

	//			//printf("Writing layer %d frame %d\n",uiLayer,uiFrame);
	//			UInt  uiBytesUsed = 0;
	//			if(m_pcEncoderCodingParameter[0]->isDebug()){
	//				if(isVerbose)
	//					printf("Write per debug\n");				
	//				RNOK( xWrite  ( cOutExtBinDataAccessorList[uiLayer],uiBytesUsed) );
	//			}
	//			else{
	//				RNOK(xSend(cOutExtBinDataAccessorList[uiLayer]));
	//				
	//			}
	//			
	//			//m_apcUDPController->send("Test");
	//			
	//					
	//			uiWrittenBytes[uiLayer]   += uiBytesUsed;

	//		  
	//			//printf("Releasing layer %d frame %d\n",uiLayer,uiFrame);

	//			
	//			//S'Omple els fitxers c:/inputs/rec_X.yuv
	//			if(!m_pcEncoderCodingParameter[0]->isParallel()){
	//				printf("Write per No Parallel\n");
	//				RNOK( xWrite  ( acPicBufferOutputList[uiLayer], uiLayer ) );
	//			}
	//			else
	//			{
	//				RNOK( xRelease( acPicBufferOutputList[uiLayer], uiLayer ) );
	//			}
	//			//printf("Fem el xRelease del view %d\n",uiLayer);
	//			RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
	//			//printf("Tamany del Buffer de REC[%d]=%d\n",uiLayer,acPicBufferOutputList[uiLayer].size());
	//			
	//	//}//endif
	//	
	//	
	//		
	//}//endfor vista

	//		//
	//		//Després de processar dues vistes. Augmentem el Timestamp
	//		//

	//
	//
	//	
 // }//endfor frame


  //escriure a output al final de tot
  //while(LayerBuffer[0].size()&&LayerBuffer[1].size())
  //{
	 // for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
	 // {
		//  
	 // }
  //}
	
  //Comparem tamany del buffer de Output

  if(isVerbose){
	  printf("Tamany del Buffer de REC[0]=%d\n",acPicBufferOutputList[0].size());
	  printf("Tamany del Buffer de REC[1]=%d\n",uiLayer,acPicBufferOutputList[1].size());
	  printf("Tamany del Buffer de acPicBufferUnusedList[0]=%d\n",acPicBufferUnusedList[0].size());
	  printf("Tamany del Buffer de acPicBufferUnusedList[1]=%d\n\n",acPicBufferUnusedList[1].size());
  }

    //Enviar missatge de final de Transmissió
  /*printf("Enviem el final de Transmissió\n");
  
  m_apcRtpPacker->endTransmission();*/

  //===== finish encoding =====
  for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
  {
	  UInt  uiNumCodedFrames = 0;
	  Double  dHighestLayerOutputRate = 0.0;
	  if(isVerbose)
		  printf("Finishing encoding view %d\n",uiLayer);

	  RNOK( m_pcH264AVCEncoder[uiLayer]->finish( cOutExtBinDataAccessorList[uiLayer],
										acPicBufferOutputList,
										acPicBufferUnusedList,
										uiNumCodedFrames,
										dHighestLayerOutputRate ) );


	  //===== write and release NAL unit buffers =====
	  if(m_pcEncoderCodingParameter[0]->isDebug()){
		  RNOK( xWrite  ( cOutExtBinDataAccessorList[uiLayer], uiWrittenBytes[uiLayer]) );
	  }
	  else{
		  RNOK(xSend(cOutExtBinDataAccessorList[uiLayer]));
	  }

  

  }

 
  


  //printf("Tamany del Buffer de REC[0]=%d\n",acPicBufferOutputList[0].size());
  //printf("Tamany del Buffer de REC[1]=%d\n",acPicBufferOutputList[1].size());
  //printf("Tamany del Buffer de acPicBufferUnusedList[0]=%d\n",acPicBufferUnusedList[0].size());
  //printf("Tamany del Buffer de acPicBufferUnusedList[1]=%d\n",acPicBufferUnusedList[1].size());

  for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ )
  {
	  if(isVerbose)
		  printf("Release dels auxiliars\n");
	//printf("Tamany del Buffer de REC[%d]=%d\n",uiLayer,acPicBufferOutputList[uiLayer].size());

	//printf("Releasing Oputput and Unused Buffers for view %d\n",uiLayer);
    if(!m_pcEncoderCodingParameter[0]->isParallel()){
		RNOK( xWrite  ( acPicBufferOutputList[uiLayer], uiLayer ) );
		//printf("xWrite fet\n");
	}
	
	//printf("Tamany del Buffer de acPicBufferUnusedList[%d]=%d\n",uiLayer,acPicBufferUnusedList[uiLayer].size());
    RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
	if(isVerbose)
		printf("xRelease[%d] fet\n",uiLayer);
  }

  //printf("Set parameters");
  //===== set parameters and output summary =====
  m_cEncoderIoParameter.nFrames = uiFrame;
  m_cEncoderIoParameter.nResult = 0;

  for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ ){
	  if(isVerbose)
		  printf("Segon bucle\n");
	if( ! m_pcEncoderCodingParameter[uiLayer]->getMVCmode() )
	{
		if(isVerbose)
			printf("Entrem al bucle\n");
		//printf("m_pcEncoderCodingParameter[uiLayer]->getMVCmode()\n");
		UChar   aucParameterSetBuffer[1000];
		BinData cBinData;
		cBinData.reset();
		cBinData.set( aucParameterSetBuffer, 1000 );

		ExtBinDataAccessor cExtBinDataAccessor;
		cBinData.setMemAccessor( cExtBinDataAccessor );
		m_pcH264AVCEncoder[uiLayer]->SetVeryFirstCall();
		RNOK( m_pcH264AVCEncoder[uiLayer]      ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
		//Hardocejat a 2, caldrà fer-ho amb NUMLayers
		
		for(i = 0; i < uiNumViews; i++){
			//RNOK( m_pcWriteBitstreamToFile[uiLayer]->writePacket       ( &m_cBinDataStartCode ) );
			//RNOK( m_pcWriteBitstreamToFile[uiLayer]->writePacket       ( &cExtBinDataAccessor ) );
			uiWrittenBytes[i] += 4 + cExtBinDataAccessor.size();
		}
		
		xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
		//RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &m_cBinDataStartCode ) );
		//RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &cExtBinDataAccessor ) );
	
		cBinData.reset();
	}
  }
//SEI {
  for( uiLayer = 0; uiLayer < uiNumViews; uiLayer++ ){
	    
	  if( m_pcEncoderCodingParameter[uiLayer]->getViewScalInfoSEIEnable() )
	  {
		  
		 //printf("m_pcEncoderCodingParameter[uiLayer]->getViewScalInfoSEIEnable()\n");
		//view scalability information sei message
		 UChar   aucParameterSetBuffer[1000];
		 BinData cBinData;
		 cBinData.reset();
		 cBinData.set( aucParameterSetBuffer, 1000 );

		 ExtBinDataAccessor cExtBinDataAccessor;
		 cBinData.setMemAccessor( cExtBinDataAccessor );
		 RNOK( m_pcH264AVCEncoder[uiLayer]->writeViewScalInfoSEIMessage( &cExtBinDataAccessor ) );
		 //Hardocejat a 2, caldrà fer-ho amb NUMLayers
		for(i = 0; i < uiNumViews; i++){
		 //RNOK( m_pcWriteBitstreamToFile[uiLayer]->writePacket       ( &m_cBinDataStartCode ) );
		 //RNOK( m_pcWriteBitstreamToFile[uiLayer]->writePacket       ( &cExtBinDataAccessor ) );
		 uiWrittenBytes[i] += 4 + cExtBinDataAccessor.size();
		}
		xWriteInit(cExtBinDataAccessor,m_pcEncoderCodingParameter[0]->isDebug());
		 //RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &m_cBinDataStartCode ) );
		 //RNOK( m_pcWriteBitstreamToOutput->writePacket       ( &cExtBinDataAccessor ) );
		 
		 cBinData.reset();

	  }
  }
//SEI }
  
  if( m_pcEncoderCodingParameter[0]->isDebug() )
  {
	   
	 //printf("m_pcWriteBitstreamToOutput\n");
    /*RNOK( m_pcWriteBitstreamToFile[0]->uninit() );  
    RNOK( m_pcWriteBitstreamToFile[0]->destroy() );
	RNOK( m_pcWriteBitstreamToFile[1]->uninit() );  
    RNOK( m_pcWriteBitstreamToFile[1]->destroy() );*/
	RNOK( m_pcWriteBitstreamToOutput->uninit() );  
	//printf("m_pcWriteBitstreamToOutput-uninit()\n");
    RNOK( m_pcWriteBitstreamToOutput->destroy() );
	//printf("m_pcWriteBitstreamToOutput-destroy()\n");
  }

//SEI {
  if(isVerbose)
	  printf("Check m_pcEncoderCodingParameter[0]->getViewScalInfoSEIEnable()\n");
  
  if( m_pcEncoderCodingParameter[0]->getViewScalInfoSEIEnable() )
  {
	    if(isVerbose)
			printf("ViewScalableDealing\n");
	  //printf("m_pcEncoderCodingParameter[0]->getViewScalInfoSEIEnable()\n");
    RNOK    ( ViewScalableDealing() );
  }
//SEI }
   if(isVerbose)
	   printf("Check m_pcEncoderCodingParameter[0]->getMVCmode()\n");
  if( ! m_pcEncoderCodingParameter[0]->getMVCmode() )
  {
	  
	  if(isVerbose)
		  printf("ScalableDealing\n");
	  //printf("m_pcEncoderCodingParameter[0]->getMVCmode()\n");
	RNOK	( ScalableDealing() );
  }

  //==== TAncar Assemlber =====
	//RNOKR( pcAssembler->destroy (),               -6 );



if(!m_pcEncoderCodingParameter[0]->isDebug())
	m_apcRtpPacker->destroy();


  return Err::m_nOK;
}
Ejemplo n.º 15
0
void
H264AVCEncoderTest::xProcessView(processingInfo	auiProcessingInfo,UInt auiPicSize, UInt uiWrittenBytes, ExtBinDataAccessorList cOutExtBinDataAccessorList, PicBuffer* apcOriginalPicBuffer, PicBuffer* apcReconstructPicBuffer, PicBufferList acPicBufferOutputList, PicBufferList acPicBufferUnusedList){

	//system("pause");
	if(isVerbose)
		printf("Frame: %d\nMaxFrames: %d\n,View: %d\n",auiProcessingInfo.nFrame,auiProcessingInfo.nMaxFrames,auiProcessingInfo.nView);
	
	for( auiProcessingInfo.nFrame = 0; auiProcessingInfo.nFrame < auiProcessingInfo.nMaxFrames; auiProcessingInfo.nFrame++ )
  {
	  //m_apcRtpPacker->increaseTimeStamp();

	  if(isVerbose)
		printf("\nFrame: %d\n",auiProcessingInfo.nFrame);
	   //system("pause");
	  
		
	  UInt  uiSkip = ( 1 << m_pcEncoderCodingParameter[auiProcessingInfo.nView]->getLayerParameters( 0 ).getTemporalResolution() );
			  //UInt  uiSkip = ( 1 << m_pcEncoderCodingParameter[uiLayer]->getLayerParameters( uiLayer ).getTemporalResolution() );
			  
			  //
			  //LLEGIM EL FRAME uiFrame PER LA VISTA uiLayer
			  //

	  if( auiProcessingInfo.nFrame % uiSkip == 0 )
			  {
				  xGetNewPicBuffer( apcReconstructPicBuffer , auiProcessingInfo.nView, auiPicSize );
				  xGetNewPicBuffer( apcOriginalPicBuffer   , auiProcessingInfo.nView, auiPicSize ) ;
				
				//printf("Reading Layer %d of frame %d\n",uiLayer,uiFrame);
				//m_apcReadYuv[uiLayer]->m_cFile.tell();
				m_apcReadYuv[auiProcessingInfo.nView]->readFrame( *apcOriginalPicBuffer + m_auiLumOffset[auiProcessingInfo.nView],
														*apcOriginalPicBuffer + m_auiCbOffset[auiProcessingInfo.nView],
														*apcOriginalPicBuffer + m_auiCrOffset[auiProcessingInfo.nView],
														m_auiHeight[auiProcessingInfo.nView] ,
														m_auiWidth[auiProcessingInfo.nView]  ,
														m_auiStride[auiProcessingInfo.nView] ) ;

				//printf("Frame %d, Layer %d, tamany original:%s\n",uiFrame,uiLayer,apcOriginalPicBuffer[uiLayer]);
				
			  }
			  else
			  {
				if(isVerbose)
					printf("Hi ha Hagut un SKIP a la part de readFrame()\n");

				apcReconstructPicBuffer  = 0;
				apcOriginalPicBuffer   = 0;		
			  }
			  

			  //
			  //PROCESSEM EL FRAME uiFrame PER LA VISTA uiLayer
			  //

			  if(isVerbose)
				  printf("View %d\t",auiProcessingInfo.nView);

			   m_pcH264AVCEncoder[auiProcessingInfo.nView]->process( cOutExtBinDataAccessorList,
											   apcOriginalPicBuffer,
											   apcReconstructPicBuffer,
											   &acPicBufferOutputList,
											   &acPicBufferUnusedList ) ;


			   //
			   //ESCRIVIM EL FRAME uiFrame PER LA VISTA uiLayer A DIFERENTS ARXIUS I BUFFERS(OUTPUT, REC, ETC...)
			   //

				//printf("Writing layer %d frame %d\n",uiLayer,uiFrame);
				UInt  uiBytesUsed = 0;
				if(m_pcEncoderCodingParameter[0]->isDebug()){
					if(isVerbose)
						printf("Write per debug\n");				
					xWrite  ( cOutExtBinDataAccessorList,uiBytesUsed) ;
				}
				else{
					{
						boost::mutex::scoped_lock io_lock(io_mutex);
						if(isVerbose)
							printf("View %d bloqueja el RtpPacker\n",auiProcessingInfo.nView);
					}
					//xSend(cOutExtBinDataAccessorList);

					if(!auiProcessingInfo.nView) //Si és la view 0, augmentem el timestamps
						m_apcRtpPacker->increaseTimeStamp();

					/*printf("Enviem tot NAL+data\n");
					system("pause");*/

					xAskForSend(cOutExtBinDataAccessorList,auiProcessingInfo.nView,auiProcessingInfo.nFrame);
					
				}
				
				//m_apcUDPController->send("Test");
				
						
				uiWrittenBytes  += uiBytesUsed;

			  
				//printf("Releasing layer %d frame %d\n",uiLayer,uiFrame);

				
				//S'Omple els fitxers c:/inputs/rec_X.yuv
				if(!m_pcEncoderCodingParameter[0]->isParallel()){
					printf("Write per No Parallel\n");
					xWrite  ( acPicBufferOutputList, auiProcessingInfo.nView ) ;
				}
				else
				{
					xRelease( acPicBufferOutputList, auiProcessingInfo.nView ) ;
				}
				//printf("Fem el xRelease del view %d\n",uiLayer);
				xRelease( acPicBufferUnusedList, auiProcessingInfo.nView ) ;
				//printf("Tamany del Buffer de REC[%d]=%d\n",uiLayer,acPicBufferOutputList[uiLayer].size());
				
		//}//endif
		

		
  }//endfor frame

}
Ejemplo n.º 16
0
void CRedirectHTTP_Thread::StartRedirect()
{	m_sServerSocket=INVALID_SOCKET; m_iConnections=0;
	int iErr=1; bool bFinished=false; while(!bFinished) {
		url uURL; char szBuffer[MAX_PATH]; bool bGet=false;

		// Receive the proxy request
		if(!recv_line_irc(m_sClientSocket, szBuffer, MAX_PATH, NULL)) { bFinished=true; break; }
		CString sBuffer(szBuffer);
		// Fail if there is no url
		// if(!sBuffer.Token(1, " ").Compare("")) { bFinished=true; break; }

		if(!sBuffer.Compare("")) { bFinished=true; break; }

		if(!sBuffer.Token(0, " ").CompareNoCase("GET")) { // GET method
			bGet=true;
			// Parse the url
			if(!ParseURL(sBuffer.Token(1, " ").CStr(), &uURL)) { bFinished=true; break; }
			// Fail if the protocol isnt http
			if(uURL.sProto.Compare("http")) { bFinished=true; break; }
		} else if(!sBuffer.Token(0, " ").CompareNoCase("CONNECT")) { // CONNECT method
			bGet=false;
			// Parse the host
			uURL.sProto.Assign("connect");
			uURL.sReq.Assign("");
			uURL.sHost.Assign(sBuffer.Token(1, " ").Token(0, ":"));
			if(!sBuffer.Token(1, " ").Token(1, ":").CStr()) { bFinished=true; break; }
			uURL.iPort=atoi(sBuffer.Token(1, " ").Token(1, ":").CStr());
			if(!uURL.iPort) uURL.iPort=80; }

		// Get the rest of the request
		CString sMethod(sBuffer.Token(0, " ")); if(!sMethod.Compare("")) { bFinished=true; break; }
		CString sHTTPVer(sBuffer.Token(2, " ")); if(!sHTTPVer.Compare("")) { bFinished=true; break; }
		CString sOldHost(uURL.sHost);

#ifdef DBGCONSOLE
		if(bGet)
			g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s %s %s...\n", m_pRedirHTTP, sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr());
		else
			g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s %s:%d %s...\n", m_pRedirHTTP, sMethod.CStr(), uURL.sHost.CStr(), uURL.iPort, sHTTPVer.CStr());
#endif

		char szBuf[4096]; strcpy(szBuf, "bla");
		if(bGet) {
			if(xRead(m_sClientSocket, szBuf, sizeof(szBuf))<1)
			{	xClose(m_sClientSocket); return; }
		} else {
			while(strcmp(szBuf, "")) // Loop while headers arent finished
				if(!recv_line_irc(m_sClientSocket, szBuf, 4096, NULL)) { bFinished=true; break; }
			if(bFinished) break; }

		CString sReqBuf;
		if(bGet)
			sReqBuf.Format("%s %s %s\r\n%s", sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr(), szBuf);
		else
			sReqBuf.Format("HTTP/1.0 200 Connection established\r\n\r\n");

		m_sServerSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
		if(m_sServerSocket==SOCKET_ERROR || m_sServerSocket==INVALID_SOCKET)
		{	xClose(m_sClientSocket); return; }

		// Fill in sockaddr and resolve the host
		sockaddr_in ssin; memset(&ssin, 0, sizeof(ssin));
		ssin.sin_family=AF_INET; ssin.sin_port=htons(uURL.iPort);
		ssin.sin_addr.s_addr=ResolveAddress(uURL.sHost.CStr());
		if(ssin.sin_addr.s_addr==INADDR_NONE) // The host couldn't be resolved, exit
		{
#ifdef DBGCONSOLE
			g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s could not be resolved (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.sReq.CStr());
#endif
			xClose(m_sClientSocket); xClose(m_sServerSocket); return; }

		// Connect to the server
		iErr=connect(m_sServerSocket, (sockaddr*)&ssin, sizeof(sockaddr_in));
		if(iErr==SOCKET_ERROR) // Connect failed, exit
		{	
#ifdef DBGCONSOLE
			g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): Cannot connect to %s:%d (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.iPort, uURL.sReq.CStr());
#endif
			xClose(m_sClientSocket); xClose(m_sServerSocket); return; }

		if(bGet) {
			iErr=xWrite(m_sServerSocket, sReqBuf.CStr(), sReqBuf.GetLength());
			if(!iErr || iErr==SOCKET_ERROR) { xClose(m_sClientSocket); xClose(m_sServerSocket); return; }
		} else {
			iErr=xWrite(m_sClientSocket, sReqBuf.CStr(), sReqBuf.GetLength());
			if(!iErr || iErr==SOCKET_ERROR) { xClose(m_sClientSocket); xClose(m_sServerSocket); return; }
		}

		int iLen; fd_set fd;
		SET_SOCK_BLOCK(m_sClientSocket, 0); SET_SOCK_BLOCK(m_sServerSocket, 0);

		if(bGet) {
			while(true)
			{	memset(szBuffer, 0, sizeof(szBuffer));
				if(!recv_line_irc(m_sClientSocket, szBuffer, sizeof(szBuffer), NULL)) { Sleep(10); break; }
				if(strcmp(szBuffer, "")) {
					sBuffer.Assign(szBuffer);
					if(!sBuffer.Token(0, " ").Compare("GET"))
					{	// Fail if there is no url
						if(!sBuffer.Token(1, " ").Compare("")) { bFinished=true; break; }
						// Parse the url
						if(!ParseURL(sBuffer.Token(1, " ").CStr(), &uURL)) break;
						// Fail if the protocol isnt http
						if(uURL.sProto.Compare("http")) { bFinished=true; break; }
						// Get the rest of the request
						CString sMethod(sBuffer.Token(0, " ")); if(!sMethod.Compare("")) { bFinished=true; break; }
						CString sHTTPVer(sBuffer.Token(2, " ")); if(!sHTTPVer.Compare("")) { bFinished=true; break; }
						sBuffer.Format("%s %s %s\r\n", sMethod.CStr(), uURL.sReq.CStr(), sHTTPVer.CStr());
						if(uURL.sHost.Compare(sOldHost))
						{	xClose(m_sServerSocket);
							m_sServerSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
							if(m_sServerSocket==SOCKET_ERROR || m_sServerSocket==INVALID_SOCKET)
							{	xClose(m_sClientSocket); return; }
							
							// Fill in sockaddr and resolve the host
							sockaddr_in ssin; memset(&ssin, 0, sizeof(ssin));
							ssin.sin_family=AF_INET; ssin.sin_port=htons(uURL.iPort);
							ssin.sin_addr.s_addr=ResolveAddress(uURL.sHost.CStr());
							if(ssin.sin_addr.s_addr==INADDR_NONE) // The host couldn't be resolved, exit
							{
#ifdef DBGCONSOLE
								g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): %s could not be resolved (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.sReq.CStr());
#endif
								xClose(m_sClientSocket); xClose(m_sServerSocket); return; }

							// Connect to the server
							iErr=connect(m_sServerSocket, (sockaddr*)&ssin, sizeof(sockaddr_in));
							if(iErr==SOCKET_ERROR) // Connect failed, exit
							{	
#ifdef DBGCONSOLE
								g_cMainCtrl.m_cConsDbg.Log(5, "CRedirectHTTP(0x%8.8Xh): Cannot connect to %s:%d (%s)...\n", m_pRedirHTTP, uURL.sHost.CStr(), uURL.iPort, uURL.sReq.CStr());
#endif
								xClose(m_sClientSocket); xClose(m_sServerSocket); return; }
							
							sOldHost.Assign(uURL.sHost); }
					}
					else
					{	sBuffer.Append("\r\n"); }
				if(xWrite(m_sServerSocket, sBuffer.CStr(), sBuffer.GetLength())<1) break; }

				iLen=xRead(m_sServerSocket, szBuf, sizeof(szBuf));
				if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; }
				xWrite(m_sClientSocket, szBuf, iLen);
			}
		} else {
			while(true) {
				iLen=xRead(m_sClientSocket, szBuf, sizeof(szBuf));
				if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; }
				xWrite(m_sServerSocket, szBuf, iLen);

				iLen=xRead(m_sServerSocket, szBuf, sizeof(szBuf));
				if(!iLen) break; if(iLen<0 && ERRNO!=EWOULDBLOCK) { Sleep(10); break; }
				xWrite(m_sClientSocket, szBuf, iLen);
			}
		}

		xClose(m_sClientSocket); xClose(m_sServerSocket);
		bFinished=true;
	}
}