Example #1
0
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 );
    }
  }
}
Example #2
0
ErrVal ReadYuvFile::destroy()
{
  AOT_DBG( m_cFile.is_open() );
  RNOK( uninit() )
  delete this;
  return Err::m_nOK;
}
Example #3
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
    }
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
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;
}
Example #10
0
//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;
}