⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slicedecoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;

			cMbMotionData[uiList].copyFrom( pcMbDataAccessRewrite->getMbMotionData(eListIdx) );
			pcMbDataAccessRewrite->getMbMvdData(eListIdx).clear();
			pcMbDataAccessRewrite->getMbMotionData(eListIdx).setMotPredFlag( false );

		}

		// This is a sub-optimal implementation
		for( UInt uiList=0; uiList<2; uiList++ )
		{
			ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;

			for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
			{
				m_pcMbDecoder->calcMv( *pcMbDataAccessRewrite, NULL );

				cMv  = cMbMotionData[uiList].getMv( cIdx );
				cMv -= pcMbDataAccessRewrite->getMbMotionData( eListIdx ).getMv( cIdx );
				pcMbDataAccessRewrite->getMbMvdData( eListIdx ).setMv( cMv, cIdx );
			}

			// Cleanup for CABAC context models
			switch( pcMbDataAccessRewrite->getMbData().getMbMode() )
			{

			case MODE_16x16:
				cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( );
				pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv );
				break;

			case MODE_16x8:
				cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_16x8_0 );
				pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_16x8_0 );
				cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_16x8_1 );
				pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_16x8_1 );
				break;

			case MODE_8x16:
				cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_8x16_0 );
				pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_8x16_0 );
				cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( PART_8x16_1 );
				pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, PART_8x16_1 );
				break;


			case MODE_8x8:
				for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
				{
					ParIdx8x8 eParIdx = c8x8Idx.b8x8();

					if( pcMbDataAccessRewrite->getMbData().getBlkMode( c8x8Idx.b8x8Index() ) == BLK_SKIP )
						pcMbDataAccessRewrite->getMbData().setBlkMode( c8x8Idx.b8x8Index(), BLK_8x8 );

					switch( pcMbDataAccessRewrite->getMbData().getBlkMode( c8x8Idx.b8x8Index() ) )
					{

					case BLK_8x8:

						cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx );
						pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx );
						break;

					case BLK_8x4:
						cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_8x4_0 );
						pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_8x4_0 );
						cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_8x4_1 );
						pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_8x4_1 );
						break;

					case BLK_4x8:
						cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_4x8_0 );
						pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_4x8_0 );
						cMv = pcMbDataAccessRewrite->getMbMvdData( eListIdx ).getMv( eParIdx, SPART_4x8_1 );
						pcMbDataAccessRewrite->getMbMvdData(eListIdx).setAllMv( cMv, eParIdx, SPART_4x8_1 );
						break;

					case BLK_4x4:
						break;

					default:
						AOT(1);


					}
				}
				break;

  			default:
				AOT(1);
			}
		}

		// SANITY CHECK
		m_pcMbDecoder->calcMv( *pcMbDataAccessRewrite, NULL );

		for( UInt uiList=0; uiList<2; uiList++ )
		{
			for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
			{
				ListIdx eListIdx = uiList==0 ? LIST_0:LIST_1;

				cMv  = cMbMotionData[uiList].getMv( cIdx );
				cMv -= pcMbDataAccessRewrite->getMbMotionData( eListIdx ).getMv( cIdx );
				if( cMv.getHor() || cMv.getVer() )
					AOT(1);
			}
		}
		// END SANITY CHECK
	}

	///////////////////////////////////////////////////////////

	pcMbDataAccessRewrite->getMbData().setBCBPAll(0);

	// Reset data
	UInt uiCbp = pcMbDataAccess->getMbData().getMbCbp();
	//MbMode mode = pcMbDataAccess->getMbData().getMbMode();

	int base_layer_id_save = rcSH.getBaseLayerId();
	//bool bl_skip_flag_save = pcMbDataAccess->getMbData().getBLSkipFlag();
	bool adaptivePredictionFlag_save = rcSH.getAdaptivePredictionFlag();
	bool adaptiveResPredictionFlag_save = rcSH.getAdaptiveResPredictionFlag();

	rcSH.setBaseLayerId(MSYS_UINT_MAX);
	rcSH.setAdaptivePredictionFlag(false);
	rcSH.setAdaptiveResPredictionFlag(false);

	//pcMbDataAccess->getMbData().setBLSkipFlag(false);
	pcMbDataAccessRewrite->getMbData().setBLSkipFlag( false );

	if (uiCbp >=48) {
		fprintf(stderr, "Warning! frame %d, MB (%d, %d), uiCbp=%d\n", rcSH.getFrameNum(), uiMbY, uiMbX, uiCbp);
		AOT(1);
	}

	if (rcSH.getAVCRewriteFlag()) {

		//RNOK( m_pcAvcRewriteEncoder->xGetPcMbCoder()->encode( *pcMbDataAccess,
		RNOK( m_pcAvcRewriteEncoder->xGetPcMbCoder()->encode( *pcMbDataAccessRewrite,NULL, 0, uiMbRead==1, true ));
	}

	// resume
	rcSH.setBaseLayerId(base_layer_id_save);
	rcSH.setAdaptivePredictionFlag(adaptivePredictionFlag_save);
	rcSH.setAdaptiveResPredictionFlag(adaptiveResPredictionFlag_save);
#endif

   uiMbRead--;

//TMM_EC {{
	 if ( rcSH.getTrueSlice())
	 {
//TMM_EC }}
		//--ICU/ETRI FMO Implementation
		 uiMbAddress=rcSH.getFMO()->getNextMBNr(uiMbAddress);
	 }
	 else
	 {
		 uiMbAddress++;
	 }
  }

  if( ePicType!=FRAME )
	{
		if( pcFrame )             RNOK( pcFrame->            removeFieldBuffer( ePicType ) );
		if( pcResidual )          RNOK( pcResidual->         removeFieldBuffer( ePicType ) );
		if( pcPredSignal )        RNOK( pcPredSignal->       removeFieldBuffer( ePicType ) );
		if( pcBaseLayer )         RNOK( pcBaseLayer->        removeFieldBuffer( ePicType ) );
		if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
	}

  return Err::m_nOK;
}
ErrVal SliceDecoder::decodeMbAff( SliceHeader&   rcSH,
                            MbDataCtrl*    pcMbDataCtrl,
                            MbDataCtrl*    pcMbDataCtrlBase,
                            MbDataCtrl*    pcMbDataCtrlBaseField,
                            IntFrame*      pcFrame,
                            IntFrame*      pcResidual,
                            IntFrame*      pcPredSignal,
                            IntFrame*      pcBaseLayer,
                            IntFrame*      pcBaseLayerResidual,
                            RefFrameList*  pcRefFrameList0,
                            RefFrameList*  pcRefFrameList1,
                            Bool           bReconstructAll)
{
  ROF( m_bInitDone );

  //====== initialization ======
  RNOK( pcMbDataCtrl->initSlice( rcSH, DECODE_PROCESS, true, NULL ) );

  RefFrameList acRefFrameList0[2];
  RefFrameList acRefFrameList1[2];

  RNOK( gSetFrameFieldLists( acRefFrameList0[0], acRefFrameList0[1], *pcRefFrameList0 ) );
  RNOK( gSetFrameFieldLists( acRefFrameList1[0], acRefFrameList1[1], *pcRefFrameList1 ) );

  RefFrameList* apcRefFrameList0[2];
  RefFrameList* apcRefFrameList1[2];

  apcRefFrameList0[0] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[0];
  apcRefFrameList0[1] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[1];
  apcRefFrameList1[0] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[0];
  apcRefFrameList1[1] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[1];

  IntFrame* apcFrame            [4] = { NULL, NULL, NULL, NULL };
  IntFrame* apcResidual         [4] = { NULL, NULL, NULL, NULL };
  IntFrame* apcPredSignal       [4] = { NULL, NULL, NULL, NULL };
  IntFrame* apcBaseLayer        [4] = { NULL, NULL, NULL, NULL };
  IntFrame* apcBaseLayerResidual[4] = { NULL, NULL, NULL, NULL };

	RNOK( gSetFrameFieldArrays( apcFrame,             pcFrame             ) );
  RNOK( gSetFrameFieldArrays( apcResidual,          pcResidual          ) );
  RNOK( gSetFrameFieldArrays( apcPredSignal,        pcPredSignal        ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayer,         pcBaseLayer         ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayerResidual, pcBaseLayerResidual ) );

  //===== loop over macroblocks =====
  UInt uiMbAddress           = rcSH.getFirstMbInSlice();
  const UInt uiLastMbAddress = rcSH.getNumMbsInSlice ()-1;
  for( ; uiMbAddress <= uiLastMbAddress; uiMbAddress+=2 )
  {
    for( UInt eP = 0; eP < 2; eP++ )
    {
      UInt uiMbAddressMbAff = uiMbAddress + eP;
      MbDataAccess* pcMbDataAccess     = NULL;
      MbDataAccess* pcMbDataAccessBase = NULL;
      UInt          uiMbY, uiMbX;

      RefFrameList* pcRefFrameList0F;
      RefFrameList* pcRefFrameList1F;

      rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddressMbAff                     );

      RNOK( pcMbDataCtrl->      initMb       (  pcMbDataAccess,    uiMbY, uiMbX       ) );
      pcMbDataAccess->setFieldMode( pcMbDataAccess->getMbData().getFieldFlag()          );

      if( pcMbDataAccess->getMbPicType()==FRAME && pcMbDataCtrlBase )
      {
        RNOK( pcMbDataCtrlBase->initMb        ( pcMbDataAccessBase, uiMbY, uiMbX  ) );
      }
      else if( pcMbDataAccess->getMbPicType()<FRAME && pcMbDataCtrlBaseField )
      {
        RNOK( pcMbDataCtrlBaseField->initMb   ( pcMbDataAccessBase, uiMbY, uiMbX  ) );
      }

      RNOK( m_pcControlMng->initMbForDecoding( *pcMbDataAccess,    uiMbY, uiMbX, true ) );

      const PicType eMbPicType  = pcMbDataAccess->getMbPicType();
			const UInt    uiLI        = eMbPicType - 1;
      if( FRAME == eMbPicType )
      {
        pcRefFrameList0F = pcRefFrameList0;
        pcRefFrameList1F = pcRefFrameList1;
      }
      else
      {
        pcRefFrameList0F = apcRefFrameList0[eP];
        pcRefFrameList1F = apcRefFrameList1[eP];
      }

      RNOK( m_pcMbDecoder ->decode           ( *pcMbDataAccess,
                                                pcMbDataAccessBase,
                                                apcFrame            [uiLI],
                                                apcResidual         [uiLI],
                                                apcPredSignal       [uiLI],
                                                apcBaseLayer        [uiLI],
                                                apcBaseLayerResidual[uiLI],
                                                pcRefFrameList0F,
                                                pcRefFrameList1F,
                                                bReconstructAll ) );
    }
  }

  if( pcFrame )             RNOK( pcFrame->            removeFrameFieldBuffer() );
  if( pcResidual )          RNOK( pcResidual->         removeFrameFieldBuffer() );
  if( pcPredSignal )        RNOK( pcPredSignal->       removeFrameFieldBuffer() );
  if( pcBaseLayer )         RNOK( pcBaseLayer->        removeFrameFieldBuffer() );
  if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFrameFieldBuffer() );

	return Err::m_nOK;
}


ErrVal
SliceDecoder::compensatePrediction( SliceHeader&   rcSH )
{
  ROF( m_bInitDone );

  //====== initialization ======
  RNOK( m_pcControlMng->initSlice( rcSH, DECODE_PROCESS ) );

  UInt uiFirstMbInSlice;
  UInt uiLastMbInSlice;
  FMO* pcFMO = rcSH.getFMO();

	const Bool    bMbAff   = rcSH.isMbAff();

  for(Int iSliceGroupID=0; !pcFMO->SliceGroupCompletelyCoded(iSliceGroupID); iSliceGroupID++)
  {
  	if (false == pcFMO->isCodedSG(iSliceGroupID))
	  {
	    continue;
	  }

  	uiFirstMbInSlice = pcFMO->getFirstMacroblockInSlice(iSliceGroupID);
	  uiLastMbInSlice = pcFMO->getLastMBInSliceGroup(iSliceGroupID);
    //===== loop over macroblocks =====
    for(UInt uiMbIndex = uiFirstMbInSlice; uiMbIndex<=uiLastMbInSlice;)
    {

    MbDataAccess* pcMbDataAccess = NULL;
    UInt          uiMbY, uiMbX;

    rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbIndex                        );

    RNOK( m_pcControlMng->initMbForDecoding( pcMbDataAccess, uiMbY, uiMbX, bMbAff ) );

      RNOK( m_pcMbDecoder ->compensatePrediction( *pcMbDataAccess            ) );

  	  uiMbIndex = rcSH.getFMO()->getNextMBNr(uiMbIndex);
    }

  }

//TMM_INTERLACE{
  RNOK( m_pcControlMng->removeFrameFieldBuffer() );
//TMM_INTERLACE}

  return Err::m_nOK;
}

#ifdef SHARP_AVC_REWRITE_OUTPUT
ErrVal
SliceDecoder::xSetAvcRewriteEncoder(H264AVCEncoder* pcAvcRewriteEncoder) {

	m_pcAvcRewriteEncoder = pcAvcRewriteEncoder;
	return Err::m_nOK;
}
#endif


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -