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

📄 mbdata.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        m_aBlkMode[3] = BLK_4x4; 
      }
    }

    UInt uiFwdBwd =0;
    for( Int n = 3; n >= 0; n--)
    {
      uiFwdBwd <<= 4;
      uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( Par8x8(n) )) ? 1:0;
      uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( Par8x8(n) )) ? 2:0;
    }

    m_usFwdBwd    = uiFwdBwd ;
  }

  return Err::m_nOK;
}

ErrVal
MbData::copyMotionScale( const MbData& rcMbDataBL, 
                         const PicType eMbPicType,
                         const Int     iDirectCopyMode )
{
  m_bFieldFlag  = FRAME != eMbPicType;
  m_bBLSkipFlag = rcMbDataBL.m_bBLSkipFlag;
  m_eMbMode     = rcMbDataBL.m_eMbMode;
  m_aBlkMode[0] = rcMbDataBL.m_aBlkMode[0];
  m_aBlkMode[1] = rcMbDataBL.m_aBlkMode[1];
  m_aBlkMode[2] = rcMbDataBL.m_aBlkMode[2];
  m_aBlkMode[3] = rcMbDataBL.m_aBlkMode[3]; 
  m_usFwdBwd    = rcMbDataBL.m_usFwdBwd;

  m_apcMbMotionData[0]->copyFrom( *rcMbDataBL.m_apcMbMotionData[0] );
  m_apcMbMotionData[1]->copyFrom( *rcMbDataBL.m_apcMbMotionData[1] );

  m_apcMbMotionData[0]->setFieldMode(  m_bFieldFlag );
  m_apcMbMotionData[1]->setFieldMode(  m_bFieldFlag );

  if(iDirectCopyMode==1) //field2frame
  {
    m_apcMbMotionData[0]->field2FrameRefIdx();
    m_apcMbMotionData[1]->field2FrameRefIdx();
  }
  else if(iDirectCopyMode==2)//frame2field
  {
    m_apcMbMotionData[0]->frame2FieldRefIdx();
    m_apcMbMotionData[1]->frame2FieldRefIdx();
  }

  return Err::m_nOK;
}

ErrVal
MbData::configureFieldFrameMode( Bool bFieldFlag )
{
  m_bFieldFlag = bFieldFlag;
  m_apcMbMotionData[0]->setFieldMode( bFieldFlag );
  m_apcMbMotionData[1]->setFieldMode( bFieldFlag );

  return Err::m_nOK;
}


ErrVal
MbData::initMbCbp()
{
  m_uiMbCbp = 0;
  return Err::m_nOK;
}


ErrVal
MbData::upsampleMotion( MbData& rcMbData, Par8x8 ePar8x8, Bool bDirect8x8 )
{
  RNOK( MbDataStruct::upsampleMotion( rcMbData, ePar8x8, bDirect8x8 ) );
  m_bBLSkipFlag = false;
  
  RNOK( m_apcMbMotionData[0]->upsampleMotion( *rcMbData.m_apcMbMotionData[0], ePar8x8 ) );
  RNOK( m_apcMbMotionData[1]->upsampleMotion( *rcMbData.m_apcMbMotionData[1], ePar8x8 ) );

  UInt uiFwdBwd = 0;
  uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( B_8x8_0 )) ? 1:0;
  uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( B_8x8_0 )) ? 2:0;
  m_usFwdBwd = (uiFwdBwd<<12)|(uiFwdBwd<<8)|(uiFwdBwd<<4)|(uiFwdBwd);

  return Err::m_nOK;
}


Void
MbData::switchMotionRefinement()
{
  ROFVS( m_bHasMotionRefinement );

  // switch mb_type
  MbMode  eMbModeTemp = m_eMbMode;
  m_eMbMode = m_eMbModeBase;
  m_eMbModeBase = eMbModeTemp;

  // switch sub-mb_type
  BlkMode aBlkModeTemp[4];  ::memcpy( aBlkModeTemp, m_aBlkMode, sizeof( m_aBlkMode ) );
  ::memcpy( m_aBlkMode, m_aBlkModeBase, sizeof( m_aBlkMode ) );
  ::memcpy( m_aBlkModeBase, aBlkModeTemp, sizeof( m_aBlkMode ) );

  // switch motion vectors
  for( UInt ui = 0; ui < 2; ui++ )
  {
    MbMotionData cMbMotionDataTemp;
    cMbMotionDataTemp.copyFrom( *m_apcMbMotionData[ui] );
    m_apcMbMotionData[ui]->copyFrom( *m_apcMbMotionDataBase[ui] );
    m_apcMbMotionDataBase[ui]->copyFrom( cMbMotionDataTemp );
  }
}

Void
MbData::activateMotionRefinement()
{
  AOT( m_bHasMotionRefinement );
  m_bHasMotionRefinement = true;
  m_eMbModeBase          = m_eMbMode;
  ::memcpy( m_aBlkModeBase, m_aBlkMode, sizeof( m_aBlkMode ) );
  m_apcMbMotionDataBase[0]->copyFrom( *m_apcMbMotionData[0] );
  m_apcMbMotionDataBase[1]->copyFrom( *m_apcMbMotionData[1] );
}

ErrVal
MbData::noUpsampleMotion()
{
    clear();
    m_apcMbMotionData[0]->clear(BLOCK_NOT_AVAILABLE) ;
    m_apcMbMotionData[1]->clear(BLOCK_NOT_AVAILABLE) ;
    return Err::m_nOK;      
}


const UChar MbData::m_aucPredictor[2][4]= {{1,0,3,2},{2,3,0,1}};
//Indexes: MBMode Mode8x8%8 b4x4idx
const Char MbData::aaacGetPartInfo[7][4][16]={
  //MODE_SKIP 
  {{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
  {0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
  {0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
  {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
  //MODE_16x16
  {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_8x8
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_8x4
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_4x8
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},//BLK_4x4
  //MODE_16x8
  {{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_8x8
  {0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_8x4
  {0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_4x8
  {0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4}},//BLK_4x4
  //MODE_8x16
  {{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4},//BLK_8x8
  {0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}, //BLK_8x4
  {0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}, //BLK_4x8
  {0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}},//BLK_4x4
  //MODE_8x8
  {{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
   {0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
   {0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
   {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
  //MODE_8x8ref0
  {{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
   {0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
   {0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
   {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
  //INTRA_4X4_
  {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}} 
};

ErrVal
MbData::upsampleMotionESS (MbData* pcBaseMbData,
                           const UInt uiBaseMbStride,
                           const Int aiPelOrig[2], 
                           const Bool bDirect8x8,
                           ResizeParameters* pcParameters)
{
    Bool        abBl8x8Intra  [4]= {false,false,false,false}; 
    MbMode      aeMbMode      [4]= {MODE_16x16,MODE_16x16,MODE_16x16,MODE_16x16};
    BlkMode     aeBlkMode     [4][4];  
    UInt        auiMbIdx	    [4][4]; 
    UInt        aui4x4Idx	    [4][4];
    Int         aaiPartInfo   [4][4];
    UInt        uiMbBaseOrigX = 0, uiMbBaseOrigY = 0;    
  
    // initializing
    //-------------
     xInitESS();
    // Fill Base idx
    //-----------------
    xFillBaseMbData(pcBaseMbData, 
                    uiBaseMbStride,
                    aiPelOrig, 
                    bDirect8x8, 
                    pcParameters, 
                    aeMbMode,
                    aeBlkMode,
                    uiMbBaseOrigX,
                    uiMbBaseOrigY);

  if( m_eMbMode!=INTRA_4X4)
  {
    // Build PartInfo and inherited base idx filling
    //----------------------------------------------
    xBuildPartInfo(aiPelOrig, 
                  pcParameters,
                  aeMbMode,
                  aeBlkMode,  
                  aui4x4Idx, 
                  auiMbIdx,
                  aaiPartInfo,
                  abBl8x8Intra,
                  uiMbBaseOrigX,
                  uiMbBaseOrigY);

    //--- Remove 4x4 INTRA blocks
    //--------------------------
    UInt uiB8x8=0,uiB4x4=0;
    for ( uiB8x8=0 ; uiB8x8<4 ; uiB8x8++)
      if(!abBl8x8Intra[uiB8x8]) 
      {
        Bool        bWasBl4x4Intra  [4]= {false,false,false,false};
        for (uiB4x4=0 ; uiB4x4<4 ; uiB4x4++)
          if(aaiPartInfo[uiB8x8][uiB4x4]==-1) xRemoveIntra4x4(uiB4x4,bWasBl4x4Intra,aui4x4Idx[uiB8x8],auiMbIdx[uiB8x8],aaiPartInfo[uiB8x8]);
      }
      
    //--- Remove 8x8 INTRA blocks
    //----------------------------    
      for ( uiB8x8=0 ; uiB8x8<4 ; uiB8x8++) 
        if(abBl8x8Intra[uiB8x8]) xRemoveIntra8x8(uiB8x8,abBl8x8Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);

    // 8x8 blocks partitioning
    //------------------------
    xInherit8x8MotionData (aui4x4Idx,auiMbIdx,aaiPartInfo);

    // macroblock mode choice
    //-----------------------
    xInheritMbMotionData (aaiPartInfo);
  }

  // Transfer in MB structure
  //-------------------------
  RNOK( xFillMbMvData(pcParameters ) );

  //--- Set fwd/bwd 
  UInt uiFwdBwd = 0;
  for( Int n = 3; n >= 0; n--)
  {
      uiFwdBwd <<= 4;
      uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( Par8x8(n) )) ? 1:0;
      uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( Par8x8(n) )) ? 2:0;
  }
   m_usFwdBwd = uiFwdBwd;

   return Err::m_nOK;
}

ErrVal
MbData::xInitESS()
{
    //--- Initialisation
    ///////////////////////
    m_bBLSkipFlag = false;

    m_uiMbCbp = 0;
    m_eMbMode = MODE_16x16;
    m_aBlkMode[0] = m_aBlkMode[1] = m_aBlkMode[2] = m_aBlkMode[3] =BLK_8x8;

    Mv* pcMv0=m_acBl4x4Mv[0];
    Mv* pcMv1=m_acBl4x4Mv[1];
    SChar* pscRefIdx0=m_ascBl4x4RefIdx[0];
    SChar* pscRefIdx1=m_ascBl4x4RefIdx[1];
    for(UInt  uiBl4x4Idx=0 ; uiBl4x4Idx < 16 ;uiBl4x4Idx++,pcMv0++,pcMv1++,pscRefIdx0++,pscRefIdx1++)
    {
        pcMv0->setZero();
        pcMv1->setZero();
        *pscRefIdx0=*pscRefIdx1=BLOCK_NOT_PREDICTED;
    }

    return Err::m_nOK;   
}

ErrVal
MbData::xFillBaseMbData(  MbData* pcBaseMbData,
                          const UInt uiBaseMbStride,
                          const Int aiPelOrig[2],
                          const Bool bDirect8x8,
                          ResizeParameters* pcParameters,
                          MbMode      aeMbMode	  [4],
                          BlkMode     aeBlkMode	  [4][4],
                          UInt&       uiMbBaseOrigX,
                          UInt&       uiMbBaseOrigY)
{
    //--- Base MB association + Fill in Base MbMode + aeBlkMode
    ///////////////////////////////////////////////////////////
    const Int iBaseX0 = ((aiPelOrig[0]+1)*pcParameters->m_iInWidth + pcParameters->m_iOutWidth/2) / pcParameters->m_iOutWidth; 
    const Int iBaseY0 = ((aiPelOrig[1]+1)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight; 
    const Int iBaseX1 = ((aiPelOrig[0]+13)*pcParameters->m_iInWidth  + pcParameters->m_iOutWidth /2) / pcParameters->m_iOutWidth; 
    const Int iBaseY1 = ((aiPelOrig[1]+13)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight; 

    uiMbBaseOrigX=(iBaseX0>>4);
    uiMbBaseOrigY=(iBaseY0>>4);

    Int iMbBaseIdx =uiMbBaseOrigY*uiBaseMbStride + uiMbBaseOrigX;
    MbData* pcBaseMb0 = &(pcBaseMbData[iMbBaseIdx]);

    const Int iSMbWidth   = ( iBaseX1>>4 > iBaseX0>>4 ) ? 2 : 1;
    const Int iSMbHeight  = ( iBaseY1>>4 > iBaseY0>>4 ) ? 2 : 1;
    
    Bool bIsMbIntra=true;
    m_apcMbData[0]=m_apcMbData[1]=m_apcMbData[2]=m_apcMbData[3]=0;

    for( Int iBaseMbY = 0; iBaseMbY < iSMbHeight; iBaseMbY ++)
        for( Int iBaseMbX = 0; iBaseMbX < iSMbWidth; iBaseMbX ++)
        {  
            UInt uiIdxMb=(iBaseMbY<<1) + iBaseMbX;
            m_apcMbData[uiIdxMb]= pcBaseMb0 + iBaseMbY * uiBaseMbStride + iBaseMbX; 
          
            MbMode eMbMode= m_apcMbData[uiIdxMb]->m_eMbMode;  
             if(eMbMode>=INTRA_4X4 )  
             {
               eMbMode=INTRA_4X4;
               aeBlkMode[uiIdxMb][0]=aeBlkMode[uiIdxMb][1]=aeBlkMode[uiIdxMb][2]=aeBlkMode[uiIdxMb][3]=BLK_8x8; //bug fix jerome.vieron@thomson.net
             }
             else
             {
               if(eMbMode==MODE_SKIP) eMbMode = MODE_8x8;
               for(UInt uiB8x8Idx=0;uiB8x8Idx<4;uiB8x8Idx++)
               {
                 BlkMode eBlkMode=m_apcMbData[uiIdxMb]->m_aBlkMode[uiB8x8Idx];
                 if (eBlkMode == BLK_SKIP)
                   eBlkMode = (bDirect8x8) ? BLK_8x8 : BLK_4x4;

⌨️ 快捷键说明

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