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

📄 downconvert.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  //===== luma =====
  xCopyToImageBuffer      ( pucBufferY,   iInWidth,   iInHeight,   iStrideY );
  xCompUpsampling6tapBilin( pcParameters, false );
  xCopyFromImageBuffer    ( pucBufferY,   iGlobWidth, iGlobHeight, iStrideY );
  //===== parameters for chroma =====
  iInWidth    >>= 1;
  iInHeight   >>= 1;
  iGlobWidth  >>= 1;
  iGlobHeight >>= 1;
  //===== chroma cb =====
  xCopyToImageBuffer      ( pucBufferU,   iInWidth,   iInHeight,   iStrideU );
  xCompUpsampling6tapBilin( pcParameters, true );
  xCopyFromImageBuffer    ( pucBufferU,   iGlobWidth, iGlobHeight, iStrideU );
  //===== chroma cr =====
  xCopyToImageBuffer      ( pucBufferV,   iInWidth,   iInHeight,   iStrideV );
  xCompUpsampling6tapBilin( pcParameters, true );
  xCopyFromImageBuffer    ( pucBufferV,   iGlobWidth, iGlobHeight, iStrideV );
}


void
DownConvert::upsamplingSVC( unsigned char*    pucBufferY,   int   iStrideY,
                            unsigned char*    pucBufferU,   int   iStrideU,
                            unsigned char*    pucBufferV,   int   iStrideV,
                            ResizeParameters* pcParameters, bool  bBotCoincided )
{
  int   iBaseW                  =   pcParameters->m_iRefLayerFrmWidth;
  int   iBaseH                  =   pcParameters->m_iRefLayerFrmHeight;
  int   iCurrW                  =   pcParameters->m_iFrameWidth;
  int   iCurrH                  =   pcParameters->m_iFrameHeight;
  bool  bTopAndBottomResampling = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag == false  &&
                                    pcParameters->m_bRefLayerFieldPicFlag     == false  &&
                                    pcParameters->m_bFrameMbsOnlyFlag         == false  &&
                                    pcParameters->m_bFieldPicFlag             == false    );
  bool  bFrameBasedResampling   = ( pcParameters->m_bFrameMbsOnlyFlag         == true   && 
                                    pcParameters->m_bRefLayerFrameMbsOnlyFlag == true     );
  bool  bVerticalInterpolation  = ( bFrameBasedResampling                     == false  &&
                                    pcParameters->m_bFieldPicFlag             == false    );
  bool  bCurrBotField           = ( pcParameters->m_bFieldPicFlag             == true   &&
                                    pcParameters->m_bBotFieldFlag             == true     );
  bool  bBotFieldFlag           = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag ?  false
                                  : pcParameters->m_bFieldPicFlag             ?  pcParameters->m_bBotFieldFlag
                                  : pcParameters->m_bRefLayerFieldPicFlag     ?  pcParameters->m_bRefLayerBotFieldFlag
                                  : false );
  int   iBaseField              = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag ?  0 : 1 );
  int   iCurrField              = ( pcParameters->m_bFieldPicFlag             ?  1 : 0 );
  int   iBaseBot                = ( bBotFieldFlag ? 1 : 0 );
  int   iCurrBot                = ( bCurrBotField ? 1 : 0 );

  //==== check bot field coincided parameter for progressive to interlaced resampling =====
  if( pcParameters->m_bRefLayerFrameMbsOnlyFlag && ! pcParameters->m_bFrameMbsOnlyFlag )
  {
    bBotFieldFlag = bBotCoincided;
  }

  //=======================
  //=====   L U M A   =====
  //=======================
  if( bTopAndBottomResampling )
  {
    //===== top field =====
    unsigned char* pFld = pucBufferY;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideY << 1 );
    xCompIntraUpsampling( pcParameters, false,  false,       false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideY << 1 );

    //===== bottom field =====
    pFld += iStrideY;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideY << 1 );
    xCompIntraUpsampling( pcParameters, false,  true,        false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideY << 1 );
  }
  else
  {
    unsigned char* pSrc = pucBufferY + iStrideY * iBaseBot;
    unsigned char* pDes = pucBufferY + iStrideY * iCurrBot;
    xCopyToImageBuffer  ( pSrc,         iBaseW, iBaseH >> iBaseField, iStrideY << iBaseField );
    xCompIntraUpsampling( pcParameters, false,  bBotFieldFlag,        bVerticalInterpolation );
    xCopyFromImageBuffer( pDes,         iCurrW, iCurrH >> iCurrField, iStrideY << iCurrField );
  }

  iBaseW >>= 1;
  iBaseH >>= 1;
  iCurrW >>= 1;
  iCurrH >>= 1;

  //===========================
  //=====   C H R O M A   =====
  //===========================
  if( bTopAndBottomResampling )
  {
    //===== top field (U) =====
    unsigned char* pFld = pucBufferU;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideU << 1 );
    xCompIntraUpsampling( pcParameters, true,   false,       false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideU << 1 );

    //===== bottom field (U) =====
    pFld += iStrideU;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideU << 1 );
    xCompIntraUpsampling( pcParameters, true,   true,        false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideU << 1 );

    //===== top field (V) =====
    pFld = pucBufferV;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideV << 1 );
    xCompIntraUpsampling( pcParameters, true,   false,       false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideV << 1 );

    //===== bottom field (V) =====
    pFld += iStrideV;
    xCopyToImageBuffer  ( pFld,         iBaseW, iBaseH >> 1, iStrideV << 1 );
    xCompIntraUpsampling( pcParameters, true,   true,        false         );
    xCopyFromImageBuffer( pFld,         iCurrW, iCurrH >> 1, iStrideV << 1 );
  }
  else
  {
    //===== U =====
    unsigned char* pSrc = pucBufferU + iStrideU * iBaseBot;
    unsigned char* pDes = pucBufferU + iStrideU * iCurrBot;
    xCopyToImageBuffer  ( pSrc,         iBaseW, iBaseH >> iBaseField, iStrideU << iBaseField );
    xCompIntraUpsampling( pcParameters, true,   bBotFieldFlag,        bVerticalInterpolation );
    xCopyFromImageBuffer( pDes,         iCurrW, iCurrH >> iCurrField, iStrideU << iCurrField );

    //===== V =====
    pSrc = pucBufferV + iStrideV * iBaseBot;
    pDes = pucBufferV + iStrideV * iCurrBot;
    xCopyToImageBuffer  ( pSrc,         iBaseW, iBaseH >> iBaseField, iStrideV << iBaseField );
    xCompIntraUpsampling( pcParameters, true,   bBotFieldFlag,        bVerticalInterpolation );
    xCopyFromImageBuffer( pDes,         iCurrW, iCurrH >> iCurrField, iStrideV << iCurrField );
  }
} 


void
DownConvert::downsamplingDyadic( unsigned char*    pucBufferY,   int iStrideY,
                                 unsigned char*    pucBufferU,   int iStrideU,
                                 unsigned char*    pucBufferV,   int iStrideV,
                                 ResizeParameters* pcParameters )
{
  int iWidth  = pcParameters->m_iRefLayerFrmWidth;
  int iHeight = pcParameters->m_iRefLayerFrmHeight;
  int iRatio  = pcParameters->m_iRefLayerFrmWidth / pcParameters->m_iFrameWidth;
  int iStages = 0;
  while( iRatio > 1 )
  {
    iStages++;
    iRatio >>= 1;
  }

  for( int i = iStages; i > 0; i-- )
  {
    //===== luma =====
    xCopyToImageBuffer      ( pucBufferY, iWidth,      iHeight,      iStrideY );
    xCompDownsamplingDyadic (             iWidth,      iHeight                );
    xCopyFromImageBuffer    ( pucBufferY, iWidth >> 1, iHeight >> 1, iStrideY );
    //===== chroma cb =====
    xCopyToImageBuffer      ( pucBufferU, iWidth >> 1, iHeight >> 1, iStrideU );
    xCompDownsamplingDyadic (             iWidth >> 1, iHeight >> 1           );
    xCopyFromImageBuffer    ( pucBufferU, iWidth >> 2, iHeight >> 2, iStrideU );
    //===== chroma cr =====
    xCopyToImageBuffer      ( pucBufferV, iWidth >> 1, iHeight >> 1, iStrideV );
    xCompDownsamplingDyadic (             iWidth >> 1, iHeight >> 1           );
    xCopyFromImageBuffer    ( pucBufferV, iWidth >> 2, iHeight >> 2, iStrideV );
    iWidth  >>= 1;
    iHeight >>= 1;
  }
}


void
DownConvert::downsamplingSVC( unsigned char*    pucBufferY,   int   iStrideY,
                              unsigned char*    pucBufferU,   int   iStrideU,
                              unsigned char*    pucBufferV,   int   iStrideV,
                              ResizeParameters* pcParameters, bool  bBotCoincided )
{
  int   iBaseW                  =   pcParameters->m_iFrameWidth;
  int   iBaseH                  =   pcParameters->m_iFrameHeight;
  int   iCurrW                  =   pcParameters->m_iRefLayerFrmWidth;
  int   iCurrH                  =   pcParameters->m_iRefLayerFrmHeight;
  bool  bTopAndBottomResampling = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag == false  &&
                                    pcParameters->m_bRefLayerFieldPicFlag     == false  &&
                                    pcParameters->m_bFrameMbsOnlyFlag         == false  &&
                                    pcParameters->m_bFieldPicFlag             == false    );
  bool  bVerticalDownsampling   = ( pcParameters->m_bFrameMbsOnlyFlag         == true   &&
                                    pcParameters->m_bRefLayerFieldPicFlag     == true     );
  bool  bCurrBotField           = ( pcParameters->m_bFieldPicFlag             == true   &&
                                    pcParameters->m_bBotFieldFlag             == true     );
  bool  bBotFieldFlag           = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag ?  false
                                  : pcParameters->m_bFieldPicFlag             ?  pcParameters->m_bBotFieldFlag
                                  : pcParameters->m_bRefLayerFieldPicFlag     ?  pcParameters->m_bRefLayerBotFieldFlag
                                  : false );
  int   iBaseField              = ( pcParameters->m_bRefLayerFrameMbsOnlyFlag ?  0 : 1 );
  int   iCurrField              = ( pcParameters->m_bFieldPicFlag             ?  1 : 0 );
  int   iBaseBot                = ( bBotFieldFlag ? 1 : 0 );
  int   iCurrBot                = ( bCurrBotField ? 1 : 0 );

  //==== check bot field coincided parameter for interlaced to progressive resampling =====
  if( pcParameters->m_bRefLayerFrameMbsOnlyFlag && ! pcParameters->m_bFrameMbsOnlyFlag )
  {
    bBotFieldFlag = bBotCoincided;
  }

  //=======================
  //=====   L U M A   =====
  //=======================
  if( bTopAndBottomResampling )
  {
    //===== top field =====
    unsigned char* pFld = pucBufferY;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideY << 1 );
    xCompDownsampling   ( pcParameters, false,  false,       false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideY << 1 );

    //===== bottom field =====
    pFld += iStrideY;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideY << 1 );
    xCompDownsampling   ( pcParameters, false,  true,        false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideY << 1 );
  }
  else
  {
    unsigned char* pSrc = pucBufferY + iStrideY * iCurrBot;
    unsigned char* pDes = pucBufferY + iStrideY * iBaseBot;
    xCopyToImageBuffer  ( pSrc,         iCurrW, iCurrH >> iCurrField, iStrideY << iCurrField );
    xCompDownsampling   ( pcParameters, false,  bBotFieldFlag,        bVerticalDownsampling  );
    xCopyFromImageBuffer( pDes,         iBaseW, iBaseH >> iBaseField, iStrideY << iBaseField );
  }

  iBaseW >>= 1;
  iBaseH >>= 1;
  iCurrW >>= 1;
  iCurrH >>= 1;

  //===========================
  //=====   C H R O M A   =====
  //===========================
  if( bTopAndBottomResampling )
  {
    //===== top field (U) =====
    unsigned char* pFld = pucBufferU;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideU << 1 );
    xCompDownsampling   ( pcParameters, true,   false,       false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideU << 1 );

    //===== bottom field (U) =====
    pFld += iStrideU;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideU << 1 );
    xCompDownsampling   ( pcParameters, true,   true,        false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideU << 1 );

    //===== top field (V) =====
    pFld = pucBufferV;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideV << 1 );
    xCompDownsampling   ( pcParameters, true,   false,       false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideV << 1 );

    //===== bottom field (V) =====
    pFld += iStrideV;
    xCopyToImageBuffer  ( pFld,         iCurrW, iCurrH >> 1, iStrideV << 1 );
    xCompDownsampling   ( pcParameters, true,   true,        false         );
    xCopyFromImageBuffer( pFld,         iBaseW, iBaseH >> 1, iStrideV << 1 );
  }
  else
  {
    //===== U =====
    unsigned char* pSrc = pucBufferU + iStrideU * iCurrBot;
    unsigned char* pDes = pucBufferU + iStrideU * iBaseBot;
    xCopyToImageBuffer  ( pSrc,         iCurrW, iCurrH >> iCurrField, iStrideU << iCurrField );
    xCompDownsampling   ( pcParameters, true,   bBotFieldFlag,        bVerticalDownsampling  );
    xCopyFromImageBuffer( pDes,         iBaseW, iBaseH >> iBaseField, iStrideU << iBaseField );

    //===== V =====
    pSrc = pucBufferV + iStrideV * iCurrBot;
    pDes = pucBufferV + iStrideV * iBaseBot;
    xCopyToImageBuffer  ( pSrc,         iCurrW, iCurrH >> iCurrField, iStrideV << iCurrField );
    xCompDownsampling   ( pcParameters, true,   bBotFieldFlag,        bVerticalDownsampling  );
    xCopyFromImageBuffer( pDes,         iBaseW, iBaseH >> iBaseField, iStrideV << iBaseField );
  }
} 

#else




//=========================================================================
//
//   M A I N   F U N C T I O N S   F O R   E N C O D E R / D E C O D E R   
//
//=========================================================================

void
DownConvert::intraUpsampling( Frame*                pcFrame, 
                              Frame*                pcBaseFrame,
                              Frame*                pcTempFrame,
                              Frame*                pcTempBaseFrame,
                              ResizeParameters*     pcParameters,
                              MbDataCtrl*           pcMbDataCtrlBase, 
                              MbDataCtrl*           pcMbDataCtrlPredFrm, 
                              MbDataCtrl*           pcMbDataCtrlPredFld, 
                              ReconstructionBypass* pcReconstructionBypass,
                              Bool*                 pabBaseModeAllowedFlagArrayFrm,
                              Bool*                 pabBaseModeAllowedFlagArrayFld,
                              Bool                  bConstrainedIntraResamplingFlag )
{
  Bool    bResampling             = pcParameters->getSpatialResolutionChangeFlag();
  Bool    bConstrainedResampling  = ( bResampling && bConstrainedIntraResamplingFlag );
  Bool    bCropOnly               = ( ! bResampling && pcParameters->getCroppingFlag() );
  PicType ePicType                = ( pcParameters->m_bFieldPicFlag ? ( pcParameters->m_bBotFieldFlag ? BOT_FIELD : TOP_FIELD ) : FRAME );

  if( ! bConstrainedResampling )
  {
    xInitBaseModeAllowedFlags( pcParameters, pabBaseModeAllowedFlagArrayFrm, pabBaseModeAllowedFlagArrayFld );
    if( ! bResampling && ! bCropOnly )
    {
      pcFrame->copy( pcBaseFrame, ePicType );
      return;
    }
    if( bCropOnly )
    {
      xCrop( pcFrame, pcBaseFrame, pcParameters, 128 );
      return;
    }
    pcTempBaseFrame       ->copy        ( pcBaseFrame,     ePicType );
    pcReconstructionBypass->padRecFrame ( pcTempBaseFrame, pcMbDataCtrlBase, pcParameters );
    xIntraUpsampling( pcFrame, pcTempBaseFrame, pcParameters );
    return;

⌨️ 快捷键说明

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