📄 sptenc.cpp
字号:
if (m_volmd.fAUsage == RECTANGLE) {// m_rctCurrVOPY = CRct (0, 0, iSessionWidthRound, iSessionHeightRound); m_pvopcOrig->setBoundRct (m_rctCurrVOPY); m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); m_rctRefVOPY0 = m_rctCurrVOPY; m_rctRefVOPY0.expand (EXPANDY_REFVOP); m_rctRefVOPUV0 = m_rctRefVOPY0.downSampleBy2 (); m_rctRefVOPY1 = m_rctRefVOPY0; m_rctRefVOPUV1 = m_rctRefVOPUV0; m_rctRefVOPZoom0 = m_rctRefVOPY0.upSampleBy2 (); m_rctRefVOPZoom1 = m_rctRefVOPY1.upSampleBy2 (); m_pvopcRefOrig0->setBoundRct (m_rctRefVOPY0); m_pvopcRefOrig1->setBoundRct (m_rctRefVOPY1); computeVOLConstMembers (); // these VOP members are the same for all frames } m_tPiece = -1; encode (TRUE, -1, IVOP); m_pvopcSptQ = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctSptQ); VOPOverlay(*m_pvopcRefQ1, *m_pvopcSptQ, 1); delete m_pvopcSptP; m_pvopcSptP = NULL; delete m_pvopcOrig; m_pvopcOrig = NULL; delete m_pvopcRefQ0; m_pvopcRefQ0 = NULL; delete m_pvopcRefQ1; m_pvopcRefQ1 = m_pvopcSptQ ; // to support "rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); " m_iNumMBX = m_rctSptExp.width / MB_SIZE; m_iNumMBY = m_rctSptExp.height () / MB_SIZE; CMBMode* pmbmd = m_rgmbmdRef; IntraPredDirection* Spreddir; IntraPredDirection* preddir; // initialize MB hole status array Int iMB_left = (rctRefFrameY.left - m_rctSptExp.left) / MB_SIZE; Int iMB_right = (rctRefFrameY.right - m_rctSptExp.left) / MB_SIZE; Int iMB_top = (rctRefFrameY.top - m_rctSptExp.top) / MB_SIZE; Int iMB_bottom = (rctRefFrameY.bottom - m_rctSptExp.top) / MB_SIZE; for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) { if ((iMBX >= iMB_left && iMBX < iMB_right) && (iMBY >= iMB_top && iMBY < iMB_bottom)) { m_ppPieceMBstatus[iMBY][iMBX] = PIECE_DONE; m_rgmbmdSpt[iMBY][iMBX] = CMBMode (*pmbmd); Spreddir = m_rgmbmdSpt[iMBY][iMBX].m_preddir; preddir = (*pmbmd).m_preddir; memcpy (Spreddir, preddir, 10 * sizeof (IntraPredDirection)); pmbmd++; } else m_ppPieceMBstatus[iMBY][iMBX] = NOT_DONE; m_ppUpdateMBstatus[iMBY][iMBX] = NOT_DONE; } Int Curr = (m_pbitstrmOut -> getCounter ()) - OldCount; Int Num_MB = (iMB_right-iMB_left) * (iMB_bottom-iMB_top); m_pSptmbBits[AVGPIECEMB] = Curr / Num_MB; // average macroblock bits used by a sprite piece InitPieceRect = rctRefFrameY; InitPartialRect = InitPieceRect; m_rctPieceQ = InitPieceRect;*/#ifdef __TRACE_AND_STATS_ m_pbitstrmOut -> trace (-1, "VOP_Time");#endif // __TRACE_AND_STATS_ m_rctPieceQ = CRct ( m_rctSptPieceY.left, m_rctSptPieceY.top, m_rctSptPieceY.left, m_rctSptPieceY.top); m_pvopcSptQ = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctSptQ); m_pvopcRefQ1 = m_pvopcSptQ ; // to support "rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); " m_pbitstrmOut->reset (); // inserted as a result of half day debug// end: modified by Hughes 4/9/98 m_tPiece = m_nFirstFrame; m_tUpdate = m_nFirstFrame; m_vopmd.SpriteXmitMode = PIECE; if ( m_sptMode == BASIC_SPRITE) m_vopmd.SpriteXmitMode = NEXT;}Void CVideoObjectEncoder::initialSpritePiece (Int iSessionWidth, Int iSessionHeight){ // identify initial sprite piece CRct rctRefFrameY, rct ; Bool SpriteObject = (m_sptMode == PIECE_UPDATE) || ( m_sptMode == BASIC_SPRITE);// Begin: modified by Hughes 4/9/98 m_rctSptExp = CRct (0, 0, iSessionWidth, iSessionHeight); // m_rctSptExp is specified in relative coordinate// end: modified by Hughes 4/9/98 if (!SpriteObject) { if (m_iNumOfPnts == 0) rct = CRct (0, 0, iSessionWidth, iSessionHeight); else rct = InitialPieceRect (0); rctRefFrameY = CRct (rct.left, rct.top, rct.right, (rct.bottom + 16 - rct.height()/2)); //dshu: 12/22/97// rctRefFrameY = CRct (rct.left, rct.top, rct.right, (rct.bottom - rct.width/2)); } else rctRefFrameY = CRct (0, 0, iSessionWidth, iSessionHeight); if (!SpriteObject) rctRefFrameY = PieceExpand (rctRefFrameY); m_rctSptPieceY = rctRefFrameY;}CRct CVideoObjectEncoder::InitialPieceRect (Time ts){ CRct rctSpt, rctSptQ; CSiteD rgstSrcQ [4]; rgstSrcQ [0] = CSiteD (m_rctOrg.left, m_rctOrg.top); rgstSrcQ [1] = CSiteD (m_rctOrg.right, m_rctOrg.top); rgstSrcQ [2] = CSiteD (m_rctOrg.left, m_rctOrg.bottom); rgstSrcQ [3] = CSiteD (m_rctOrg.right, m_rctOrg.bottom); for (Int i = 0; i < m_iNumOfPnts; i++) { // quantization rgstSrc CoordD x = rgstSrcQ [i].x, y = rgstSrcQ [i].y; Int rnd = (x > 0) ? (Int) (2.0 * x + .5) : (Int) (2.0 * x - .5); m_rgstSrcQ [i].x = (CoordD) rnd / (CoordD) 2.; rnd = (y > 0) ? (Int) (2.0 * y + .5) : (Int) (2.0 * y - .5); m_rgstSrcQ [i].y = (CoordD) rnd / (CoordD) 2.; } rctSptQ = CornerWarp (m_pprgstDest[ts], m_rgstSrcQ); rctSpt = CRct (rctSptQ.left, 0, rctSptQ.right, m_rctSpt.height()); return rctSpt; }CRct CVideoObjectEncoder::CornerWarp (const CSiteD* rgstDst, const CSiteD* rgstSrcQ){ CSiteD stdLeftTopWarp, stdRightTopWarp, stdLeftBottomWarp, stdRightBottomWarp; CPerspective2D persp (m_iNumOfPnts, rgstSrcQ, rgstDst, m_uiWarpingAccuracy); stdLeftTopWarp = (persp * CSiteD (0, 0)).s; stdRightTopWarp = (persp * CSiteD (m_rctOrg.width, 0)).s; stdLeftBottomWarp = (persp * CSiteD (0, m_rctOrg.height())).s; stdRightBottomWarp = (persp * CSiteD (m_rctOrg.width, m_rctOrg.height())).s; CRct rctWarp (stdLeftTopWarp, stdRightTopWarp, stdLeftBottomWarp, stdRightBottomWarp); UInt accuracy1 = 1 << (m_uiWarpingAccuracy + 1); rctWarp = rctWarp / accuracy1 ; rctWarp.shift(-m_rctSpt.left, -m_rctSpt.top); // rectangle is w.r.t. UL corner of sprite object return rctWarp;}Void CVideoObjectEncoder::encodeSpritePiece (Time t)// code sprite pieces { if (m_vopmd.SpriteXmitMode == STOP) return ; if ((m_vopmd.SpriteXmitMode == PIECE) || (m_vopmd.SpriteXmitMode == UPDATE)){ m_pvopcSptQ -> shift(-m_rctSpt.left, -m_rctSpt.top); // prepare m_pvopcSptQ to merge new piece UInt uiF = t + m_volmd.iTemporalRate; uiF = ( uiF > m_nLastFrame) ? m_nLastFrame : uiF; UInt uiSptPieceSize = m_iBufferSize/(300/m_volmd.iTemporalRate); CRct rct = m_rctPieceQ; if (( m_sptMode != PIECE_UPDATE) && (m_tPiece == (Time) m_nFirstFrame)) { // Begin: modified by Hughes 4/9/98 InitPieceRect = encPiece (m_rctSptPieceY); rct = InitPieceRect;// End: modified by Hughes 4/9/98 rct = CRct (rct.left, (rct.top - 3*MB_SIZE + m_rctSpt.height()/2), rct.right, m_rctSpt.height()); // dshu: 1/4/98 InitPartialRect = encPiece (rct); m_vopmd.SpriteXmitMode = UPDATE; m_rctUpdateQ = CRct ( rct.left, rct.top, rct.left, rct.bottom); CRct rcttemp = encPiece (rct); rcttemp = encPiece (CRct ( rct.left, m_rctPieceQ.top, rct.right, rct.top)); m_vopmd.SpriteXmitMode = PIECE; m_tPiece = uiF; if (m_iNumOfPnts == 0) m_vopmd.SpriteXmitMode = NEXT; } else { if (( InitPartialRect.right >= InitPieceRect.right) && ( InitPartialRect.left <= InitPieceRect.left)) { CRct rctSptQ = ZoomOrPan (); encSptPiece (rctSptQ, uiSptPieceSize); while ((m_tPiece < (Time) uiF) && (m_vopmd.SpriteXmitMode == PIECE) ) encSptPiece (ZoomOrPan (), uiSptPieceSize); } else { m_bSptRightPiece = TRUE; encSptPiece (m_rctUpdateQ, uiSptPieceSize); InitPartialRect = m_rctUpdateQ; } Bool StartUpdate = (m_tPiece >= (Time) m_nLastFrame) && (m_tUpdate == (Time) m_nFirstFrame); if ( StartUpdate ) { m_vopmd.SpriteXmitMode = UPDATE; if(( t < (Time) m_nLastFrame) && (m_sptMode != PIECE_OBJECT)) { // identify initial update piece rct = InitialPieceRect (t-m_nFirstFrame); Int left = (rct.left < m_rctSptExp.left) ? m_rctSptExp.left : rct.left; Int right = (rct.right > m_rctSptExp.right) ? m_rctSptExp.right : rct.right; InitPieceRect = CRct (left, rct.top, right, rct.bottom); rct = InitPieceRect ; if (m_sptMode == PIECE_UPDATE) { cout << "\t" << "\n start sending updates for sprite..." << "\n"; cout.flush (); m_tUpdate = -1; m_rctUpdateQ = CRct ( left, rct.top, left, rct.bottom); m_pSptmbBits[AVGUPDATEMB] = m_pSptmbBits[AVGUPDATEMB] ; rct = PieceSize (TRUE, uiSptPieceSize); } rct = encPiece (rct); InitPartialRect = m_rctUpdateQ; m_tUpdate = t; } else m_vopmd.SpriteXmitMode = NEXT; } } m_pvopcSptQ -> shift(m_rctSpt.left, m_rctSpt.top); // prepare m_pvopcSptQ for warping m_vopmd.vopPredType = SPRITE; // --- begin of bug fix (David Shu) if (m_volmd.fAUsage != RECTANGLE) { CRct r1 = m_rctSptQ; m_rctSptQ = m_rctSptExp; m_rctCurrVOPY = CRct(0,0, m_rctSptQ.width, m_rctSptQ.height()); m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); m_rctRefFrameY = CRct (-EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, EXPANDY_REF_FRAME + m_rctSptQ.width, EXPANDY_REF_FRAME + m_rctSptQ.height()); m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 (); setRefStartingPointers (); m_iFrameWidthY = m_rctRefFrameY.width; m_iFrameWidthUV = m_rctRefFrameUV.width; m_iFrameWidthYxMBSize = MB_SIZE * m_iFrameWidthY; m_iFrameWidthYxBlkSize = BLOCK_SIZE * m_iFrameWidthY; m_iFrameWidthUVxBlkSize = BLOCK_SIZE * m_iFrameWidthUV; m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top); m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left,m_rctCurrVOPUV.top); padSprite() ; // final padding just before warping m_rctSptQ = r1; } // --- end of bug fix } if (m_vopmd.SpriteXmitMode != STOP){ SptXmitMode PieceXmitMode = m_vopmd.SpriteXmitMode; if (m_vopmd.SpriteXmitMode == NEXT ) { PieceXmitMode = STOP ; m_vopmd.SpriteXmitMode = STOP; m_iNumMBX = m_rctSptExp.width / MB_SIZE; m_iNumMBY = m_rctSptExp.height () / MB_SIZE; Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6; for (Int iMBY = 0; iMBY < m_iNumMBY; iMBY++){ for (Int iMB = 0; iMB < m_iNumMBX; iMB++) { for (Int iBlk = 0; iBlk < nBlk; iBlk++) delete [] (m_rgpmbmCurr_Spt[iMBY][iMB]->rgblkm) [iBlk]; delete [] m_rgpmbmCurr_Spt [iMBY][iMB]->rgblkm; delete [] m_rgpmbmCurr_Spt [iMBY][iMB]; } delete [] m_ppPieceMBstatus[iMBY] ; delete [] m_ppUpdateMBstatus[iMBY] ; delete [] m_rgmbmdSpt[iMBY] ; delete [] m_rgpmbmCurr_Spt[iMBY]; } delete [] m_ppPieceMBstatus ; delete [] m_ppUpdateMBstatus ; delete [] m_rgmbmdSpt ; delete [] m_rgpmbmCurr_Spt;// Begin: modified by Hughes 4/9/98 delete [] m_rgmbmdSprite ; // end: modified by Hughes 4/9/98 } else m_vopmd.SpriteXmitMode = PAUSE; codeVOSHead (); if (m_vopmd.SpriteXmitMode != STOP) m_vopmd.SpriteXmitMode = PieceXmitMode; }}Void CVideoObjectEncoder::encSptPiece (CRct rctSptQ, UInt uiSptPieceSize){ UInt uiTR = m_volmd.iTemporalRate; CRct rctSpt = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; CRct rctSptQNew = rctSpt; CRct rctPiece = PieceSize (m_bSptRightPiece, uiSptPieceSize); rctSpt.include(rctPiece); UInt uiF = (m_vopmd.SpriteXmitMode == PIECE ) ? m_tPiece : m_tUpdate; UInt boundary = m_nLastFrame ; if ( rctSptQ.valid() && (rctSptQNew != m_rctSptExp)) { rctSptQ = rctSpt; uiF += uiTR ; while ((rctSptQNew.right <= rctSptQ.right) && (rctSptQNew.left >= rctSptQ.left) && (uiF <= boundary)) { CRct rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ); if (rctWarpNew.left < m_rctSptExp.left) rctWarpNew.left = m_rctSptExp.left; if (rctWarpNew.right > m_rctSptExp.right) rctWarpNew.right = m_rctSptExp.right; rctSptQNew.include (rctWarpNew);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -