📄 vopsedec.cpp
字号:
m_iBVOPOffsetForPadY = m_iOffsetForPadY; m_iBVOPOffsetForPadUV = m_iOffsetForPadUV; m_rctBVOPPrevNoExpandY = m_rctPrevNoExpandY; m_rctBVOPPrevNoExpandUV = m_rctPrevNoExpandUV; m_rctBVOPRefVOPY1 = m_rctRefVOPY1; m_rctBVOPRefVOPUV1 = m_rctRefVOPUV1; } // For Temporal Scalability End Sharp(1998-02-10) if (m_vopmd.vopPredType != BVOP || (m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode == 0)) { repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsY () + m_iOffsetForPadY, m_pvopcRefQ1); repeatPadUV (m_pvopcRefQ1); //reset by in RefQ1 so that no left-over from last frame if (m_volmd.fAUsage != RECTANGLE) { if (m_volmd.fAUsage == EIGHT_BIT) repeatPadYOrA ((PixelC*) m_pvopcRefQ1->pixelsA () + m_iOffsetForPadY, m_pvopcRefQ1); } } // update buffers for temporal scalability Added by Sharp(1998-02-10) if(m_volmd.volType != BASE_LAYER) updateBuffVOPsEnhc (); return TRUE;}Int CVideoObjectDecoder::findStartCode(int dontloop){ // ensure byte alignment m_pbitstrmIn->flush (); Int bUserData; do { bUserData = 0; while(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_PREFIX)!=START_CODE_PREFIX) { m_pbitstrmIn->getBits(8); if(m_pbitstrmIn->eof()==EOF || dontloop != 0) return EOF; } m_pbitstrmIn->getBits(NUMBITS_START_CODE_PREFIX); if(m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==USER_DATA_START_CODE) bUserData = 1; } while(bUserData); return 0;}Void CVideoObjectDecoder::decodeVOHead (){ findStartCode(); // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)(for Skip Session_Start_Code) if( m_pbitstrmIn->peekBits(NUMBITS_START_CODE_SUFFIX)==SESSION_START_CODE){ m_pbitstrmIn -> getBits (NUMBITS_START_CODE_SUFFIX); if (findStartCode () == EOF) assert(FALSE); } // End Toshiba(1998-1-16:DP+RVLC) UInt uiVoStartCode = m_pbitstrmIn -> getBits (NUMBITS_VO_START_CODE); assert(uiVoStartCode == VO_START_CODE); decodeVOBody();}Void CVideoObjectDecoder::decodeVOBody (){ m_uiVOId = m_pbitstrmIn -> getBits (NUMBITS_VO_ID);}Void CVideoObjectDecoder::decodeVOLHead (){ findStartCode(); UInt uiVolStartCode = m_pbitstrmIn -> getBits (NUMBITS_VOL_START_CODE); assert(uiVolStartCode == VOL_START_CODE); decodeVOLBody();}Void CVideoObjectDecoder::decodeVOLBody(){ int ver_id; /* UInt uiVOLId = wmay */m_pbitstrmIn -> getBits (NUMBITS_VOL_ID);// Begin: modified by Hughes 4/9/98 per clause 2.1.7. in N2171 document /* Bool bRandom = wmay */m_pbitstrmIn->getBits (1); //VOL_Random_Access// End: modified by Hughes 4/9/98 /* UInt uiOLType = wmay*/m_pbitstrmIn -> getBits(8); // VOL_type_indication UInt uiOLI = m_pbitstrmIn -> getBits (1); //VOL_Is_Object_Layer_Identifier, useless flag for now if(uiOLI) { ver_id = m_pbitstrmIn -> getBits (4); // video_oject_layer_verid m_pbitstrmIn -> getBits (3); // video_oject_layer_priority } else { ver_id = 1; } //assert(uiOLI == 0); UInt uiAspect = m_pbitstrmIn -> getBits (4); if(uiAspect==15) // extended PAR { /* UInt iParWidth = wmay */ m_pbitstrmIn -> getBits (8); /* UInt iParHeight = wmay */ m_pbitstrmIn -> getBits (8); } UInt uiMark; UInt uiCTP = m_pbitstrmIn -> getBits (1); //VOL_Control_Parameter, useless flag for now if(uiCTP) { /* UInt uiChromaFormat = wmay */ m_pbitstrmIn -> getBits (2); /* UInt uiLowDelay = wmay */m_pbitstrmIn -> getBits (1); UInt uiVBVParams = m_pbitstrmIn -> getBits (1); if(uiVBVParams) { /* UInt uiFirstHalfBitRate = wmay */m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); /* UInt uiLatterHalfBitRate = wmay */ m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); /* UInt uiFirstHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); /* UInt uiLatterHalfVbvBufferSize = wmay */m_pbitstrmIn -> getBits (3); /* UInt uiFirstHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (11); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); /* UInt uiLatterHalfVbvBufferOccupany = wmay */m_pbitstrmIn -> getBits (15); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); } } //assert(uiCTP == 0); UInt uiAUsage = m_pbitstrmIn -> getBits (NUMBITS_VOL_SHAPE); uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); m_volmd.iClockRate = m_pbitstrmIn -> getBits (NUMBITS_TIME_RESOLUTION);#ifdef DEBUG_OUTPUT cout << m_volmd.iClockRate << "\n";#endif uiMark = m_pbitstrmIn -> getBits (1); assert(uiMark==1); Int iClockRate = m_volmd.iClockRate; assert (iClockRate >= 1 && iClockRate < 65536); for (m_iNumBitsTimeIncr = 1; m_iNumBitsTimeIncr < NUMBITS_TIME_RESOLUTION; m_iNumBitsTimeIncr++) { if (iClockRate == 1) break; iClockRate = (iClockRate >> 1); } Bool bFixFrameRate = m_pbitstrmIn -> getBits (1); //assert (bFixFrameRate == FALSE); if(bFixFrameRate) { UInt uiFixedVOPTimeIncrement = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr); m_volmd.iClockRate = m_volmd.iClockRate / uiFixedVOPTimeIncrement; // not used // // } if(uiAUsage==2) // shape-only mode { /* UInt uiResyncMarkerDisable = wmay */m_pbitstrmIn -> getBits (1); // default to some values - probably not all needed m_volmd.bShapeOnly=TRUE; m_volmd.fAUsage=ONE_BIT; m_volmd.bAdvPredDisable = 0; m_volmd.fQuantizer = Q_H263; m_volmd.volType = BASE_LAYER; m_volmd.bDeblockFilterDisable = TRUE; m_uiSprite = 0; m_volmd.bNot8Bit = 0; m_volmd.bComplexityEstimationDisable = 1; m_volmd.bDataPartitioning = 0; m_volmd.bReversibleVlc = FALSE; m_volmd.bDeblockFilterDisable = TRUE; return; } m_volmd.bShapeOnly=FALSE; if(uiAUsage==3) uiAUsage=2; m_volmd.fAUsage = (AlphaUsage) uiAUsage; if (m_volmd.fAUsage == RECTANGLE) { UInt uiMarker = m_pbitstrmIn -> getBits (1); //wmay for divx assert(uiMarker==1); m_ivolWidth = m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH); uiMarker = m_pbitstrmIn -> getBits (1); // wmay for divx assert(uiMarker==1); m_ivolHeight = m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT); uiMarker = m_pbitstrmIn -> getBits (1); // wmay for dixv assert(uiMarker==1); } m_vopmd.bInterlace = m_pbitstrmIn -> getBits (1); // interlace (was vop flag) m_volmd.bAdvPredDisable = m_pbitstrmIn -> getBits (1); //VOL_obmc_Disable // decode sprite info // wmay m_uiSprite = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_USAGE); m_uiSprite = m_pbitstrmIn->getBits(ver_id == 1 ? 1 : 2); if (m_uiSprite == 1) { // sprite information Int isprite_hdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_HDIM); Int iMarker = m_pbitstrmIn -> getBits (MARKER_BIT); assert (iMarker == 1); Int isprite_vdim = m_pbitstrmIn -> getBits (NUMBITS_SPRITE_VDIM); iMarker = m_pbitstrmIn -> getBits (MARKER_BIT); assert (iMarker == 1); Int isprite_left_edge = (m_pbitstrmIn -> getBits (1) == 0) ? m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12)); assert(isprite_left_edge%2 == 0); iMarker = m_pbitstrmIn -> getBits (MARKER_BIT); assert (iMarker == 1); Int isprite_top_edge = (m_pbitstrmIn -> getBits (1) == 0) ? m_pbitstrmIn->getBits (NUMBITS_SPRITE_TOP_EDGE - 1) : ((Int)m_pbitstrmIn->getBits (NUMBITS_SPRITE_LEFT_EDGE - 1) - (1 << 12)); assert(isprite_top_edge%2 == 0); iMarker = m_pbitstrmIn -> getBits (MARKER_BIT); assert (iMarker == 1); m_rctSpt.left = isprite_left_edge; m_rctSpt.right = isprite_left_edge + isprite_hdim; m_rctSpt.top = isprite_top_edge; m_rctSpt.bottom = isprite_top_edge + isprite_vdim; m_rctSpt.width = isprite_hdim; m_rctSptPieceY = m_rctSpt; //initialization; will be overwritten by first vop header m_iNumOfPnts = m_pbitstrmIn -> getBits (NUMBITS_NUM_SPRITE_POINTS); m_rgstSrcQ = new CSiteD [m_iNumOfPnts]; m_rgstDstQ = new CSiteD [m_iNumOfPnts]; m_uiWarpingAccuracy = m_pbitstrmIn -> getBits (NUMBITS_WARPING_ACCURACY); /* Bool bLightChange = wmay */m_pbitstrmIn -> getBits (1);// Begin: modified by Hughes 4/9/98 Bool bsptMode = m_pbitstrmIn -> getBits (1); // Low_latency_sprite_enable if ( bsptMode) m_sptMode = LOW_LATENCY ; else m_sptMode = BASIC_SPRITE ;// End: modified by Hughes 4/9/98 } m_volmd.bNot8Bit = (Bool) m_pbitstrmIn -> getBits(1); if (m_volmd.bNot8Bit) { m_volmd.uiQuantPrecision = (UInt) m_pbitstrmIn -> getBits (4); m_volmd.nBits = (UInt) m_pbitstrmIn -> getBits (4); assert(m_volmd.nBits>3); } else { m_volmd.uiQuantPrecision = 5; m_volmd.nBits = 8; } if (m_volmd.fAUsage == EIGHT_BIT) { m_volmd.bNoGrayQuantUpdate = m_pbitstrmIn -> getBits (1); /* UInt uiCompMethod = wmay */m_pbitstrmIn -> getBits (1); /* UInt uiLinearComp = wmay */m_pbitstrmIn -> getBits (1); } m_volmd.fQuantizer = (Quantizer) m_pbitstrmIn -> getBits (1); if (m_volmd.fQuantizer == Q_MPEG) { m_volmd.bLoadIntraMatrix = m_pbitstrmIn -> getBits (1); if (m_volmd.bLoadIntraMatrix) { UInt i = 0; Int iElem; do { iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX); m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i]] = iElem; } while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE); for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) { m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiIntraQuantizerMatrix [grgiStandardZigzag[i - 1]]; } } else { memcpy (m_volmd.rgiIntraQuantizerMatrix, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int)); } m_volmd.bLoadInterMatrix = m_pbitstrmIn -> getBits (1); if (m_volmd.bLoadInterMatrix) { UInt i = 0; Int iElem; do { iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX); m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i]] = iElem; } while (iElem != 0 && ++i < BLOCK_SQUARE_SIZE); for (UInt j = i; j < BLOCK_SQUARE_SIZE; j++) { m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[j]] = m_volmd.rgiInterQuantizerMatrix [grgiStandardZigzag[i - 1]]; } } else { memcpy (m_volmd.rgiInterQuantizerMatrix, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int)); } if (m_volmd.fAUsage == EIGHT_BIT) { m_volmd.bLoadIntraMatrixAlpha = m_pbitstrmIn -> getBits (1); if (m_volmd.bLoadIntraMatrixAlpha) { for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) { Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX); if (iElem != 0) m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem; else m_volmd.rgiIntraQuantizerMatrixAlpha [i] = m_volmd.rgiIntraQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]]; } } else {#ifdef _FOR_GSSP_ memcpy (m_volmd.rgiIntraQuantizerMatrixAlpha, rgiDefaultIntraQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));#else for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) m_volmd.rgiIntraQuantizerMatrixAlpha [i] = 16;#endif } m_volmd.bLoadInterMatrixAlpha = m_pbitstrmIn -> getBits (1); if (m_volmd.bLoadInterMatrixAlpha) { for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) { Int iElem = m_pbitstrmIn -> getBits (NUMBITS_QMATRIX); if (iElem != 0) m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i]] = iElem; else m_volmd.rgiInterQuantizerMatrixAlpha [i] = m_volmd.rgiInterQuantizerMatrixAlpha [grgiStandardZigzag[i - 1]]; } } else {#ifdef _FOR_GSSP_ memcpy (m_volmd.rgiInterQuantizerMatrixAlpha, rgiDefaultInterQMatrix, BLOCK_SQUARE_SIZE * sizeof (Int));#else for (UInt i = 0; i < BLOCK_SQUARE_SIZE; i++) m_volmd.rgiInterQuantizerMatrixAlpha [i] = 16;#endif } } } if (ver_id != 1) // wmay m_pbitstrmIn->getBits(1); // wmay vol quarter pixel // Bool bComplxityEsti = m_pbitstrmIn->getBits (1); //Complexity estimation; don't know how to use it// START: Complexity Estimation syntax support - Marc Mongenet (EPFL) - 15 Jun 1998 m_volmd.bComplexityEstimationDisable = m_pbitstrmIn -> getBits (1); if (! m_volmd.bComplexityEstimationDisable) { m_volmd.iEstimationMethod = m_pbitstrmIn -> getBits (2); if (m_volmd.iEstimationMethod != 0) { fprintf (stderr, "ERROR: Unknown complexity estimation method number %d.\n", m_volmd.iEstimationMethod); exit (1); } m_volmd.bShapeComplexityEstimationDisable = m_pbitstrmIn -> getBits (1); if (! m_volmd.bShapeComplexityEstimationDisable) { m_volmd.bOpaque = m_pbitstrmIn -> getBits (1); m_volmd.bTransparent = m_pbitstrmIn -> getBits (1); m_volmd.bIntraCAE = m_pbitstrmIn -> getBits (1); m_volmd.bInterCAE = m_pbitstrmIn -> getBits (1); m_volmd.bNoUpdate = m_pbitstrmIn -> getBits (1); m_volmd.bUpsampling = m_pbitstrmIn -> getBits (1); if (!(m_volmd.bOpaque || m_volmd.bTransparent || m_volmd.bIntraCAE || m_volmd.bInterCAE || m_volmd.bNoUpdate || m_volmd.bUpsampling)) { fatal_error("Shape complexity estimation is enabled,\nbut no correponding flag is enabled."); } } else m_volmd.bOpaque = m_volmd.bTransparent = m_volmd.bIntraCAE = m_volmd.bInterCAE = m_volmd.bNoUpdate = m_volmd.bUpsampling = false; m_volmd.bTextureComplexityEstimationSet1Disable = m_pbitstrmIn -> getBits (1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -