📄 sys_decoder_shpdec.cpp
字号:
/*************************************************************************This software module was originally developed by Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation Bruce Lin (blin@microsoft.com), Microsoft Corporation Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation (date: July, 1997)and edited by Yoshihiro Kikuchi (TOSHIBA CORPORATION) Takeshi Nagai (TOSHIBA CORPORATION) Toshiaki Watanabe (TOSHIBA CORPORATION) Noboru Yamaguchi (TOSHIBA CORPORATION) Sehoon Son (shson@unitel.co.kr) Samsung AITin the course of development of the MPEG-4 Video (ISO/IEC 14496-2). This software module is an implementation of a part of one or more MPEG-4 Video tools as specified by the MPEG-4 Video. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 Video conforming products. Microsoft retains full right to use the code for his/her own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name: shpdec.cppAbstract: Block decoding functionsRevision History:*************************************************************************/#include <stdlib.h>#include <math.h>#include "typeapi.h"#include "codehead.h"#include "mode.hpp"#include "global.hpp"#include "bitstrm.hpp"#include "entropy.hpp"#include "huffman.hpp"#include "dct.hpp"#include "cae.h"#include "vopses.hpp"#include "vopsedec.hpp"#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW #endif // __MFC_#define SIGN(n) (n>0)?1:((n<0)?-1:0) //OBSS_SAIT_991015// HHI Klaas Schueuer: sadctVoid CVideoObjectDecoder::deriveSADCTRowLengths(Int **piCoeffWidths, const PixelC* ppxlcMBBY, const PixelC* ppxlcCurrMBBUV, const TransparentStatus *pTransparentStatus){ CInvSADCT *pidct = (CInvSADCT *)m_pidct; const PixelC *pSrc = NULL; int i; for (i=Y_BLOCK1; i<U_BLOCK; i++) { if (pTransparentStatus[i] != PARTIAL) { memset(piCoeffWidths[i], 0, BLOCK_SIZE * sizeof(piCoeffWidths[i][0])); continue; } switch (i) { case Y_BLOCK1: pSrc = ppxlcMBBY; break; case Y_BLOCK2: pSrc = ppxlcMBBY + BLOCK_SIZE; break; case Y_BLOCK3: pSrc = ppxlcMBBY + BLOCK_SIZE*MB_SIZE; break; case Y_BLOCK4: pSrc = ppxlcMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE; break; } pidct->getRowLength(piCoeffWidths[i], pSrc, MB_SIZE);#ifdef _DEBUG for (int iy=0; iy<BLOCK_SIZE; iy++) { int l = *(piCoeffWidths[i] + iy); assert(l>=0 && l<=BLOCK_SIZE); }#endif } if (pTransparentStatus[U_BLOCK] == PARTIAL) { pidct->getRowLength(piCoeffWidths[U_BLOCK], ppxlcCurrMBBUV, BLOCK_SIZE); #ifdef _DEBUG for (int iy=0; iy<BLOCK_SIZE; iy++) { int l = *(piCoeffWidths[i] + iy); assert(l>=0 && l<=BLOCK_SIZE); }#endif } else memset(piCoeffWidths[U_BLOCK], 0, BLOCK_SIZE * sizeof(piCoeffWidths[i][0])); #ifdef __TRACE_DECODING_ m_ptrcer->dumpSADCTRowLengths(piCoeffWidths);#endif}// end Void CVideoObjectDecoder::decodeIntraShape (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcCurrMBBY, PixelC* ppxlcCurrMBBYFrm){ static Int rgiShapeMdCode [3]; Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); //printf("(%d,%d)",iMBX,iMBY); Int iTblIndex = shpMdTableIndex (pmbmd, iMBX, iMBY); rgiShapeMdCode [ALL_TRANSP] = grgchFirstShpCd [iTblIndex + ALL_TRANSP]; rgiShapeMdCode [ALL_OPAQUE] = grgchFirstShpCd [iTblIndex + ALL_OPAQUE]; rgiShapeMdCode [INTRA_CAE] = grgchFirstShpCd [iTblIndex + INTRA_CAE]; // Modified for error resilient mode by Toshiba(1997-11-14) //Int iBits = m_pbitstrmIn->peekBits (2); //iBits = (iBits > 1) ? m_pbitstrmIn->getBits (2) : m_pbitstrmIn->getBits (1); Int iBits = m_pbitstrmIn->peekBits (3); assert (iBits != 0); if (iBits >= 4) { iBits = m_pbitstrmIn->getBits (1); iBits = 0; } else if (iBits >= 2) { iBits = m_pbitstrmIn->getBits (2); iBits = 2; } else if (iBits == 1) { iBits = m_pbitstrmIn->getBits (3); iBits = 3; } // End Toshiba(1997-11-14) assert (iBits == 0 || iBits == 2 || iBits == 3); //printf("[%08x]",m_pbitstrmIn->peekBits(32)); if (iBits == rgiShapeMdCode [ALL_TRANSP]) { pmbmd->m_shpmd = ALL_TRANSP;//printf("_"); pxlcmemset (ppxlcCurrMBBY, MPEG4_TRANSPARENT, MB_SQUARE_SIZE); copyReconShapeToMbAndRef (ppxlcCurrMBBY, ppxlcCurrMBBYFrm, MPEG4_TRANSPARENT); pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] = pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = ALL; } else if (iBits == rgiShapeMdCode [ALL_OPAQUE]) { pmbmd->m_shpmd = ALL_OPAQUE;//printf("X"); copyReconShapeToMbAndRef (ppxlcCurrMBBY, ppxlcCurrMBBYFrm, MPEG4_OPAQUE); pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] = pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = NONE; } else if (iBits == rgiShapeMdCode [INTRA_CAE]) { pmbmd->m_shpmd = INTRA_CAE;//printf("S"); decodeIntraCaeBAB (ppxlcCurrMBBY, ppxlcCurrMBBYFrm); decideTransparencyStatus (pmbmd, ppxlcCurrMBBY); assert (pmbmd->m_rgTranspStatus [0] == PARTIAL); } else assert (FALSE);}Void CVideoObjectDecoder::decodeInterShape (CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){ assert (shpmdColocatedMB != UNKNOWN); // Added for error resilient mode by Toshiba(1997-11-14) //printf("m_iVPMBnum=%d\n",m_iVPMBnum); Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); //printf("(%d,%d)",iMBX,iMBY); CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeMode [shpmdColocatedMB]; pmbmd->m_shpmd = (ShapeMode) pentrdec->decodeSymbol (); //printf("[%08x]",m_pbitstrmIn->peekBits(32)); if (pmbmd->m_shpmd == ALL_TRANSP) {//printf("_"); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, MPEG4_TRANSPARENT);//OBSS_SAIT_991015 //for OBSS pmvBY->iMVX = NOT_MV; pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015 pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] = pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = ALL; } else if (pmbmd->m_shpmd == ALL_OPAQUE) {//printf("X"); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, MPEG4_OPAQUE);//OBSS_SAIT_991015 //for OBSS pmvBY->iMVX = NOT_MV; pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015 pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] = pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = NONE; } else if (pmbmd->m_shpmd == INTRA_CAE) {//printf("S"); decodeIntraCaeBAB (ppxlcMBBY, ppxlcMBBYFrm);//OBSS_SAIT_991015 //for OBSS pmvBY->iMVX = NOT_MV; pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015 decideTransparencyStatus (pmbmd, ppxlcMBBY); assert (pmbmd->m_rgTranspStatus [0] == PARTIAL || pmbmd->m_rgTranspStatus [0] == NONE); } else {//printf("M"); CMotionVector mvShapeDiff (0, 0); if (pmbmd->m_shpmd == MVDNZ_NOUPDT || pmbmd->m_shpmd == INTER_CAE_MVDNZ) decodeMVDS (mvShapeDiff); CMotionVector mvShapeMVP = findShapeMVP (pmv, pmvBY, pmbmd, iMBX, iMBY); *pmvBY = mvShapeMVP + mvShapeDiff; //printf("(%d,%d)",pmvBY->iMVX*2,pmvBY->iMVY*2); //motion comp//OBSSFIX_MODE3 if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == PVOP &&m_volmd.bSpatialScalability == 1 && m_volmd.iHierarchyType == 0 && m_volmd.iEnhnType == 1 && m_volmd.iuseRefShape == 1) memset((void *)m_puciPredBAB->pixels(),255, MC_BAB_SIZE*MC_BAB_SIZE); else motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (), pmvBY->iMVX + iX - 1, pmvBY->iMVY + iY - 1); //-1 due to 18x18 motion comp// motionCompBY ((PixelC*) m_puciPredBAB->pixels (),// (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (),// pmvBY->iMVX + iX - 1, // pmvBY->iMVY + iY - 1); //-1 due to 18x18 motion comp//~OBSSFIX_MODE3 if (pmbmd->m_shpmd == INTER_CAE_MVDZ || pmbmd->m_shpmd == INTER_CAE_MVDNZ) { m_iInverseCR = 1; m_iWidthCurrBAB = BAB_SIZE; const PixelC *ppxlcPredBAB = m_puciPredBAB->pixels (); if(!m_volmd.bNoCrChange && m_pbitstrmIn->getBits (1) != 0) { if(m_pbitstrmIn->getBits (1) == 0) { m_iInverseCR = 2; m_iWidthCurrBAB = 12; downSampleShapeMCPred(ppxlcPredBAB,m_ppxlcPredBABDown2,2); ppxlcPredBAB = m_ppxlcPredBABDown2; subsampleLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcCurrMBBYDown2); m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2; } else { m_iInverseCR = 4; m_iWidthCurrBAB = 8; downSampleShapeMCPred(ppxlcPredBAB,m_ppxlcPredBABDown4,4); ppxlcPredBAB = m_ppxlcPredBABDown4; subsampleLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcCurrMBBYDown4); m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4; } } else { copyLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcReconCurrBAB); //used for upsample and CAE m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; //assign encoding buffer } if (m_pbitstrmIn->getBits (1) == 1) decodeInterCAEH (ppxlcPredBAB); //right bottom border made on the fly else decodeInterCAEV (ppxlcPredBAB); if(m_iInverseCR>1) upSampleShape(ppxlcMBBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER); //copy rounded data } else { copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); } decideTransparencyStatus (pmbmd, ppxlcMBBY); assert (pmbmd->m_rgTranspStatus [0] != ALL); }//putchar('\n');}//OBSS_SAIT_991015//for OBSS shape decoding -PVOPVoid CVideoObjectDecoder::decodeSIShapePVOP (CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, CMotionVector* pmvBaseBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){ assert (shpmdColocatedMB != UNKNOWN); // Added for error resilient mode by Toshiba(1997-11-14) Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); m_bVPNoRight = bVPNoRight(iMBX); m_bVPNoBottom = bVPNoBottom(iMBY); assert ( m_vopmd.vopPredType==PVOP ); if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) { motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ->getPlane(BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decideTransparencyStatus (pmbmd, ppxlcMBBY); return; } CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeSSModeIntra [0]; pmbmd->m_shpssmd = (ShapeSSMode) pentrdec->decodeSymbol (); if (pmbmd->m_shpssmd == INTRA_NOT_CODED) {//printf("S"); motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ->getPlane(BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decideTransparencyStatus (pmbmd, ppxlcMBBY); } else if (pmbmd->m_shpssmd == INTRA_CODED) { motionCompBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decodeSIBAB ( ppxlcMBBY, ppxlcMBBYFrm, (pvopcRefQ->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, (pvopcRefQ->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY, iMBX, iMBY, (PixelC*)((pvopcRefQ->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME)); decideTransparencyStatus (pmbmd, ppxlcMBBY); }}//for OBSS shape decoding -BVOPVoid CVideoObjectDecoder::decodeSIShapeBVOP (CVOPU8YUVBA* pvopcRefQ0, //previous VOP CVOPU8YUVBA* pvopcRefQ1, //lower reference layer CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, CMotionVector* pmvBaseBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){ assert (shpmdColocatedMB != UNKNOWN); // Added for error resilient mode by Toshiba(1997-11-14) Int iMBnum = VPMBnum(iMBX, iMBY); m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX); m_bVPNoTop = bVPNoTop(iMBnum); m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX); m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX); m_bVPNoRight = bVPNoRight(iMBX); m_bVPNoBottom = bVPNoBottom(iMBY); if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) { motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (), (PixelC*) pvopcRefQ1->getPlane(BY_PLANE)->pixels (), iX-1, iY-1); copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER); decideTransparencyStatus (pmbmd, ppxlcMBBY); return; } if(m_vopmd.vopPredType==BVOP){ Int colocatedIndex[7]={0,0,1,3,3,2,2};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -