📄 downconvert.cpp
字号:
//===== 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 + -