Void SampleWeighting::weightChromaSamples( YuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, LumaIdx cIdx, const PredWeight* pcPW0, const PredWeight* pcPW1 ) { AOT_DBG( iSizeY < 4 ); AOT_DBG( iSizeX < 4 ); if( pcPW0 != NULL && pcPW1 != NULL ) { // bidirectional prediction if( m_bWeightedPredDisableB ) { xMixB( pcRecBuffer ->getUBlk( cIdx ), pcRecBuffer ->getCStride(), m_cIntYuvBiBuffer.getUBlk( cIdx ), m_cIntYuvBiBuffer.getCStride(), iSizeY, iSizeX ); xMixB( pcRecBuffer ->getVBlk( cIdx ), pcRecBuffer ->getCStride(), m_cIntYuvBiBuffer.getVBlk( cIdx ), m_cIntYuvBiBuffer.getCStride(), iSizeY, iSizeX ); } else { xMixBWeight( pcRecBuffer ->getUBlk( cIdx ), pcRecBuffer ->getCStride(), m_cIntYuvBiBuffer.getUBlk( cIdx ), m_cIntYuvBiBuffer.getCStride(), iSizeY, iSizeX, pcPW0->getChromaCbWeight(), pcPW1->getChromaCbWeight(), pcPW0->getChromaCbOffset() + pcPW1->getChromaCbOffset(), m_uiChromaLogWeightDenom ); xMixBWeight( pcRecBuffer ->getVBlk( cIdx ), pcRecBuffer ->getCStride(), m_cIntYuvBiBuffer.getVBlk( cIdx ), m_cIntYuvBiBuffer.getCStride(), iSizeY, iSizeX, pcPW0->getChromaCrWeight(), pcPW1->getChromaCrWeight(), pcPW0->getChromaCrOffset() + pcPW1->getChromaCrOffset(), m_uiChromaLogWeightDenom ); } } else { ROTVS( m_bWeightedPredDisableP ); // unidirectionl prediction const PredWeight* pcPredWeight = (pcPW0 != NULL) ? pcPW0 : pcPW1; AOT_DBG( NULL == pcPredWeight ); if( pcPredWeight->getChromaWeightFlag() ) { xWeight( pcRecBuffer->getUBlk( cIdx ), pcRecBuffer->getCStride(), iSizeY, iSizeX, pcPredWeight->getChromaCbWeight(), pcPredWeight->getChromaCbOffset(), m_uiChromaLogWeightDenom ); xWeight( pcRecBuffer->getVBlk( cIdx ), pcRecBuffer->getCStride(), iSizeY, iSizeX, pcPredWeight->getChromaCrWeight(), pcPredWeight->getChromaCrOffset(), m_uiChromaLogWeightDenom ); } } }
ErrVal ReadYuvFile::destroy() { AOT_DBG( m_cFile.is_open() ); RNOK( uninit() ) delete this; return Err::m_nOK; }
ErrVal MbDataCtrl::init( const SequenceParameterSet& rcSPS ) { AOT_DBG( m_bInitDone ); UInt uiSize = rcSPS.getMbInFrame(); ROT( 0 == uiSize ); if( m_uiSize == uiSize ) { RNOK( xResetData() ); } else { RNOK( xDeleteData() ); RNOK( xCreateData( uiSize ) ); m_uiSize = uiSize; } m_iMbPerLine = rcSPS.getFrameWidthInMbs(); RNOK( m_cpDFPBuffer.init( uiSize+1 ) ); m_cpDFPBuffer.clear(); m_bInitDone = true; return Err::m_nOK; }
ErrVal H264AVCEncoderTest::xRemovePicBuffer( PicBufferList& rcPicBufferUnusedList, UInt uiView ) { while( ! rcPicBufferUnusedList.empty() ) { //printf("! rcPicBufferUnusedList.empty() del view %d\n",uiView); PicBuffer* pcBuffer = rcPicBufferUnusedList.popFront(); if( NULL != pcBuffer ) { //printf("NULL != pcBuffer\n"); PicBufferList::iterator begin = m_acActivePicBufferList[uiView].begin(); PicBufferList::iterator end = m_acActivePicBufferList[uiView].end (); PicBufferList::iterator iter = std::find( begin, end, pcBuffer ); if( iter == end ){ // there is something wrong if the address is not in the active list return Err::m_nOK; } AOT_DBG( (*iter)->isUsed() ); m_acUnusedPicBufferList[uiView].push_back( *iter ); m_acActivePicBufferList[uiView].erase ( iter ); } } //printf("View %d fet.\n",uiView); return Err::m_nOK; }
ErrVal H264AVCEncoderTest::xRemovePicBuffer( PicBufferList& rcPicBufferUnusedList, UInt uiLayer ) { while( ! rcPicBufferUnusedList.empty() ) { PicBuffer* pcBuffer = rcPicBufferUnusedList.popFront(); if( NULL != pcBuffer ) { PicBufferList::iterator begin = m_acActivePicBufferList[uiLayer].begin(); PicBufferList::iterator end = m_acActivePicBufferList[uiLayer].end (); PicBufferList::iterator iter = std::find( begin, end, pcBuffer ); ROT( iter == end ); // there is something wrong if the address is not in the active list AOT_DBG( (*iter)->isUsed() ); m_acUnusedPicBufferList[uiLayer].push_back( *iter ); m_acActivePicBufferList[uiLayer].erase ( iter ); } } return Err::m_nOK; }
ErrVal BitReadBuffer::get( UInt& ruiBits, UInt uiNumberOfBits ) { UInt ui_right_shift; // check the number_of_bits parameter matches the range AOT_DBG( uiNumberOfBits > 32 ); ROT( uiNumberOfBits > m_uiBitsLeft ); m_uiBitsLeft -= uiNumberOfBits; m_iValidBits -= uiNumberOfBits; if( 0 <= m_iValidBits ) { // calculate the number of bits to extract the desired number of bits ui_right_shift = 32 - uiNumberOfBits ; // mask out the value ruiBits = m_ulCurrentBits >> ui_right_shift; //prepare for next access m_ulCurrentBits = m_ulCurrentBits << uiNumberOfBits; }
ErrVal MbCoder::xWriteMotionVectors( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { AOT_DBG( rcMbDataAccess.getMbData().isIntra() ); switch( eMbMode ) { case MODE_SKIP: { return Err::m_nOK; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx ) ); } return Err::m_nOK; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } return Err::m_nOK; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->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 ) ) { RNOK( xWriteBlockMv( rcMbDataAccess, c8x8Idx, eLstIdx ) ); } } return Err::m_nOK; } default: { AF(); return Err::m_nERR; } } return Err::m_nERR; }
ErrVal MbCoder::xWriteReferenceFrames( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { AOT_DBG( rcMbDataAccess.getMbData().isIntra() ); if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) ) { return Err::m_nOK; } Bool bPred = rcMbDataAccess.getSH().getAdaptivePredictionFlag(); MbMotionData& rcMot = rcMbDataAccess.getMbMotionData( eLstIdx ); switch( eMbMode ) { case MODE_SKIP: { break; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag() ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx ) ); } break; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_16x8_0 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_16x8_1 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } break; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_8x16_0 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_8x16_1 ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( 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 ) && ( ! bPred || ! rcMot.getMotPredFlag( c8x8Idx.b8x8() ) ) ) { RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) ); } } break; } default: { AF(); return Err::m_nERR; } } return Err::m_nOK; }
ErrVal MbCoder::xWriteMotionPredFlags( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx ) { AOT_DBG( rcMbDataAccess.getMbData().isIntra() ); ROFRS ( rcMbDataAccess.getSH().getAdaptivePredictionFlag (), Err::m_nOK ); switch( eMbMode ) { case MODE_SKIP: { break; } case MODE_16x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx ) ); } break; } case MODE_16x8: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) ); } break; } case MODE_8x16: { if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) ); } if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) ) { RNOK( m_pcMbSymbolWriteIf->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) ) { RNOK( m_pcMbSymbolWriteIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) ); } } break; } default: { AF(); return Err::m_nERR; } } return Err::m_nOK; }
//TMM_EC {{ ErrVal MbDataCtrl::initMbTDEnhance( MbDataAccess*& rpcMbDataAccess, MbDataCtrl *pcMbDataCtrl, MbDataCtrl *pcMbDataCtrlRef, UInt uiMbY, UInt uiMbX, const Int iForceQp ) { ROF( m_bInitDone ); AOT_DBG( uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset >= m_uiSize ); Bool bLf = (m_eProcessingState == POST_PROCESS); Bool bMbaff = m_pcSliceHeader->isMbAff(); Bool bTopMb = ((bMbaff && (uiMbY % 2)) ? false : true); UInt uiMbYComp = ( bMbaff ? ( bTopMb ? uiMbY+1 : uiMbY-1 ) : uiMbY ); UInt uiCurrIdx = uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset; UInt uiCompIdx = uiMbYComp * m_uiMbStride + uiMbX + m_uiMbOffset; ROT( uiCompIdx >= m_uiSize ); ROT( uiCurrIdx >= m_uiSize ); MbData& rcMbDataCurr = m_pcMbData[ uiCurrIdx ]; MbData& rcMbDataComp = m_pcMbData[ uiCompIdx ]; //----- get co-located MbIndex ----- UInt uiIdxColTop; UInt uiIdxColBot; if( ! m_pcSliceHeader->getFieldPicFlag() ) { UInt uiMbYColTop = 2 * ( uiMbY / 2 ); uiIdxColTop = uiMbYColTop * m_uiMbStride + uiMbX + m_uiMbOffset; uiIdxColBot = uiIdxColTop + m_uiMbStride; // if( uiIdxColBot >= m_uiSize ) //th bug if( uiIdxColBot >= m_pcSliceHeader->getMbInPic() ) //th bug { uiIdxColBot = uiIdxColTop; } } else if( ! m_pcSliceHeader->getBottomFieldFlag() ) { uiIdxColTop = uiCurrIdx + m_iColocatedOffset; uiIdxColBot = uiIdxColTop - m_iColocatedOffset + m_iMbPerLine; } else { uiIdxColBot = uiCurrIdx - m_iColocatedOffset; uiIdxColTop = uiIdxColBot + m_iColocatedOffset - m_iMbPerLine; } if( m_pcMbDataAccess ) { m_ucLastMbQp = m_pcMbDataAccess->getMbData().getQp(); } UInt uiSliceId = rcMbDataCurr.getSliceId(); if( PARSE_PROCESS == m_eProcessingState || ENCODE_PROCESS == m_eProcessingState) { if( 0 == uiSliceId ) { uiSliceId = m_uiSliceId; rcMbDataCurr.getMbTCoeffs().clear(); rcMbDataCurr.initMbData( m_ucLastMbQp, uiSliceId ); rcMbDataCurr.clear(); m_uiMbProcessed++; } else { //allready assigned; if( ENCODE_PROCESS != m_eProcessingState ) { AF(); } else { if( iForceQp != -1 ) { m_ucLastMbQp = iForceQp; } } } } Int icurrSliceGroupID = getSliceGroupIDofMb(uiMbY * m_uiMbStride + uiMbX + m_uiMbOffset); Bool bColocatedField = ( m_pcMbDataCtrl0L1 == NULL) ? true : m_pcMbDataCtrl0L1->isPicCodedField(); m_pcMbDataAccess = new (m_pcMbDataAccess) MbDataAccess( rcMbDataCurr, // current rcMbDataComp, // complementary xGetRefMbData( uiSliceId,icurrSliceGroupID, uiMbY, uiMbX-1, bLf ), // left xGetRefMbData( uiSliceId,icurrSliceGroupID, uiMbY-1, uiMbX , bLf ), // above xGetRefMbData( uiSliceId,icurrSliceGroupID, uiMbY-1, uiMbX-1, bLf ), // above left ((bMbaff && (uiMbY % 2 == 1)) ? xGetOutMbData() : xGetRefMbData( uiSliceId,icurrSliceGroupID, uiMbY-1, uiMbX+1, bLf )), // above right xGetRefMbData( uiSliceId, icurrSliceGroupID,uiMbY-2, uiMbX , bLf ), // above above xGetRefMbData( uiSliceId, icurrSliceGroupID,uiMbY-2, uiMbX-1, bLf ), // above above left xGetRefMbData( uiSliceId, icurrSliceGroupID,uiMbY-2, uiMbX+1, bLf ), // above above right xGetRefMbData( uiSliceId, icurrSliceGroupID,uiMbY+1, uiMbX-1, bLf ), // below left xGetOutMbData(), // unvalid pcMbDataCtrlRef->getMbData(uiIdxColTop), pcMbDataCtrlRef->getMbData(uiIdxColBot), *m_pcSliceHeader, *m_cpDFPBuffer.get( uiSliceId ), uiMbX, uiMbY, bTopMb, m_bUseTopField, bColocatedField, m_ucLastMbQp ); ROT( NULL == m_pcMbDataAccess ); rpcMbDataAccess = m_pcMbDataAccess; return Err::m_nOK; }