📄 sptdec.cpp
字号:
m_rctRefVOPY1 = m_rctCurrVOPY; m_rctRefVOPY1.expand (EXPANDY_REFVOP); m_rctRefVOPUV1 = m_rctCurrVOPUV; m_rctRefVOPUV1.expand (EXPANDUV_REFVOP); m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1); }/* m_tPiece = -1; decode ();// dshu: begin of modification // delete the following statement// m_rctSptPieceY = m_rctCurrVOPY; //for non-rectangular only becomes known now// dshu: end of modification m_tPiece = 0; m_iStepI = m_vopmd.intStepI ; // ensure byte alignment; 9/16/97 m_pbitstrmIn->flush (8); // dshu: begin of modification// m_pvopcSptQ = new CVOPU8YUVBA (*m_pvopcRefQ1);// m_pvopcSptQ -> shift (m_rctSptPieceY.left, m_rctSptPieceY.top); m_pvopcSptQ = new CVOPU8YUVBA (m_volmd.fAUsage, m_rctSptExp); m_pvopcSptQ -> shift (m_rctSpt.left, m_rctSpt.top); // change to absolute value in sprite coordinates PiecePut(*m_pvopcRefQ1, *m_pvopcSptQ, m_rctSptPieceY);// dshu: end of modification//m_pvopcSptQ->vdlDump("c:\\SptQ.vdl");//wchen: temporally out due to memory problem CMBMode* pmbmd = m_rgmbmdRef; IntraPredDirection* Spreddir; IntraPredDirection* preddir; // initialize MB hole status array// dshu: begin of modification// Int iMB_left = m_rctSptPieceY.left / MB_SIZE; // Int iMB_right = m_rctSptPieceY.right / MB_SIZE; // Int iMB_top = m_rctSptPieceY.top / MB_SIZE; // Int iMB_bottom = m_rctSptPieceY.bottom / MB_SIZE; // MBs are based on vector, not on absolute value in sprite coordinates Int iMB_left = m_iPieceXoffset; Int iMB_right = m_iPieceXoffset + m_iPieceWidth; Int iMB_top = m_iPieceYoffset; Int iMB_bottom = m_iPieceYoffset + m_iPieceHeight;// dshu: end of modification for (iMBY = 0; iMBY < iNumMBY; iMBY++) for (iMBX = 0; iMBX < 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); m_rgmbmdSprite[iMBX + iNumMBX * iMBY] = CMBMode (*pmbmd); // dshu: [v071] added to store mbmd array for sprite 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; }*/// End: modified by Hughes 4/9/98 m_oldSptXmitMode = PIECE; m_vopmd.SpriteXmitMode = PAUSE;}Void CVideoObjectDecoder::decodeSpritePieces ()// decode sprite pieces{ if ( m_vopmd.SpriteXmitMode == STOP) return; m_vopmd.SpriteXmitMode = m_oldSptXmitMode; CRct rctCurrVOPY = m_rctCurrVOPY; //caching for warping do { decodeOneSpritePiece (); } while (( m_vopmd.SpriteXmitMode != STOP) && ( m_vopmd.SpriteXmitMode != PAUSE));// dshu: [v071] Begin of modification m_rctCurrVOPY = rctCurrVOPY; // restore for warping if (m_volmd.fAUsage != RECTANGLE) padSprite() ; // final padding just before warping // dshu: [v071] end of modification if ( m_vopmd.SpriteXmitMode == STOP) {// dshu: begin of modification Int iNumMBX = m_rctSptQ.width / MB_SIZE; Int iNumMBY = m_rctSptQ.height () / MB_SIZE; Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6; for (Int iMBY = 0; iMBY < iNumMBY; iMBY++){ for (Int iMB = 0; iMB < 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; delete [] m_rgmbmdSprite ; // dshu: [v071] // dshu: end of modification//wchen: can you just delete double points like this?//temporarilly removed // delete [] m_ppPieceMBstatus ;// delete [] m_ppUpdateMBstatus ; } //restore since it was changed during decoding to I/P m_vopmd.vopPredType = SPRITE; //restore for warping// m_rctCurrVOPY = rctCurrVOPY; // dshu: [v071]; move to location of one statement before padSprite() // ensure byte alignment m_pbitstrmIn->flush (8);}//wchen: moved decode piece part from vopsedec.cpp -- decode ()Int CVideoObjectDecoder::decodeOneSpritePiece (){ //wchen: the part deals with stop and pause stay in decode () assert (m_vopmd.SpriteXmitMode != STOP && m_vopmd.SpriteXmitMode != PAUSE); m_rctSptPieceY = decodeVOSHead (); if (m_vopmd.SpriteXmitMode == STOP || m_vopmd.SpriteXmitMode == PAUSE) return TRUE; else if (m_vopmd.SpriteXmitMode == PIECE ) //faking the paramters to fool vopmbdec m_vopmd.vopPredType = IVOP; else m_vopmd.vopPredType = PVOP;// dshu: begin of modification// m_pvopcRefQ1 -> shift (m_rctSptPieceY.left, m_rctSptPieceY.top);// PieceOverlay(*m_pvopcSptQ, *m_pvopcRefQ1, m_rctSptPieceY); // extract reference// m_pvopcRefQ1 -> shift (-m_rctSptPieceY.left, -m_rctSptPieceY.top); // restore the m_pvopcRefQ1 to zero offset// dshu: end of modification// dshu: begin of modification //copy to Q0 via SptP // CVOPU8YUVBA* pvopcSptP = new CVOPU8YUVBA (*m_pvopcSptQ, m_volmd.fAUsage, m_rctSptPieceY); // extract reference // m_pvopcRefQ0->overlay (*pvopcSptP); // delete pvopcSptP; PieceGet(*m_pvopcRefQ1, *m_pvopcSptQ, m_rctSptPieceY);// dshu: end of modification //always to that since the rect keeps changing //internally, every piece starts from (0, 0) m_rctCurrVOPY = CRct(0,0, m_rctSptPieceY.width, m_rctSptPieceY.height()); m_rctCurrVOPUV = m_rctCurrVOPY.downSampleBy2 (); setRefStartingPointers (); computeVOPMembers (); decodeVOP (); //delete ac/dc pred stuff Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6; delete [] m_rgblkmCurrMB; m_rgblkmCurrMB = NULL; for (Int iMB = 0; iMB < m_iNumMBX; iMB++) { for (Int iBlk = 0; iBlk < nBlk; iBlk++) { delete [] (m_rgpmbmAbove [iMB]->rgblkm) [iBlk]; delete [] (m_rgpmbmCurr [iMB]->rgblkm) [iBlk]; } delete [] m_rgpmbmAbove [iMB]->rgblkm; delete m_rgpmbmAbove [iMB]; delete [] m_rgpmbmCurr [iMB]->rgblkm; delete m_rgpmbmCurr [iMB]; } delete [] m_rgpmbmAbove; m_rgpmbmAbove = NULL; delete [] m_rgpmbmCurr; m_rgpmbmCurr = NULL; // Place the decoded sprite piece into sprite buffer. // Please notice that initial piece is offset by a vector like any VOP; // the rest of sprite pieces have zero offset, thus require shifting to be placed into buffer. // shift back to absolutes in sprite coordinates for overlaying // dshu: begin of modification// m_pvopcRefQ1 -> shift (m_rctSptPieceY.left, m_rctSptPieceY.top);// m_pvopcSptQ -> overlay (*m_pvopcRefQ1, m_rctSptPieceY); PiecePut(*m_pvopcRefQ1, *m_pvopcSptQ, m_rctSptPieceY);// PieceOverlay(*m_pvopcRefQ1, *m_pvopcSptQ, m_rctSptPieceY); // restore the m_pvopcRefQ1 to zero offset// m_pvopcRefQ1 -> shift (-m_rctSptPieceY.left, -m_rctSptPieceY.top);// dshu: end of modification return TRUE;}CRct CVideoObjectDecoder::decodeVOSHead (){ m_oldSptXmitMode = m_vopmd.SpriteXmitMode; m_vopmd.SpriteXmitMode = (SptXmitMode) m_pbitstrmIn -> getBits (NUMBITS_SPRITE_XMIT_MODE); if (( m_vopmd.SpriteXmitMode != STOP) &&( m_vopmd.SpriteXmitMode != PAUSE)) { Int stepToBeDeCoded = m_pbitstrmIn -> getBits (NUMBITS_VOP_QUANTIZER); if (m_vopmd.SpriteXmitMode == UPDATE) m_vopmd.intStep = stepToBeDeCoded; else m_vopmd.intStepI = stepToBeDeCoded; m_iPieceWidth = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_MB_OFFSET); m_iPieceHeight = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_MB_OFFSET);// Begin: modified by Hughes 4/9/98 /* Int iMarker = wmay */ m_pbitstrmIn -> getBits (MARKER_BIT);// End: modified by Hughes 4/9/98 m_iPieceXoffset = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_MB_OFFSET); m_iPieceYoffset = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_MB_OFFSET); //wchen: changed to absolute value in sprite coordinates Int left = (m_iPieceXoffset * MB_SIZE) + m_rctSpt.left; Int top = (m_iPieceYoffset * MB_SIZE) + m_rctSpt.top; Int right = left + m_iPieceWidth * MB_SIZE ; Int bottom = top + m_iPieceHeight * MB_SIZE ; return CRct (left, top, right, bottom); } else return CRct();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -