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

📄 mbdata.cpp

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

                 aeBlkMode[uiIdxMb][uiB8x8Idx]=eBlkMode;
               }
             }

             aeMbMode[uiIdxMb]= eMbMode;

             bIsMbIntra &= (eMbMode==INTRA_4X4);
        }

   
    if(bIsMbIntra) m_eMbMode=INTRA_4X4;

    return Err::m_nOK;   
}


ErrVal
MbData::xBuildPartInfo(const Int         aiPelOrig[2],
                       ResizeParameters* pcParameters,
                       const MbMode      aeMbMode[4],
                       const  BlkMode    aeBlkMode[4][4],  
                       UInt              aui4x4Idx[4][4],
                       UInt              auiMbIdx [4][4], 
                       Int              aaiPartInfo[4][4],
                       Bool              abBl8x8Intra[4],
                       const UInt        uiMbBaseOrigX,
                       const UInt        uiMbBaseOrigY )
{
   for( Int x=0;x<2;x++)
    {
        for( Int y=0;y<2;y++)
        {
            UInt uiB8x8Idx=(y<<1) + x;

            UInt uiBaseX0=((aiPelOrig[0]+x*8+1)*pcParameters->m_iInWidth  + pcParameters->m_iOutWidth/2)  / pcParameters->m_iOutWidth ;
            UInt uiBaseX1=((aiPelOrig[0]+x*8+5)*pcParameters->m_iInWidth  + pcParameters->m_iOutWidth/2)  / pcParameters->m_iOutWidth ;
            UInt uiBaseY0=((aiPelOrig[1]+y*8+1)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
            UInt uiBaseY1=((aiPelOrig[1]+y*8+5)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
            
            uiBaseX0 -= (uiMbBaseOrigX<<4);
            uiBaseX1 -= (uiMbBaseOrigX<<4);
            uiBaseY0 -= (uiMbBaseOrigY<<4);
            uiBaseY1 -= (uiMbBaseOrigY<<4);

            //Set Base Indexes
            ///////////////////
            aui4x4Idx[uiB8x8Idx][0]=(((uiBaseY0>>2)%4)<<2)+((uiBaseX0>>2)%4);
            aui4x4Idx[uiB8x8Idx][1]=(((uiBaseY0>>2)%4)<<2)+((uiBaseX1>>2)%4);
            aui4x4Idx[uiB8x8Idx][2]=(((uiBaseY1>>2)%4)<<2)+((uiBaseX0>>2)%4);
            aui4x4Idx[uiB8x8Idx][3]=(((uiBaseY1>>2)%4)<<2)+((uiBaseX1>>2)%4);

            auiMbIdx[uiB8x8Idx][0]=((uiBaseY0>>4)<<1)+(uiBaseX0>>4);
            auiMbIdx[uiB8x8Idx][1]=((uiBaseY0>>4)<<1)+(uiBaseX1>>4);
            auiMbIdx[uiB8x8Idx][2]=((uiBaseY1>>4)<<1)+(uiBaseX0>>4);
            auiMbIdx[uiB8x8Idx][3]=((uiBaseY1>>4)<<1)+(uiBaseX1>>4);
          
          //Set PartInfo
          /////////////// 
          aaiPartInfo[uiB8x8Idx][0]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][0]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][0]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][0]]])%8 ] [aui4x4Idx[uiB8x8Idx][0]];
          aaiPartInfo[uiB8x8Idx][1]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][1]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][1]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][1]]])%8 ] [aui4x4Idx[uiB8x8Idx][1]];
          aaiPartInfo[uiB8x8Idx][2]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][2]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][2]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][2]]])%8 ] [aui4x4Idx[uiB8x8Idx][2]];
          aaiPartInfo[uiB8x8Idx][3]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][3]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][3]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][3]]])%8 ] [aui4x4Idx[uiB8x8Idx][3]];
         
          aaiPartInfo[uiB8x8Idx][0]+=  (aaiPartInfo[uiB8x8Idx][0]==-1? 0:auiMbIdx[uiB8x8Idx][0]<<4);
          aaiPartInfo[uiB8x8Idx][1]+=  (aaiPartInfo[uiB8x8Idx][1]==-1? 0:auiMbIdx[uiB8x8Idx][1]<<4);
          aaiPartInfo[uiB8x8Idx][2]+=  (aaiPartInfo[uiB8x8Idx][2]==-1? 0:auiMbIdx[uiB8x8Idx][2]<<4);
          aaiPartInfo[uiB8x8Idx][3]+=  (aaiPartInfo[uiB8x8Idx][3]==-1? 0:auiMbIdx[uiB8x8Idx][3]<<4);
            
          abBl8x8Intra[uiB8x8Idx]=(aaiPartInfo[uiB8x8Idx][0]==-1)&&(aaiPartInfo[uiB8x8Idx][1]==-1)&&(aaiPartInfo[uiB8x8Idx][2]==-1)&&(aaiPartInfo[uiB8x8Idx][3]==-1);
        }
    }     

    return Err::m_nOK;
}

        
ErrVal 
MbData::xInherit8x8MotionData( const UInt        aui4x4Idx  [4][4],
                               const UInt        auiMbIdx	  [4][4], 
                               const Int         aaiPartInfo[4][4])
 {
   UInt uiB8x8Idx=0;
   for(uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
   {
     //Compute  m_aBlkMode
     //-------------------
     Bool bR1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][1];
     Bool bR2 = aaiPartInfo[uiB8x8Idx][2]==aaiPartInfo[uiB8x8Idx][3];
     Bool bC1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][2];
     Bool bC2 = aaiPartInfo[uiB8x8Idx][1]==aaiPartInfo[uiB8x8Idx][3];

     //We assume that m_aBlkMode[uiB8x8Idx]has been initialized with BLK_8x8
     if( ! bC1 || ! bC2 )
     {
       m_aBlkMode[uiB8x8Idx]= BLK_8x4 ;
     }
     if( ! bR1 || ! bR2 )
     {
       m_aBlkMode[uiB8x8Idx]= ( m_aBlkMode[uiB8x8Idx] == BLK_8x8 ) ? BLK_4x8  : BLK_4x4;
     }
   
    // Inherit from base mv and RefIdx
    //---------------------------------
     const UInt*  pucMbIdx =auiMbIdx[uiB8x8Idx];
     const UInt*  puc4x4Idx=aui4x4Idx[uiB8x8Idx];
     const UChar* pucBlockOrder=&(g_aucConvertBlockOrder[uiB8x8Idx<<2]);

     for(UInt uiBl4x4Idx=0;uiBl4x4Idx<4;uiBl4x4Idx++,puc4x4Idx++,pucMbIdx++,pucBlockOrder++)
     {
       MbMotionData* pcmbMd0=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[0];
       MbMotionData* pcmbMd1=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[1];

       const UChar ucMapIdx=*puc4x4Idx;
       const UChar uc8x8Idx=g_aucConvertTo8x8Idx[ucMapIdx];
       m_acBl4x4Mv[0][*pucBlockOrder]     =pcmbMd0->getMv(B4x4Idx(ucMapIdx));
       m_ascBl4x4RefIdx[0][*pucBlockOrder]=pcmbMd0->getRefIdx(Par8x8(uc8x8Idx));	
       m_acBl4x4Mv[1][*pucBlockOrder]     =pcmbMd1->getMv(B4x4Idx(ucMapIdx));
       m_ascBl4x4RefIdx[1][*pucBlockOrder]=pcmbMd1->getRefIdx(Par8x8(uc8x8Idx));

       //fill cbp
       ///////////
       if((m_apcMbData[*pucMbIdx]->getMbExtCbp()>>ucMapIdx)&1)
         m_uiMbCbp|=(1<<(*pucBlockOrder));
     }
   }

   //Homogenization step
   ////////////////////////////////
   //--- Merge Ref Indexes and Mvs inside a given 8x8 block  
   for ( uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++) 
     if(m_aBlkMode[uiB8x8Idx]!= BLK_8x8) xMergeBl8x8MvAndRef(uiB8x8Idx);

   return Err::m_nOK;
 }

ErrVal 
MbData::xInheritMbMotionData(const Int aaiPartInfo[4][4])
 {
     Bool bR1 = (m_aBlkMode[0]==m_aBlkMode[1]) && (m_aBlkMode[0]==BLK_8x8) && (aaiPartInfo[0][0]==aaiPartInfo[1][0]);
     Bool bR2 = (m_aBlkMode[2]==m_aBlkMode[3]) && (m_aBlkMode[2]==BLK_8x8) && (aaiPartInfo[2][0]==aaiPartInfo[3][0]);
     Bool bC1 = (m_aBlkMode[0]==m_aBlkMode[2]) && (m_aBlkMode[0]==BLK_8x8) && (aaiPartInfo[0][0]==aaiPartInfo[2][0]);
     Bool bC2 = (m_aBlkMode[1]==m_aBlkMode[3]) && (m_aBlkMode[1]==BLK_8x8) && (aaiPartInfo[1][0]==aaiPartInfo[3][0]);

      //We assume that m_eMbMode has been initialized with MODE_16x16
     if( ! bC1 || ! bC2 )
     {
       m_eMbMode = MODE_16x8 ;
     }
     if( ! bR1 || ! bR2 )
     {
        m_eMbMode = ( m_eMbMode == MODE_16x16 ) ? MODE_8x16  : MODE_8x8;
     }

     return Err::m_nOK;
 }

ErrVal
MbData::xMergeBl8x8MvAndRef(const UInt uiBlIdx)
{
  const UChar* pucWhich=&(g_aucConvertBlockOrder[uiBlIdx*4]);
  SChar ascChosenRefIdx[2]={MSYS_INT8_MAX,MSYS_INT8_MAX};
	UInt uiIdxstride=((m_aBlkMode[uiBlIdx]==BLK_8x4)?2:1);
	const UInt uiNbBl4x4=((m_aBlkMode[uiBlIdx]==BLK_4x4)?4:2);
	const UChar* pucMap=0;
	UInt uiList,Bl4x4Idx;

     for(uiList=0 ; uiList < 2 ; uiList++)
    {
        pucMap=pucWhich;

        for(Bl4x4Idx=0;Bl4x4Idx<uiNbBl4x4;Bl4x4Idx++,pucMap+=uiIdxstride)
        { 
            SChar scRefIdx=m_ascBl4x4RefIdx[uiList][*pucMap];
            if( scRefIdx>0) 
            {
                if(ascChosenRefIdx[uiList]>scRefIdx) ascChosenRefIdx[uiList]=scRefIdx;
            }
        }	
    }

    ascChosenRefIdx[0]=((ascChosenRefIdx[0]==MSYS_INT8_MAX)? -1:ascChosenRefIdx[0]);
    ascChosenRefIdx[1]=((ascChosenRefIdx[1]==MSYS_INT8_MAX)? -1:ascChosenRefIdx[1]);

    for(uiList=0 ; uiList < 2 ; uiList++)
    {
        if(ascChosenRefIdx[uiList]>0)
        {
            pucMap=pucWhich;
            for(Bl4x4Idx=0;Bl4x4Idx<4;Bl4x4Idx++,pucMap++)
            {
                if(m_ascBl4x4RefIdx[uiList][*pucMap]!=ascChosenRefIdx[uiList])	
                    xFillMvandRefBl4x4(Bl4x4Idx,pucWhich,uiList,ascChosenRefIdx);
            }
        }
        else
        {
            pucMap=pucWhich;
            for(Bl4x4Idx=0;Bl4x4Idx<4;Bl4x4Idx++,pucMap++)
            {
                m_ascBl4x4RefIdx[uiList][*pucMap]=-1;
                m_acBl4x4Mv[uiList][*pucMap].setZero();
            }
        }
    }

    return Err::m_nOK;
}

ErrVal
MbData::xFillMvandRefBl4x4(const UInt uiBlIdx,const UChar* pucWhich,const UInt uiList,const SChar* psChosenRefIdx)
{	
    UChar ucRealBlIdx=pucWhich[uiBlIdx];
    UChar ucPredIdx=m_aucPredictor[0][uiBlIdx];
    UChar ucRealPredIdx=pucWhich[ucPredIdx];

    if(m_ascBl4x4RefIdx[uiList][ucRealPredIdx]!=psChosenRefIdx[uiList])
    {
        ucPredIdx=m_aucPredictor[1][uiBlIdx];
        ucRealPredIdx=pucWhich[ucPredIdx];

        if(m_ascBl4x4RefIdx[uiList][ucRealPredIdx]!=psChosenRefIdx[uiList])		
            xFillMvandRefBl4x4(ucPredIdx,pucWhich,uiList,psChosenRefIdx);
    }	

    m_ascBl4x4RefIdx[uiList][ucRealBlIdx]=m_ascBl4x4RefIdx[uiList][ucRealPredIdx];
    m_acBl4x4Mv[uiList][ucRealBlIdx]=m_acBl4x4Mv[uiList][ucRealPredIdx];

    return Err::m_nOK;
}

ErrVal
MbData::xRemoveIntra8x8(const UInt uiBlIdx, 
                        const Bool* abBl8x8Intra,
                        UInt  aui4x4Idx[4][4],
                        UInt  auiMbIdx[4][4],
                        Int  aaiPartInfo[4][4])
                        
{	
    UChar ucPredIdx=m_aucPredictor[0][uiBlIdx] ;
    if(abBl8x8Intra[ucPredIdx])
    {
        ucPredIdx=m_aucPredictor[1][uiBlIdx] ;
        if(abBl8x8Intra[ucPredIdx])
            xRemoveIntra8x8(ucPredIdx,abBl8x8Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);
    }
    xCopyBl8x8(ucPredIdx,uiBlIdx,aui4x4Idx,auiMbIdx,aaiPartInfo);

    return Err::m_nOK;
}

ErrVal
MbData::xCopyBl8x8(const UInt uiBlIdx,
                   const UInt uiBlIdxCopy,
                   UInt  aui4x4Idx[4][4],
                   UInt  auiMbIdx[4][4],
                   Int  aaiPartInfo[4][4])
{
    for( UInt uiB4x4Idx=0;uiB4x4Idx<4;uiB4x4Idx++)
    {
      aui4x4Idx[uiBlIdxCopy][uiB4x4Idx]=aui4x4Idx[uiBlIdx][uiB4x4Idx];
      auiMbIdx [uiBlIdxCopy][uiB4x4Idx]=auiMbIdx[uiBlIdx][uiB4x4Idx];
      aaiPartInfo[uiBlIdxCopy][uiB4x4Idx]=aaiPartInfo[uiBlIdx][uiB4x4Idx];
    }
    return Err::m_nOK;
}

 
         

ErrVal
MbData::xRemoveIntra4x4(const UInt uiBlIdx,
                        Bool bWasBl4x4Intra[4], //TMM_JV
                        UInt  aui4x4Idx[4],
                        UInt  auiMbIdx[4],
                        Int  aaiPartInfo[4])
{
    UChar ucPredIdx=m_aucPredictor[0][uiBlIdx] ;

    if(bWasBl4x4Intra[ucPredIdx] || aaiPartInfo[ucPredIdx]==-1)
    {
        ucPredIdx=m_aucPredictor[1][uiBlIdx] ;
        if(bWasBl4x4Intra[ucPredIdx] || aaiPartInfo[ucPredIdx]==-1)//TMM_JV
            xRemoveIntra4x4(ucPredIdx,bWasBl4x4Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);
    }
    aui4x4Idx[uiBlIdx]  = aui4x4Idx[ucPredIdx];
    auiMbIdx[uiBlIdx]   = auiMbIdx [ucPredIdx];
    aaiPartInfo[uiBlIdx]= aaiPartInfo[ucPredIdx];
    bWasBl4x4Intra[uiBlIdx]=true; //TMM_JV

    return Err::m_nOK;
}




ErrVal
MbData::xFillMbMvData(ResizeParameters* pcParameters )
{
    //--- IF ESS PICTURE LEVEL
    if( pcParameters->m_iExtendedSpatialScalability == ESS_PICT )
    {
        Mv      deltaMv[4];
        Int     refFrNum, refPosX, refPosY;
        Int     curFrNum = pcParameters->getPoc();
        Int     curPosX = pcParameters->getCurrentPictureParameters(curFrNum)->m_iPosX;
        Int     curPosY = pcParameters->getCurrentPictureParameters(curFrNum)->m_iPosY;

        for (UInt uilist=0; uilist<2; uilist++)
        {	for (UInt uiB8x8Idx=0; uiB8x8Idx<4 ; uiB8x8Idx++)
        {
            int refidx=	 m_ascBl4x4RefIdx[uilist][g_aucConvertTo4x4Idx[uiB8x8Idx]];
            if(refidx <=0)  deltaMv[uiB8x8Idx].set(0,0) ;
            else
            {
                refFrNum = pcParameters->m_aiRefListPoc[uilist][refidx-1];
                refPosX = pcParameters->getCurrentPictureParameters(refFrNum)->m_iPosX;
                refPosY = pcParameters->getCurrentPictureParameters(refFrNum)->m_iPosY;
                deltaMv[uiB8x8Idx].set( 4*(refPosX-curPosX) , 4*(refPosY-curPosY) );
            }
        }
        m_apcMbMotionData[uilist]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[uilist] , m_acBl4x4Mv[uilist] , pcParameters , deltaMv );
        }
    }
    else
    {
        m_apcMbMotionData[0]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[0] , m_acBl4x4Mv[0] , pcParameters );
        m_apcMbMotionData[1]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[1] , m_acBl4x4Mv[1] , pcParameters );
    }

    return Err::m_nOK;   
}

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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