📄 sptenc.cpp
字号:
uiF = ((rctSptQNew.right <= rctSptQ.right) && (rctSptQNew.left >= rctSptQ.left)) ? (uiF + uiTR) : (uiF - uiTR); } Int left = (rctPiece.left < rctSptQNew.left) ? rctSptQNew.left : rctPiece.left; Int right = (rctPiece.right > rctSptQNew.right) ? rctSptQNew.right : rctPiece.right; if ((right-MB_SIZE) > left) rctSpt = encPiece (CRct (left, m_rctSptExp.top, right, m_rctSptExp.bottom)); } else { uiF = boundary; } if (uiF > boundary) uiF = boundary; if (m_vopmd.SpriteXmitMode == PIECE ) m_tPiece = uiF; if (m_vopmd.SpriteXmitMode == UPDATE ) m_tUpdate = uiF; if (uiF >= boundary) { if (( m_sptMode == PIECE_OBJECT) || m_vopmd.SpriteXmitMode == UPDATE ) m_vopmd.SpriteXmitMode = NEXT; }}CRct CVideoObjectEncoder::PieceSize (Bool rightpiece, UInt uiSptPieceSize){ Int right, left; CRct rctSptQ = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; Int AvgBitsMb = (m_vopmd.SpriteXmitMode == PIECE ) ? m_pSptmbBits [AVGUPDATEMB] : m_pSptmbBits[AVGUPDATEMB]; assert (AvgBitsMb != 0); m_iPieceHeight = (MB_SIZE-1 + m_rctPieceQ.height ()) / MB_SIZE; m_iPieceWidth= (Int) (0.5 + uiSptPieceSize/(AvgBitsMb * m_iPieceHeight)); m_iPieceWidth= (m_iPieceWidth<2)? 2 : m_iPieceWidth; if (rightpiece) { right = rctSptQ.right + MB_SIZE * m_iPieceWidth; if (right > m_rctSptExp.right) { right = m_rctSptExp.right; } if ((m_vopmd.SpriteXmitMode == UPDATE ) && (right > m_rctPieceQ.right)) { right = m_rctPieceQ.right; } left = rctSptQ.right; } else { left = rctSptQ.left - MB_SIZE* m_iPieceWidth; if (left < m_rctSptExp.left) { left = m_rctSptExp.left ; } if ((m_vopmd.SpriteXmitMode == UPDATE ) && (left < m_rctPieceQ.left)) { left = m_rctPieceQ.left ; } right = rctSptQ.left; } CRct rctSptPieceY = CRct (left, m_rctSptExp.top, right, m_rctSptExp.bottom); if ((m_tUpdate > (Time) m_nFirstFrame) || (m_vopmd.SpriteXmitMode == PIECE )) if (rightpiece) { if (left > (m_rctSptExp.left+MB_SIZE)) { left -= MB_SIZE; rctSptPieceY = CRct (left, rctSptPieceY.top, rctSptPieceY.right, rctSptPieceY.bottom); } } else{ if (right < (m_rctSptExp.right - MB_SIZE)) { right += MB_SIZE; rctSptPieceY = CRct (rctSptPieceY.left, rctSptPieceY.top, right, rctSptPieceY.bottom); } } return rctSptPieceY;}CRct CVideoObjectEncoder::encPiece (CRct rctpiece){ Time ts; //Int right = rctpiece.right; //Int left = rctpiece.left; CRct rctSpt = (m_vopmd.SpriteXmitMode == PIECE ) ? m_rctPieceQ : m_rctUpdateQ ; CRct rctSptPieceY = PieceExpand (rctpiece);// m_rctSptPieceY = rctSptPieceY;// m_rctSptPieceY.shift(m_rctSpt.left, m_rctSpt.top); if (m_volmd.fAUsage == RECTANGLE) { m_rctCurrVOPY = rctSptPieceY; m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); } m_iPieceWidth= rctSptPieceY.width / MB_SIZE; m_iPieceHeight= rctSptPieceY.height () / MB_SIZE; m_iPieceXoffset= (rctSptPieceY.left - m_rctSptExp.left) / MB_SIZE; m_iPieceYoffset= (rctSptPieceY.top - m_rctSptExp.top) / MB_SIZE; rctSpt.include(rctSptPieceY); codeVOSHead (); Int OldCount = m_pbitstrmOut -> getCounter (); // encode sprite piece m_pvopcSptP = new CVOPU8YUVBA (*m_pvopcSpt, m_volmd.fAUsage, rctSptPieceY); m_pvopcSptP -> shift (-rctSptPieceY.left, -rctSptPieceY.top); CRct rctRefFrameY = m_pvopcSptP -> whereY() ; m_rctCurrVOPY = CRct (0, 0, rctRefFrameY.width, rctRefFrameY.height()); m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); m_rctRefFrameY = CRct ( -EXPANDY_REF_FRAME, -EXPANDY_REF_FRAME, EXPANDY_REF_FRAME + rctRefFrameY.width, EXPANDY_REF_FRAME + rctRefFrameY.height() ); m_rctRefFrameUV = m_rctRefFrameY.downSampleBy2 (); m_pvopcOrig = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY); VOPOverlay (*m_pvopcSptP, *m_pvopcOrig); m_pvopcOrig->setBoundRct (m_rctCurrVOPY); m_pvopcRefQ1 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY); delete m_pvopcSptP; m_pvopcSptP = new CVOPU8YUVBA (*m_pvopcSptQ, m_volmd.fAUsage, rctSptPieceY); // extract reference m_pvopcSptP -> shift (-rctSptPieceY.left, -rctSptPieceY.top); VOPOverlay (*m_pvopcSptP, *m_pvopcRefQ1); if (m_vopmd.SpriteXmitMode == PIECE ) { m_rctPieceQ = rctSpt; ts = m_tPiece; m_vopmd.vopPredType = IVOP; } else { m_rctUpdateQ = rctSpt; ts = m_tUpdate; m_vopmd.vopPredType = PVOP; } m_pvopcRefQ0 = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctRefFrameY); m_iFrameWidthY = m_pvopcRefQ0->whereY ().width; m_iFrameWidthUV = m_pvopcRefQ0->whereUV ().width; m_iFrameWidthYxMBSize = MB_SIZE * m_pvopcRefQ0->whereY ().width; m_iFrameWidthYxBlkSize = BLOCK_SIZE * m_pvopcRefQ0->whereY ().width; m_iFrameWidthUVxBlkSize = BLOCK_SIZE * m_pvopcRefQ0->whereUV ().width; encode (TRUE, ts, m_vopmd.vopPredType);// encode (TRUE, ts, m_vopmd.SpriteXmitMode); m_pvopcRefQ1 -> shift (rctSptPieceY.left, rctSptPieceY.top); VOPOverlay (*m_pvopcRefQ1, *m_pvopcSptQ, 1); delete m_pvopcSptP; delete m_pvopcOrig; m_pvopcOrig = NULL ; delete m_pvopcRefQ0; m_pvopcRefQ0 = NULL ; delete m_pvopcRefQ1; m_pvopcRefQ1 = NULL ; if (m_iNumOfPnts == 0) { m_pvopcRefQ1 = m_pvopcSptQ; // to avoid "rgpvoenc [BASE_LAYER] -> swapRefQ1toSpt (); " } Int Curr = (m_pbitstrmOut -> getCounter ()) - OldCount; if (m_iNumSptMB > 0) { if (m_vopmd.SpriteXmitMode == PIECE ) m_pSptmbBits[AVGPIECEMB] = Curr / m_iNumSptMB; // average macroblock bits used by a sprite piece if (m_vopmd.SpriteXmitMode == UPDATE ) m_pSptmbBits[AVGUPDATEMB] = Curr / m_iNumSptMB; // average macroblock bits used by a sprite piece } return rctSpt;}CRct CVideoObjectEncoder::ZoomOrPan (){ CRct rctWarpNew ; CRct rctWarpOld ; UInt uiTR = m_volmd.iTemporalRate; UInt uiF = (m_vopmd.SpriteXmitMode == PIECE ) ? m_tPiece : m_tUpdate; UInt boundary = m_nLastFrame ; if (uiF >= boundary) return rctWarpNew; rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ); rctWarpOld = rctWarpNew; // determine if sprite is zooming or panning? while (rctWarpNew == rctWarpOld) { uiF += uiTR ; rctWarpNew = CornerWarp (m_pprgstDest[uiF- m_nFirstFrame], m_rgstSrcQ); } if ((rctWarpNew.right > rctWarpOld.right) && (rctWarpNew.left < rctWarpOld.left)) m_bSptZoom = TRUE; // sprite is zooming else { m_bSptZoom = FALSE ; // sprite is panning if (rctWarpNew.left < rctWarpOld.left) m_bSptRightPiece = FALSE; // sprite is panning to the left else m_bSptRightPiece = TRUE; // sprite is panning to the right } rctWarpNew.include (rctWarpOld); return rctWarpNew; }Void CVideoObjectEncoder::codeVOSHead () { m_pbitstrmOut -> putBits (m_vopmd.SpriteXmitMode, NUMBITS_SPRITE_XMIT_MODE, "Sprite_TRANSMIT_MODE"); if (( m_vopmd.SpriteXmitMode != STOP) &&( m_vopmd.SpriteXmitMode != PAUSE)) { // Sprite piece overhead code //static UInt uiNumBitsStart = 4* NUMBITS_SPRITE_MB_OFFSET + NUMBITS_SPRITE_XMIT_MODE + NUMBITS_VOP_QUANTIZER; Int stepToBeCoded = (m_vopmd.SpriteXmitMode == UPDATE) ? m_vopmd.intStep : m_vopmd.intStepI; m_pbitstrmOut -> putBits (stepToBeCoded, NUMBITS_VOP_QUANTIZER, "sprite_Piece_Quantier"); m_pbitstrmOut -> putBits (m_iPieceWidth, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_width"); //plus 9 bits m_pbitstrmOut -> putBits (m_iPieceHeight, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_height"); //plus 9 bits// Begin: modified by Hughes 4/9/98 m_pbitstrmOut -> putBits (MARKER_BIT, MARKER_BIT, "Marker_Bit");// End: modified by Hughes 4/9/98 m_pbitstrmOut -> putBits (m_iPieceXoffset, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_Xoffset"); //plus 9 bits m_pbitstrmOut -> putBits (m_iPieceYoffset, (UInt) NUMBITS_SPRITE_MB_OFFSET, "sprite_Piece_Yoffset"); //plus 9 bits }}CRct CVideoObjectEncoder::findTightBoundingBox (CVOPU8YUVBA* vopuc){ const CRct& rctOrig = vopuc -> whereY (); CoordI left = rctOrig.right - 1; CoordI top = rctOrig.bottom - 1; CoordI right = rctOrig.left; CoordI bottom = rctOrig.top; const PixelC* ppxlcBY = vopuc->pixelsBY (); for (CoordI y = rctOrig.top; y < rctOrig.bottom; y++) { for (CoordI x = rctOrig.left; x < rctOrig.right; x++) { if (*ppxlcBY != transpValue) { left = min (left, x); top = min (top, y); right = max (right, x); bottom = max (bottom, y); } ppxlcBY++; } } right++; bottom++; if (left % 2 != 0) left--; if (top % 2 != 0) top--; return PieceExpand (CRct (left, top, right, bottom));}// extend the rctOrg size to multiples of MBSize w.r.t. m_rctSptExp CRct CVideoObjectEncoder::PieceExpand (const CRct& rctOrg){// Begin: modified by Hughes 4/9/98// Int left = rctOrg.left ; // Int right = rctOrg.right ; // Int top = rctOrg.top ; // Int bottom = rctOrg.bottom ; Int left = (rctOrg.left < m_rctSptExp.left) ? m_rctSptExp.left : rctOrg.left; Int right = (rctOrg.right > m_rctSptExp.right) ? m_rctSptExp.right : rctOrg.right; Int top = (rctOrg.top < m_rctSptExp.top) ? m_rctSptExp.top : rctOrg.top; Int bottom = (rctOrg.bottom > m_rctSptExp.bottom) ? m_rctSptExp.bottom : rctOrg.bottom;// End: modified by Hughes 4/9/98 Int iMod = (left - m_rctSptExp.left) % MB_SIZE; if (iMod > 0) left -= iMod; iMod = (right - left) % MB_SIZE; if (iMod > 0) right += MB_SIZE - iMod; iMod = (top - m_rctSptExp.top) % MB_SIZE; if (iMod > 0) top -= iMod; iMod = (bottom - top) % MB_SIZE; if (iMod > 0) bottom += MB_SIZE - iMod; // for update pieces, skip the entire row of MBs if the cooresponding object piece if missing if (m_vopmd.SpriteXmitMode == UPDATE) { Int iMBX, iMBX_left, iMBX_right ; Int iMBY, iMBY_top, iMBY_bottom ; iMBX_left = (left - m_rctSptExp.left) / MB_SIZE; iMBX_right = (right - m_rctSptExp.left) / MB_SIZE; iMBY_top = (top - m_rctSptExp.top) / MB_SIZE; iMBY_bottom = (bottom - m_rctSptExp.top) / MB_SIZE; for (iMBY = iMBY_top; iMBY < iMBY_bottom; iMBY++) { for (iMBX = iMBX_left; iMBX < iMBX_right; iMBX++) { if ( m_ppPieceMBstatus[iMBY][iMBX] != PIECE_DONE) { top = top + MB_SIZE; break; } } } for (iMBY = iMBY_bottom-1; iMBY > iMBY_top; iMBY--) { for (iMBX = iMBX_left; iMBX < iMBX_right; iMBX++) { if ( m_ppPieceMBstatus[iMBY][iMBX] != PIECE_DONE) { bottom = bottom - MB_SIZE; break; } } } } return CRct(left, top, right, bottom);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -