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

📄 mbmvdata.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  m_acMv[10] = rcMbMotionDataBot.m_acMv[iMvOffset41+2];
  m_acMv[11] = rcMbMotionDataBot.m_acMv[iMvOffset41+3];
  m_acMv[12] = rcMbMotionDataBot.m_acMv[iMvOffset32+4];
  m_acMv[13] = rcMbMotionDataBot.m_acMv[iMvOffset32+5];
  m_acMv[14] = rcMbMotionDataBot.m_acMv[iMvOffset42+6];
  m_acMv[15] = rcMbMotionDataBot.m_acMv[iMvOffset42+7];

  for(Int n = 0; n < 16; n++ )
  {
    m_acMv[n].setFrameToFieldPredictor();
  }

  m_bFieldFlag = true;
}

Void MbMotionData::field2frame( const MbMotionData& rcMbMotionDataTop, const MbMotionData& rcMbMotionDataBot, Bool bTopFrameMb)
{
  Int iRefIdxOffset = 0;
  Int iMvOffset     = 0;
  if( ! bTopFrameMb )
  {
    iRefIdxOffset = 2;
    iMvOffset     = 8;
  }

	Bool bTopRef[4] = {true,true,true,true};
	if (rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+0] > BLOCK_NOT_PREDICTED)
	{
		m_ascRefIdx[0] = rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+0];
	}
	else
	{
		m_ascRefIdx[0] = rcMbMotionDataBot.m_ascRefIdx[iRefIdxOffset+0];
		bTopRef[0] = false;
	}
	m_ascRefIdx[2] = m_ascRefIdx[0];
	bTopRef[2] = bTopRef[0];

	if (rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+1] > BLOCK_NOT_PREDICTED)
	{
		m_ascRefIdx[1] = rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+1];
	}
	else
	{
		m_ascRefIdx[1] = rcMbMotionDataBot.m_ascRefIdx[iRefIdxOffset+1];
		bTopRef[1] = false;
}

	m_ascRefIdx[2] = m_ascRefIdx[0];
	bTopRef[2] = bTopRef[0];

	m_ascRefIdx[3] = m_ascRefIdx[1];
	bTopRef[3] = bTopRef[1];
 
  field2FrameRefIdx();

	m_acMv[ 0] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+0] : rcMbMotionDataBot.m_acMv[iMvOffset+0];
	m_acMv[ 1] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+1] : rcMbMotionDataBot.m_acMv[iMvOffset+1];
	m_acMv[ 2] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+2] : rcMbMotionDataBot.m_acMv[iMvOffset+2];
	m_acMv[ 3] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+3] : rcMbMotionDataBot.m_acMv[iMvOffset+3];
	m_acMv[ 4] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+0] : rcMbMotionDataBot.m_acMv[iMvOffset+0];
	m_acMv[ 5] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+1] : rcMbMotionDataBot.m_acMv[iMvOffset+1];
	m_acMv[ 6] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+2] : rcMbMotionDataBot.m_acMv[iMvOffset+2];
	m_acMv[ 7] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+3] : rcMbMotionDataBot.m_acMv[iMvOffset+3];

	m_acMv[ 8] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+4] : rcMbMotionDataBot.m_acMv[iMvOffset+4];
	m_acMv[ 9] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+5] : rcMbMotionDataBot.m_acMv[iMvOffset+5];
	m_acMv[10] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+6] : rcMbMotionDataBot.m_acMv[iMvOffset+6];
	m_acMv[11] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+7] : rcMbMotionDataBot.m_acMv[iMvOffset+7];
	m_acMv[12] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+4] : rcMbMotionDataBot.m_acMv[iMvOffset+4];
	m_acMv[13] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+5] : rcMbMotionDataBot.m_acMv[iMvOffset+5];
	m_acMv[14] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+6] : rcMbMotionDataBot.m_acMv[iMvOffset+6];
	m_acMv[15] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+7] : rcMbMotionDataBot.m_acMv[iMvOffset+7];

  m_bFieldFlag = false; 

  for( Int n = 0; n < 16; n++ )
  {
    m_acMv[n].setFieldToFramePredictor();
  }
}

Void MbMotionData::field2FrameRefIdx()
{
  Int n;
  for( n = 0; n < 4; n++ )
    {
      if( m_ascRefIdx[n] > BLOCK_NOT_PREDICTED )
      {
        m_ascRefIdx[n] = ((m_ascRefIdx[n]-1)>>1)+1;
      }
    }
}

Void MbMotionData::frame2FieldRefIdx()
{
  Int n;
  for( n = 0; n < 4; n++ )
    {
      if( m_ascRefIdx[n] > BLOCK_NOT_PREDICTED )
      {
        m_ascRefIdx[n] = ((m_ascRefIdx[n]-1)<<1)+1;
      }
    }
}

BlkMode MbMotionData::getBlkMode( const ParIdx8x8 eParIdx, BlkMode eBlkMode )
{

  Bool bR1 = m_acMv[ eParIdx + 0] == m_acMv[ eParIdx + 1];
  Bool bR2 = m_acMv[ eParIdx + 4] == m_acMv[ eParIdx + 5];
  Bool bC1 = m_acMv[ eParIdx + 0] == m_acMv[ eParIdx + 4];
  Bool bC2 = m_acMv[ eParIdx + 1] == m_acMv[ eParIdx + 5];

if( ! bC1 || ! bC2 )
  {
    eBlkMode = ( eBlkMode == BLK_8x8 ) ? BLK_8x4 : BLK_4x4;
  }
  if( ! bR1 || ! bR2 )
  {
    eBlkMode = ( eBlkMode == BLK_8x8 ) ? BLK_4x8  : BLK_4x4;
  }

  return eBlkMode;
}


Void  MbMotionData::copyFrom( const MbMotionData& rcMbMotionData )
{
  ::memcpy( m_acRefPic,   rcMbMotionData.m_acRefPic,  4 * sizeof(RefPic) );
  ::memcpy( m_ascRefIdx,  rcMbMotionData.m_ascRefIdx, 4 * sizeof(SChar) ); 
  m_usMotPredFlags = rcMbMotionData.m_usMotPredFlags;

  m_bFieldFlag = rcMbMotionData.m_bFieldFlag;
  MbMvData::copyFrom( rcMbMotionData );
}


ErrVal
MbMvData::upsampleMotion( const MbMvData& rcMbMvData, Par8x8 ePar8x8 )
{
  const Mv* pacMvSrc = &rcMbMvData.m_acMv[4*(ePar8x8&2)+2*(ePar8x8&1)];

  m_acMv[ 0] = m_acMv[ 1] = m_acMv[ 4] = m_acMv[ 5] = ( pacMvSrc[0] << 1 );
  m_acMv[ 2] = m_acMv[ 3] = m_acMv[ 6] = m_acMv[ 7] = ( pacMvSrc[1] << 1 );
  m_acMv[ 8] = m_acMv[ 9] = m_acMv[12] = m_acMv[13] = ( pacMvSrc[4] << 1 );
  m_acMv[10] = m_acMv[11] = m_acMv[14] = m_acMv[15] = ( pacMvSrc[5] << 1 );

  m_bFieldFlag = rcMbMvData.m_bFieldFlag;
  return Err::m_nOK;
}

ErrVal
MbMotionData::upsampleMotion( const MbMotionData& rcMbMotionData, Par8x8 ePar8x8 )
{
  m_ascRefIdx[0] = m_ascRefIdx[1] = m_ascRefIdx[2] = m_ascRefIdx[3] = rcMbMotionData.m_ascRefIdx[ePar8x8];
  
  m_acRefPic [0].setFrame( NULL );
  m_acRefPic [1].setFrame( NULL );
  m_acRefPic [2].setFrame( NULL );
  m_acRefPic [3].setFrame( NULL );

  RNOK( MbMvData::upsampleMotion( rcMbMotionData, ePar8x8 ) );

  return Err::m_nOK;
}

// TMM_ESS {
ErrVal
MbMotionData::upsampleMotionNonDyad( SChar* pscBl4x4RefIdx  , Mv* acBl4x4Mv , ResizeParameters* pcParameters )
{
  int iScaledBaseWidth  = pcParameters->m_iOutWidth;
  int iScaledBaseHeight = pcParameters->m_iOutHeight;
  int iBaseWidth        = pcParameters->m_iInWidth;
  int iBaseHeight       = pcParameters->m_iInHeight;
  
  for (UInt uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
  {	
	m_acRefPic[uiB8x8Idx].setFrame(NULL);
	m_ascRefIdx[uiB8x8Idx] = pscBl4x4RefIdx[g_aucConvertTo4x4Idx[uiB8x8Idx]];
	m_ascRefIdx[uiB8x8Idx] = ((m_ascRefIdx[uiB8x8Idx]<=0)?BLOCK_NOT_PREDICTED:m_ascRefIdx[uiB8x8Idx]); 
  }

  Int   dx , dy;

  for (Int iB4x4Idx=0 ; iB4x4Idx<16 ; iB4x4Idx++ )
  {
    m_acMv[iB4x4Idx] = acBl4x4Mv[iB4x4Idx];

    dx = (Int) m_acMv[iB4x4Idx].getHor();
    dy = (Int) m_acMv[iB4x4Idx].getVer();

    Int sign;
    sign = (dx>0) ? 1 : (-1);
    dx = sign * (sign * dx * iScaledBaseWidth + iBaseWidth/2 ) / iBaseWidth;
    sign = (dy>0)?1:(-1);
    dy = sign * (sign * dy * iScaledBaseHeight + iBaseHeight/2) / iBaseHeight;

    m_acMv[iB4x4Idx].set( dx , dy );
  }

  return Err::m_nOK;
}


ErrVal
MbMotionData::upsampleMotionNonDyad(SChar*              scBl8x8RefIdx , 
                                    Mv*                 acBl4x4Mv , 
                                    ResizeParameters*   pcParameters , 
                                    Mv                  deltaMv[4] ) 
{
  upsampleMotionNonDyad( scBl8x8RefIdx , acBl4x4Mv , pcParameters );

  // PICTURE LEVEL ESS 
  for (UInt uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
  {	
  	const UChar *b4Idx = &(g_aucConvertBlockOrder[uiB8x8Idx*4]);
    if (m_ascRefIdx[uiB8x8Idx] > 0)
    {
      m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
      m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
      m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
      m_acMv[*b4Idx] += deltaMv[uiB8x8Idx];
     }
    else
    {
      m_acMv[*(b4Idx++)].set(0,0);
      m_acMv[*(b4Idx++)].set(0,0);
      m_acMv[*(b4Idx++)].set(0,0);
      m_acMv[*(b4Idx)].set(0,0);
    }
  }
  return Err::m_nOK;
}

// TMM_ESS }

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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