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; } }
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()); }
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; } }
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; }
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; }
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; }
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; }
__fi void xWrite64( u64 val ) { xWrite( val ); }
__fi void xWrite32( u32 val ) { xWrite( val ); }
__fi void xWrite16( u16 val ) { xWrite( val ); }
__fi void xWrite8( u8 val ) { xWrite( val ); }
// 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 }
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; }
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; }
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 }
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; } }