ErrVal RecPicBuffer::xCheckMissingPics( SliceHeader* pcSliceHeader, PicBufferList& rcOutputList, PicBufferList& rcUnusedList ) { ROTRS( pcSliceHeader->isIdrNalUnit(), Err::m_nOK ); ROTRS( ( ( m_uiLastRefFrameNum + 1 ) % m_uiMaxFrameNum ) == pcSliceHeader->getFrameNum(), Err::m_nOK ); UInt uiMissingFrames = pcSliceHeader->getFrameNum() - m_uiLastRefFrameNum - 1; if( pcSliceHeader->getFrameNum() <= m_uiLastRefFrameNum ) { uiMissingFrames += m_uiMaxFrameNum; } ROF( pcSliceHeader->getSPS().getRequiredFrameNumUpdateBehaviourFlag() ); for( UInt uiIndex = 1; uiIndex <= uiMissingFrames; uiIndex++ ) { Bool bTreatAsIdr = ( m_cUsedRecPicBufUnitList.empty() ); Int iPoc = ( bTreatAsIdr ? 0 : m_cUsedRecPicBufUnitList.back()->getPoc() ); UInt uiFrameNum = ( m_uiLastRefFrameNum + uiIndex ) % m_uiMaxFrameNum; RNOK( m_pcCurrRecPicBufUnit->initNonEx( iPoc, uiFrameNum ) ); RNOK( xStorePicture( m_pcCurrRecPicBufUnit, rcOutputList, rcUnusedList, pcSliceHeader, bTreatAsIdr ) ); } m_uiLastRefFrameNum = ( m_uiLastRefFrameNum + uiMissingFrames ) % m_uiMaxFrameNum; return Err::m_nOK; }
ErrVal VUI::ChromaLocationInfo::read( HeaderSymbolReadIf *pcReadIf ) { RNOKS( pcReadIf->getFlag( m_bChromaLocationInfoPresentFlag, "VUI: chroma_location_info_present_flag")); ROFRS( m_bChromaLocationInfoPresentFlag, Err::m_nOK ); RNOKS( pcReadIf->getUvlc( m_uiChromaLocationFrame, "VUI: chroma_location_frame")); ROTRS( m_uiChromaLocationFrame>3, Err::m_nInvalidParameter); RNOKS( pcReadIf->getUvlc( m_uiChromaLocationField, "VUI: chroma_location_field")); ROTRS( m_uiChromaLocationField>3, Err::m_nInvalidParameter); return Err::m_nOK; }
const MbData& MbDataCtrl::xGetRefMbData( UInt uiSliceId, Int uiCurrSliceID, Int iMbY, Int iMbX, Bool bLoopFilter ) { // check whether ref mb is inside ROTRS( iMbX < 0, xGetOutMbData() ); ROTRS( iMbY < 0, xGetOutMbData() ); ROTRS( iMbX >= m_iMbPerLine, xGetOutMbData() ); ROTRS( iMbY >= m_iMbPerColumn, xGetOutMbData() ); //--ICU/ETRI FMO Implementation ROTRS( uiCurrSliceID != getSliceGroupIDofMb(iMbY * (m_uiMbStride>>(UInt)m_pcSliceHeader->getFieldPicFlag()) + iMbX/* + m_uiMbOffset*/ ) , xGetOutMbData() ); // get the ref mb data const MbData& rcMbData = getMbData( iMbY * m_uiMbStride + iMbX + m_uiMbOffset ); // test slice id return (( rcMbData.getSliceId() == uiSliceId || bLoopFilter ) ? rcMbData : xGetOutMbData() ); }
ErrVal PictureParameterSet::xReadFrext( HeaderSymbolReadIf* pcReadIf ) { const CommonMainH264* pcMainH264 = CommonMain::getMainH264(); ASSERT(pcMainH264 != NULL); const CommonElt* pcCurrent = pcMainH264->getEltCurrent(); const CommonSyntax* pcSyntax; const CommonControl* pcControlIf0 = pcCurrent->addControl("if" , "more_rbsp_data", pcReadIf->moreRBSPData()); ROTRS( ! pcReadIf->moreRBSPData(), Err::m_nOK ); pcSyntax = pcCurrent->addSyntax("transform_8x8_mode_flag", "u(1)"); RNOK ( pcReadIf->getFlag ( m_bTransform8x8ModeFlag, "PPS: transform_8x8_mode_flag" ) ); pcSyntax->setValue(m_bTransform8x8ModeFlag); pcSyntax = pcCurrent->addSyntax("pic_scaling_matrix_present_flag", "u(1)"); RNOK ( pcReadIf->getFlag ( m_bPicScalingMatrixPresentFlag, "PPS: pic_scaling_matrix_present_flag" ) ); pcSyntax->setValue(m_bPicScalingMatrixPresentFlag); const CommonControl* pcControlIf1 = pcCurrent->addControl("if" , "pic_scaling_matrix_present_flag", m_bPicScalingMatrixPresentFlag); if( m_bPicScalingMatrixPresentFlag ) { pcMainH264->setEltCurrent(pcControlIf1); RNOK( m_cPicScalingMatrix.read( pcReadIf, m_bTransform8x8ModeFlag ) ); pcMainH264->setEltCurrent(pcCurrent); } pcSyntax = pcCurrent->addSyntax("second_chroma_qp_index_offset", "se(v)"); RNOK ( pcReadIf->getSvlc ( m_iSecondChromaQpIndexOffset, "PPS: second_chroma_qp_index_offset" ) ); pcSyntax->setValue(m_iSecondChromaQpIndexOffset); ROT ( m_iSecondChromaQpIndexOffset < -12 || m_iSecondChromaQpIndexOffset > 12 ); return Err::m_nOK; }
ErrVal MbDecoder::xDecodeChroma( MbDataAccess& rcMbDataAccess, YuvMbBuffer& rcRecYuvBuffer, UInt uiChromaCbp, Bool bPredChroma ) { MbTransformCoeffs& rcCoeffs = m_cTCoeffs; Pel* pucCb = rcRecYuvBuffer.getMbCbAddr(); Pel* pucCr = rcRecYuvBuffer.getMbCrAddr(); Int iStride = rcRecYuvBuffer.getCStride(); if( bPredChroma ) { RNOK( m_pcIntraPrediction->predictChromaBlock( pucCb, pucCr, iStride, rcMbDataAccess.getMbData().getChromaPredMode() ) ); } ROTRS( 0 == uiChromaCbp, Err::m_nOK ); Int iScale; Bool bIntra = rcMbDataAccess.getMbData().isIntra(); UInt uiUScalId = ( bIntra ? 1 : 4 ); UInt uiVScalId = ( bIntra ? 2 : 5 ); const UChar* pucScaleU = rcMbDataAccess.getSH().getScalingMatrix( uiUScalId ); const UChar* pucScaleV = rcMbDataAccess.getSH().getScalingMatrix( uiVScalId ); // scaling has already been performed on DC coefficients iScale = ( pucScaleU ? pucScaleU[0] : 16 ); m_pcTransform->invTransformChromaDc( rcCoeffs.get( CIdx(0) ), iScale ); iScale = ( pucScaleV ? pucScaleV[0] : 16 ); m_pcTransform->invTransformChromaDc( rcCoeffs.get( CIdx(4) ), iScale ); RNOK( m_pcTransform->invTransformChromaBlocks( pucCb, iStride, rcCoeffs.get( CIdx(0) ) ) ); RNOK( m_pcTransform->invTransformChromaBlocks( pucCr, iStride, rcCoeffs.get( CIdx(4) ) ) ); return Err::m_nOK; }
ErrVal VUI::AspectRatioInfo::read( HeaderSymbolReadIf *pcReadIf ) { RNOKS( pcReadIf->getFlag( m_bAspectRatioInfoPresentFlag, "VUI: aspect_ratio_info_present_flag")); ROFRS( m_bAspectRatioInfoPresentFlag, Err::m_nOK ); RNOKS( pcReadIf->getCode( m_uiAspectRatioIdc, 8, "VUI: aspect_ratio_idc")); if( m_uiAspectRatioIdc == 0xFF ) //Extendet_SAR { RNOKS( pcReadIf->getCode( m_uiSarWith, 16, "VUI: sar_width")); ROTRS(0 == m_uiSarWith, Err::m_nInvalidParameter); RNOKS( pcReadIf->getCode( m_uiSarHeight, 16, "VUI: sar_height")); ROTRS(0 == m_uiSarHeight, Err::m_nInvalidParameter); } return Err::m_nOK; }
ErrVal Frame::store( PicBuffer* pcPicBuffer, PicType ePicType ) { ASSERT( m_ePicType == FRAME ); RNOK ( getFullPelYuvBuffer()->storeToPicBuffer ( pcPicBuffer ) ); ROTRS ( ePicType == FRAME, Err::m_nOK ); RNOK ( getFullPelYuvBuffer()->interpolatedPicBuffer( pcPicBuffer, ePicType == TOP_FIELD ) ); return Err::m_nOK; }
//ErrVal ControlMngH264AVCDecoder::initSlice0( SliceHeader *rcSH ) ErrVal ControlMngH264AVCDecoder::initSlice0( SliceHeader *rcSH, UInt NumOfViewsInTheStream ) { UInt uiLayer = rcSH->getLayerId (); ROTRS( ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR) && m_uiInitilized[uiLayer], Err::m_nOK ); ROTRS( ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE) && m_uiInitilized_MultiView[uiLayer], Err::m_nOK ); m_auiMbXinFrame[uiLayer] = rcSH->getSPS().getFrameWidthInMbs (); m_auiMbYinFrame[uiLayer] = rcSH->getSPS().getFrameHeightInMbs (); UInt uiSizeX = m_auiMbXinFrame [uiLayer] << 4; UInt uiSizeY = m_auiMbYinFrame [uiLayer] << 4; RNOK( m_apcYuvFullPelBufferCtrl [uiLayer]->initSlice( uiSizeY, uiSizeX, YUV_Y_MARGIN, YUV_X_MARGIN ) ); if( uiLayer == 0 ) { m_bLayer0IsAVC = ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR); //RNOK( m_pcFrameMng->initSlice ( rcSH ) ); RNOK( m_pcFrameMng->initSlice ( rcSH, NumOfViewsInTheStream ) ); m_pcH264AVCDecoder->setReconstructionLayerId( uiLayer ); m_pcH264AVCDecoder->setBaseAVCCompatible ( m_bLayer0IsAVC ); } else { m_pcH264AVCDecoder->setReconstructionLayerId( uiLayer ); } if( (rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE) && rcSH->getTrueSlice())//TMM_EC { } RNOK( xInitESS( rcSH ) ); if ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR) m_uiInitilized[uiLayer] = true; if ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE) m_uiInitilized_MultiView[uiLayer] = true; return Err::m_nOK; }
Bool RefPicIdc::isValid() const { ROTRS( m_ePicType == NOT_SPECIFIED, false ); const Frame* pcFrame = m_pcFrame->getPic( m_ePicType ); AOF ( pcFrame ); ROFRS( pcFrame->getPoc() == m_iPoc, false ); return true; }
ErrVal ControlMngH264AVCDecoder::initSlice0( SliceHeader *rcSH ) { UInt uiLayer = rcSH->getLayerId (); /* //JVT-T054{ if(rcSH->getBaseLayerId() != MSYS_UINT_MAX && rcSH->getQualityLevel() != 0) { if( !m_apcMCTFDecoder[uiLayer]->isActive()) { m_apcMCTFDecoder[uiLayer]->initSlice0( rcSH ); } //if(!m_apcMCTFDecoder[uiLayer]->getResizeParameters()) RNOK( xInitESS( rcSH ) ); return Err::m_nOK; } //JVT-T054} */ ROTRS( m_uiInitilized[uiLayer], Err::m_nOK ); m_auiMbXinFrame[uiLayer] = rcSH->getSPS().getFrameWidthInMbs (); m_auiMbYinFrame[uiLayer] = rcSH->getSPS().getFrameHeightInMbs (); UInt uiSizeX = m_auiMbXinFrame [uiLayer] << 4; UInt uiSizeY = m_auiMbYinFrame [uiLayer] << 4; RNOK( m_apcYuvFullPelBufferCtrl [uiLayer]->initSlice( uiSizeY, uiSizeX, YUV_Y_MARGIN, YUV_X_MARGIN ) ); if( uiLayer == 0 ) { m_bLayer0IsAVC = ( rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR); RNOK( m_pcFrameMng->initSlice ( rcSH ) ); m_pcH264AVCDecoder->setReconstructionLayerId( uiLayer ); m_pcH264AVCDecoder->setBaseAVCCompatible ( m_bLayer0IsAVC ); } else { m_pcH264AVCDecoder->setReconstructionLayerId( uiLayer ); } if( (rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || rcSH->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE) && rcSH->getTrueSlice())//TMM_EC { /* if(!rcSH->getSvcMvcFlag() ) m_apcMCTFDecoder[uiLayer]->initSlice0( rcSH ); */ } RNOK( xInitESS( rcSH ) ); m_uiInitilized[uiLayer] = true; return Err::m_nOK; }
Bool MbTransformCoeffs::allLevelsAndPredictionsZero() const { const TCoeff* pcDst = get( B4x4Idx(0) ); for( UInt ui = 0; ui < 384; ui++ ) { ROTRS( pcDst[ui].getLevel() || pcDst[ui].getSPred(), false ); } return true; }
Bool MbTransformCoeffs::allCoeffsZero() const { const TCoeff* pcDst = get( B4x4Idx(0) ); for( UInt ui = 0; ui < 384; ui++ ) { ROTRS( pcDst[ui].getCoeff(), false ); } return true; }
ErrVal MbDecoder::compensatePrediction( MbDataAccess& rcMbDataAccess ) { ROTRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK ); IntYuvMbBuffer cIntYuvMbBuffer; YuvMbBuffer cYuvMbBuffer; RNOK( m_pcMotionCompensation->compensateMb( rcMbDataAccess, &cYuvMbBuffer, false, false ) ); cIntYuvMbBuffer.loadBuffer( &cYuvMbBuffer ); RNOK( m_pcFrameMng->getPredictionIntFrame()->getFullPelYuvBuffer()->loadBuffer( &cIntYuvMbBuffer ) ); return Err::m_nOK; }
ErrVal VUI::BitstreamRestriction::read( HeaderSymbolReadIf *pcReadIf ) { RNOKS( pcReadIf->getFlag( m_bBitstreamRestrictionFlag, "VUI: bitstream_restriction_flag")); ROFRS( m_bBitstreamRestrictionFlag, Err::m_nOK ); RNOKS( pcReadIf->getFlag( m_bMotionVectorsOverPicBoundariesFlag, "VUI: motion_vectors_over_pic_boundaries_flag")); RNOKS( pcReadIf->getUvlc( m_uiMaxBytesPerPicDenom, "VUI: max_bytes_per_pic_denom")); ROTRS( m_uiMaxBytesPerPicDenom > 16, Err::m_nInvalidParameter ); RNOKS( pcReadIf->getUvlc( m_uiMaxBitsPerMbDenom, "VUI: max_bits_per_mb_denom")); ROTRS( m_uiMaxBitsPerMbDenom > 16, Err::m_nInvalidParameter ); RNOKS( pcReadIf->getUvlc( m_uiLog2MaxMvLengthHorizontal, "VUI: log2_max_mv_length_horizontal")); ROTRS( m_uiLog2MaxMvLengthHorizontal > 16, Err::m_nInvalidParameter ); RNOKS( pcReadIf->getUvlc( m_uiLog2MaxMvLengthVertical, "VUI: log2_max_mv_length_vertical")); ROTRS( m_uiLog2MaxMvLengthVertical > 16, Err::m_nInvalidParameter ); RNOKS( pcReadIf->getUvlc( m_uiMaxDecFrameReordering, "VUI: max_dec_frame_reordering")); UInt uiTmp; RNOKS( pcReadIf->getUvlc( uiTmp, "VUI: max_dec_frame_buffering")); ROTRS(uiTmp>16, Err::m_nInvalidParameter); ROTRS(getMaxDecFrameReordering() > uiTmp, Err::m_nInvalidParameter); setMaxDecFrameBuffering(uiTmp); return Err::m_nOK; }
ErrVal CabaEncoder::writeUnarySymbol( UInt uiSymbol, CabacContextModel* pcCCModel, Int iOffset ) { RNOK( writeSymbol( uiSymbol ? 1 : 0, pcCCModel[0] ) ); ROTRS( 0 == uiSymbol, Err::m_nOK ); while( uiSymbol-- ) { RNOK( writeSymbol( uiSymbol ? 1 : 0, pcCCModel[ iOffset ] ) ); } return Err::m_nOK; }
ErrVal MbParser::xScanChromaBlocks( MbDataAccess& rcMbDataAccess, UInt uiChromCbp, UInt uiStart, UInt uiStop ) { ROTRS( 1 > uiChromCbp, Err::m_nOK ); if( uiStart == 0 ) { DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_DC, uiStart, uiStop ) ); DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_DC, uiStart, uiStop ) ); } ROTRS( 2 > uiChromCbp, Err::m_nOK ); for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ ) { if( uiStop > 1 ) { DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cCIdx, CHROMA_AC, uiStart, uiStop ) ); } } return Err::m_nOK; }
ErrVal ScalingMatrix::read( HeaderSymbolReadIf* pcReadIf, Bool bRead8x8 ) { for( Int i4x4 = 0; i4x4 < 6; i4x4++ ) { RNOK( m_acScalingMatrix4x4.get(i4x4).read( pcReadIf, g_aucFrameScan ) ); } ROTRS( ! bRead8x8, Err::m_nOK ); RNOK ( m_acScalingMatrix8x8.get(0 ).read( pcReadIf, g_aucFrameScan64 ) ); RNOK ( m_acScalingMatrix8x8.get(1 ).read( pcReadIf, g_aucFrameScan64 ) ); return Err::m_nOK; }
Bool MbDataStruct::is8x8TrafoFlagPresent( Bool bDirect8x8Inference ) const { ROTRS( m_eMbMode == INTRA_BL, true ); ROTRS( m_eMbMode > INTRA_4X4, false ); ROTRS( MODE_SKIP == m_eMbMode, bDirect8x8Inference ); if( ( MODE_8x8 == m_eMbMode ) || ( MODE_8x8ref0 == m_eMbMode ) ) { for( UInt n = 0; n < 4; n++ ) { if( BLK_8x8 != m_aBlkMode[n] && BLK_SKIP != m_aBlkMode[n] ) { return false; } if( BLK_SKIP == m_aBlkMode[n] && !bDirect8x8Inference ) { return false; } } } return true; }
// JVT-V043 and some cleanup ErrVal RecPicBuffer::getRefLists( RefFrameList& rcList0, RefFrameList& rcList1, SliceHeader& rcSliceHeader, QuarterPelFilter* pcQuarterPelFilter) { //===== clear lists ===== RefFrameList rcListTemp0, rcListTemp1; rcList0.reset(); rcList1.reset(); ROTRS( rcSliceHeader.isIntra(), Err::m_nOK ); PicType ePicType = rcSliceHeader.getPicType(); if( rcSliceHeader.isInterP() ) { RNOK( xInitRefListPSlice ( rcListTemp0 , ePicType, rcSliceHeader.getNalRefIdc()>0) ); ProcessRef(rcSliceHeader,rcList0,rcListTemp0,pcQuarterPelFilter);//lufeng AddMultiviewRef (m_cUsedRecPicBufUnitList, rcList0, rcSliceHeader.getNumRefIdxActive(LIST_0), FORWARD, rcSliceHeader, pcQuarterPelFilter);//JVT-W056 Samsung RNOK( xRefListRemapping ( rcList0, LIST_0, &rcSliceHeader ) ); RNOK( xAdaptListSize ( rcList0, LIST_0, rcSliceHeader ) ); RNOK( xDumpRefList ( rcList0, LIST_0 ) ); } else // rcSliceHeader.isInterB() { RNOK( xInitRefListsBSlice ( rcListTemp0, rcListTemp1 , ePicType , rcSliceHeader.getNalRefIdc()>0) ); ProcessRef(rcSliceHeader,rcList0,rcListTemp0,pcQuarterPelFilter);//lufeng ProcessRef(rcSliceHeader,rcList1,rcListTemp1,pcQuarterPelFilter);//lufeng AddMultiviewRef(m_cUsedRecPicBufUnitList, rcList0, rcSliceHeader.getNumRefIdxActive(LIST_0), FORWARD, rcSliceHeader, pcQuarterPelFilter);//JVT-W056 Samsung AddMultiviewRef(m_cUsedRecPicBufUnitList, rcList1, rcSliceHeader.getNumRefIdxActive(LIST_1), BACKWARD, rcSliceHeader, pcQuarterPelFilter);//JVT-W056 Samsung RNOK( xRefListRemapping ( rcList0, LIST_0, &rcSliceHeader ) ); RNOK( xRefListRemapping ( rcList1, LIST_1, &rcSliceHeader ) ); RNOK( xAdaptListSize ( rcList0, LIST_0, rcSliceHeader ) ); RNOK( xAdaptListSize ( rcList1, LIST_1, rcSliceHeader ) ); RNOK( xDumpRefList ( rcList0, LIST_0 ) ); RNOK( xDumpRefList ( rcList1, LIST_1 ) ); } return Err::m_nOK; }
ErrVal ScalingMatrix::write( HeaderSymbolWriteIf* pcWriteIf, Bool bWrite8x8 ) const { for( Int i4x4 = 0; i4x4 < 6; i4x4++ ) { RNOK( m_acScalingMatrix4x4[i4x4].write( pcWriteIf, g_aucFrameScan ) ); } ROTRS( ! bWrite8x8, Err::m_nOK ); for( Int i8x8 = 0; i8x8 < 2; i8x8++ ) { RNOK( m_acScalingMatrix8x8[i8x8].write( pcWriteIf, g_aucFrameScan64 ) ); } return Err::m_nOK; }
ErrVal RecPicBuffer::xSlidingWindow() { //===== get number of reference frames ===== UInt uiCurrNumRefFrames = 0; RecPicBufUnitList::iterator iter = m_cUsedRecPicBufUnitList.begin(); RecPicBufUnitList::iterator end = m_cUsedRecPicBufUnitList.end (); for( ; iter != end; iter++ ) { if( (*iter)->isNeededForRef() ) { uiCurrNumRefFrames++; } } ROTRS( uiCurrNumRefFrames <= m_uiNumRefFrames, Err::m_nOK ); //===== sliding window reference picture update ===== //--- look for last ref frame that shall be removed --- UInt uiRefFramesToRemove = uiCurrNumRefFrames - m_uiNumRefFrames; iter = m_cUsedRecPicBufUnitList.begin(); for( ; iter != end; iter++ ) { if( (*iter)->isNeededForRef() ) { uiRefFramesToRemove--; if( uiRefFramesToRemove == 0 ) { break; } } } ROT( uiRefFramesToRemove ); //--- delete reference label --- end = ++iter; iter = m_cUsedRecPicBufUnitList.begin(); for( ; iter != end; iter++ ) { if( (*iter)->isNeededForRef() ) { RNOK( (*iter)->markNonRef() ); } } return Err::m_nOK; }
ErrVal CabaEncoder::writeUnaryMaxSymbol( UInt uiSymbol, CabacContextModel* pcCCModel, Int iOffset, UInt uiMaxSymbol ) { RNOK( writeSymbol( uiSymbol ? 1 : 0, pcCCModel[ 0 ] ) ); ROTRS( 0 == uiSymbol, Err::m_nOK ); Bool bCodeLast = ( uiMaxSymbol > uiSymbol ); while( --uiSymbol ) { RNOK( writeSymbol( 1, pcCCModel[ iOffset ] ) ); } if( bCodeLast ) { RNOK( writeSymbol( 0, pcCCModel[ iOffset ] ) ); } return Err::m_nOK; }
ErrVal RecPicBuffer::xUpdateMemory( SliceHeader* pcSliceHeader ) { ROTRS( pcSliceHeader && pcSliceHeader->getNalRefIdc() == NAL_REF_IDC_PRIORITY_LOWEST, Err::m_nOK ); if( pcSliceHeader && pcSliceHeader->getAdaptiveRefPicBufferingFlag() ) { RNOK( xMMCO( pcSliceHeader ) ); } else { RNOK( xSlidingWindow() ); } //===== clear buffer -> remove non-ref pictures ===== RNOK( xClearBuffer() ); return Err::m_nOK; }
ErrVal MbCoder::encodeMotion( MbDataAccess& rcMbDataAccess, MbDataAccess* pcMbDataAccessBase ) { ROT( rcMbDataAccess.getMbData().isIntra() ); //===== base mode flag ===== RNOK( m_pcMbSymbolWriteIf->BLSkipFlag( rcMbDataAccess ) ); ROTRS( rcMbDataAccess.getMbData().getBLSkipFlag(), Err::m_nOK ); //===== macroblock mode ===== RNOK( m_pcMbSymbolWriteIf->mbMode( rcMbDataAccess ) ); //===== BLOCK MODES ===== if( rcMbDataAccess.getMbData().isInter8x8() ) { RNOK( m_pcMbSymbolWriteIf->blockModes( rcMbDataAccess ) ); } //===== MOTION INFORMATION ===== MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode(); if( rcMbDataAccess.getSH().isInterB() ) { RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) ); RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_1 ) ); RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_0 ) ); RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_1 ) ); RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) ); RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_1 ) ); } else { RNOK( xWriteMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) ); RNOK( xWriteReferenceFrames ( rcMbDataAccess, eMbMode, LIST_0 ) ); RNOK( xWriteMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) ); } //===== residual prediction flag ===== Bool bBaseCoeff = ( pcMbDataAccessBase->getMbData().getMbCbp() != 0 ); RNOK( m_pcMbSymbolWriteIf->resPredFlag_FGS( rcMbDataAccess, bBaseCoeff ) ); return Err::m_nOK; }
ErrVal BitReadBuffer::get( UInt& ruiBits ) { if( 0 == m_uiBitsLeft ) { return Err::m_nEndOfStream; } m_uiBitsLeft --; m_iValidBits --; // mask out the value ruiBits = m_ulCurrentBits >> 31; //prepare for next access m_ulCurrentBits <<= 1; // check the current word for beeing empty ROTRS( 0 < m_iValidBits, Err::m_nOK ); xReadNextWord(); return Err::m_nOK; }
ErrVal WriteBitstreamToFile::writePacket( BinDataAccessor* pcBinDataAccessor, Bool bNewAU ) { ROTRS( NULL == pcBinDataAccessor, Err::m_nOK ); if( bNewAU && m_bNewFileOnNewAu ) { #if defined MSYS_WIN32 if( m_cFile.is_open() ) { RNOK( m_cFile.close() ); } std::string cFileName = m_cFileName; Int iPos = (Int)cFileName.find_last_of("."); Char acBuffer[20]; itoa( ++m_uiNumber, acBuffer, 10 ); cFileName.insert( iPos, acBuffer ); if( Err::m_nOK != m_cFile.open( cFileName, LargeFile::OM_WRITEONLY ) ) { std::cerr << "Failed to create output bitstream " << cFileName.data() << std::endl; return Err::m_nERR; } #else std::cerr << "multiple output bitstreams only supported in Win32"; AF(); #endif } if( 0 != pcBinDataAccessor->size()) { RNOK( m_cFile.write( pcBinDataAccessor->data(), pcBinDataAccessor->size() ) ); } return Err::m_nOK; }
ErrVal MbParser::xReadMotionPredFlags( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { ROTRS( rcMbDataAccess.getSH ().getNoInterLayerPredFlag(), Err::m_nOK ); ROFRS( rcMbDataAccess.getMbData ().getInCropWindowFlag(), Err::m_nOK ); MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx ); rcMbMotionData.setMotPredFlag( rcMbDataAccess.getSH().getDefaultMotionPredictionFlag() ); ROFRS ( rcMbDataAccess.getSH().getAdaptiveMotionPredictionFlag(), Err::m_nOK ); //--- clear --- rcMbMotionData.setMotPredFlag( false ); if( rcMbDataAccess.getMbData().isIntra() ) { return Err::m_nOK; } switch( eMbMode ) { case MODE_SKIP: { break; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx ) ); } break; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } break; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_1 ) ); } break; } case MODE_8x8: case MODE_8x8ref0: { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode ( c8x8Idx.b8x8Index() ) && rcMbDataAccess .getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) ); } } break; } default: { AF(); return Err::m_nERR; } } return Err::m_nOK; }
ErrVal MbDataCtrl::getBoundaryMask( Int iMbY, Int iMbX, UInt& ruiMask ) const { UInt uiCurrIdx = iMbY * m_uiMbStride + iMbX + m_uiMbOffset; AOT( uiCurrIdx >= m_uiSize ); ruiMask = 0; ROTRS( m_pcMbData[uiCurrIdx].isIntra(), Err::m_nOK ); Bool bLeftAvailable = ( iMbX > 0 ); Bool bTopAvailable = ( iMbY > 0 ); Bool bRightAvailable = ( iMbX < m_iMbPerLine-1 ); Bool bBottomAvailable = ( iMbY < m_iMbPerColumn-1 ); if( bTopAvailable ) { { Int iIndex = uiCurrIdx - m_uiMbStride; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x01 :0; } if( bLeftAvailable ) { Int iIndex = uiCurrIdx - m_uiMbStride - 1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x80 :0; } if( bRightAvailable ) { Int iIndex = uiCurrIdx - m_uiMbStride + 1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x02 :0; } } if( bBottomAvailable ) { { Int iIndex = uiCurrIdx + m_uiMbStride; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x10 :0; } if( bLeftAvailable ) { Int iIndex = uiCurrIdx + m_uiMbStride - 1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x20 :0; } if( bRightAvailable ) { Int iIndex = uiCurrIdx + m_uiMbStride + 1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x08 :0; } } if( bLeftAvailable ) { Int iIndex = uiCurrIdx-1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x40 :0; } if( bRightAvailable ) { Int iIndex = uiCurrIdx + 1; ruiMask |= m_pcMbData[iIndex].isIntra() ? 0x04 :0; } return Err::m_nOK; }
ErrVal MbParser::xReadMotionVectors( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { ROTRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK ); switch( eMbMode ) { case MODE_SKIP: { return Err::m_nOK; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx ) ); } return Err::m_nOK; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } return Err::m_nOK; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) ) { DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_1 ) ); } return Err::m_nOK; } case MODE_8x8: case MODE_8x8ref0: { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) ) { DECRNOK( xGet8x8BlockMv( rcMbDataAccess, c8x8Idx, eLstIdx ) ); } } return Err::m_nOK; } default: { AF(); return Err::m_nERR; } } return Err::m_nERR; }
ErrVal MbParser::read( MbDataAccess& rcMbDataAccess, UInt uiNumMbRead, Bool& rbEndOfSlice, UInt& ruiNextSkippedVLC ) { const CommonMainH264* pcMainH264 = CommonMain::getMainH264(); // FIXME: if (pcMainH264->getCurrentPictureId() == 1 && pcMainH264->getCurrentLayerId() == 16 && rcMbDataAccess.getMbData().getMbAddr() == 76) { int a = 0; } ROF( m_bInitDone ); ROTRS( xCheckSkipSliceMb( rcMbDataAccess, uiNumMbRead, rbEndOfSlice ), Err::m_nOK ); Bool bIsCoded = true; if( m_pcMbSymbolReadIf->isMbSkipped( rcMbDataAccess, ruiNextSkippedVLC ) ) { bIsCoded = false; rcMbDataAccess.getMbTCoeffs().clear(); rcMbDataAccess.getMbData().clearIntraPredictionModes( true ); RNOK( xSkipMb( rcMbDataAccess ) ); rcMbDataAccess.getMbData().setBLSkipFlag( false ); rcMbDataAccess.getMbData().setResidualPredFlag( rcMbDataAccess.getMbData().getInCropWindowFlag() ? rcMbDataAccess.getSH().getDefaultResidualPredictionFlag() : false ); if( rcMbDataAccess.getSH().isBSlice() ) { rcMbDataAccess.getMbData().setFwdBwd( 0x3333 ); rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_0 ).clear(); rcMbDataAccess.getMbMotionData( LIST_1 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_1 ).clear(); } else { rcMbDataAccess.getMbData().setFwdBwd( 0x1111 ); rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_0 ).clear(); } rcMbDataAccess.resetQp(); // set QP to that of the last macroblock } if( bIsCoded ) { if( rcMbDataAccess.getSH().isMbaffFrame() && ( rcMbDataAccess.isTopMb() || m_bPrevIsSkipped ) ) { RNOK( m_pcMbSymbolReadIf->fieldFlag( rcMbDataAccess) ); } Bool bBaseLayerAvailable = ! rcMbDataAccess.getSH().getNoInterLayerPredFlag(); //===== base layer mode flag and base layer refinement flag ===== if( bBaseLayerAvailable ) { if ( rcMbDataAccess.getMbData().getInCropWindowFlag() == true ) { if( rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() ) { m_pcMbSymbolReadIf->isBLSkipped( rcMbDataAccess ); } else { rcMbDataAccess.getMbData().setBLSkipFlag( rcMbDataAccess.getSH().getDefaultBaseModeFlag() ); } } else { rcMbDataAccess.getMbData().setBLSkipFlag( false ); } } else { rcMbDataAccess.getMbData().setBLSkipFlag( false ); } if( rcMbDataAccess.getSH().getStoreRefBasePicFlag() && rcMbDataAccess.getSH().getQualityId() > 0 && rcMbDataAccess.getMbData().getBLSkipFlag() == false ) { printf("Conformance Issue: base_mode_flag = 0 in enhancement layer MGS key picture\n"); } //===== macroblock mode ===== if( ! rcMbDataAccess.getMbData().getBLSkipFlag() ) { DECRNOK( m_pcMbSymbolReadIf->mbMode( rcMbDataAccess ) ); } if( rcMbDataAccess.getMbData().getBLSkipFlag() ) { //===== copy motion data from base layer ====== rcMbDataAccess.getMbMvdData( LIST_0 ).clear(); rcMbDataAccess.getMbMvdData( LIST_1 ).clear(); rcMbDataAccess.getMbData().setBLSkipFlag( true ); } else { //===== BLOCK MODES ===== if( rcMbDataAccess.getMbData().isInter8x8() ) { DECRNOK( m_pcMbSymbolReadIf->blockModes( rcMbDataAccess ) ); //===== set motion data for skip block mode ===== UInt uiFwdBwd = 0; for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { UInt uiBlkFwdBwd = rcMbDataAccess.getMbData().getBlockFwdBwd( c8x8Idx.b8x8Index() ); if( rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) == BLK_SKIP ) { uiBlkFwdBwd = 3; rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( 1, c8x8Idx.b8x8() ); rcMbDataAccess.getMbMotionData( LIST_1 ).setRefIdx( 1, c8x8Idx.b8x8() ); rcMbDataAccess.getMbMvdData ( LIST_0 ).setAllMv ( Mv::ZeroMv(), c8x8Idx.b8x8() ); rcMbDataAccess.getMbMvdData ( LIST_1 ).setAllMv ( Mv::ZeroMv(), c8x8Idx.b8x8() ); } uiFwdBwd |= ( uiBlkFwdBwd << ( c8x8Idx.b8x8Index() * 4 ) ); } rcMbDataAccess.getMbData().setFwdBwd( uiFwdBwd ); } rcMbDataAccess.resetQp(); // set QP to that of the last macroblock //===== MOTION DATA ===== MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode(); if( rcMbDataAccess.getMbData().isIntra() ) { //===== clear mtoion data for intra blocks ===== rcMbDataAccess.getMbMotionData( LIST_0 ).clear( BLOCK_NOT_PREDICTED ); rcMbDataAccess.getMbMvdData ( LIST_0 ).clear(); if( rcMbDataAccess.getSH().isBSlice() ) { rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED ); rcMbDataAccess.getMbMvdData ( LIST_1 ).clear(); } } else if( eMbMode == MODE_SKIP ) { if( rcMbDataAccess.getSH().isBSlice() ) { rcMbDataAccess.getMbData().setFwdBwd( 0x3333 ); rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_0 ).clear(); rcMbDataAccess.getMbMotionData( LIST_1 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_1 ).clear(); } else { rcMbDataAccess.getMbData().setFwdBwd( 0x1111 ); rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) ); rcMbDataAccess.getMbMvdData ( LIST_0 ).clear(); rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED ); rcMbDataAccess.getMbMvdData ( LIST_1 ).clear(); } } else { if( rcMbDataAccess.getSH().isBSlice() ) { DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_0 ) ); DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_1 ) ); DECRNOK( xReadReferenceIndices ( rcMbDataAccess, eMbMode, LIST_0 ) ); DECRNOK( xReadReferenceIndices ( rcMbDataAccess, eMbMode, LIST_1 ) ); DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) ); DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_1 ) ); } else { DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_0 ) ); DECRNOK( xReadReferenceIndices ( rcMbDataAccess, eMbMode, LIST_0 ) ); DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) ); } } } //===== TEXTURE INFO ===== if( rcMbDataAccess.getMbData().isPCM() ) { DECRNOK( m_pcMbSymbolReadIf->samplesPCM( rcMbDataAccess ) ); } else { if( ! rcMbDataAccess.getMbData().getBLSkipFlag() ) { DECRNOK( xReadIntraPredModes( rcMbDataAccess ) ); } Bool bTrafo8x8Flag = ( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() && ( rcMbDataAccess.getMbData().getBLSkipFlag() || ( rcMbDataAccess.getMbData().is8x8TrafoFlagPresent( rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag() ) && !rcMbDataAccess.getMbData().isIntra4x4() ) ) ); bBaseLayerAvailable = ! rcMbDataAccess.getSH().getNoInterLayerPredFlag(); DECRNOK( xReadTextureInfo( rcMbDataAccess, bTrafo8x8Flag, bBaseLayerAvailable, rcMbDataAccess.getSH().getScanIdxStart(), rcMbDataAccess.getSH().getScanIdxStop() ) ); } } m_bPrevIsSkipped = ! bIsCoded; if( rcMbDataAccess.getSH().isMbaffFrame() && ( rcMbDataAccess.isTopMb() ) ) { rbEndOfSlice = false; return Err::m_nOK; } //===== terminating bits ===== rbEndOfSlice = m_pcMbSymbolReadIf->isEndOfSlice(); return Err::m_nOK; }