📄 downconvert.inl
字号:
int i, j, i0, ip1;
int y0 = iPosY/2;
int y1 = y0 + iCropY/2;
//========== vertical upsampling ===========
for( j = 0; j < iWidth; j++ )
{
int* piSrc = &m_paiImageBuffer[j];
//----- upsample column -----
for( i = 0; i < iHeight; i++)
{
if(i<y0 || i>=y1){
m_paiTmp1dBuffer[2*i+1-top_flg] = m_paiTmp1dBuffer[2*i+top_flg] = piSrc[i*m_iImageStride];
continue;
}
if(top_flg)
{
i0 = ( (i< y1 ) ? i : y1 -1 ) * m_iImageStride;
ip1 = ( (i< y1-1) ? i+1 : y1 -1 ) * m_iImageStride;
}
else
{
ip1 = ( (i< y0+1) ? y0 : i -1 ) * m_iImageStride;
i0 = ( (i< y1 ) ? i : y1 -1 ) * m_iImageStride;
}
//--- even sample ---
m_paiTmp1dBuffer[2*i+1-top_flg] = piSrc[i0 ];
//--- odd sample ---
m_paiTmp1dBuffer[2*i+top_flg] = (piSrc[i0 ] + piSrc[ip1] + 1) / 2;
}
//----- copy back to image buffer -----
for( i = 0; i < iHeight*2; i++ )
piSrc[i*m_iImageStride] = m_paiTmp1dBuffer[i];
}
}
#ifndef DOWN_CONVERT_STATIC //TMM_JV
//-------------------------------------------------
//JSVM upsampling methods (encoder + decoder) only
//-------------------------------------------------
// ===== Upsample Intra Short =======================================================
__inline
void
DownConvert::upsample ( short* psBufferY, int iStrideY,
short* psBufferU, int iStrideU,
short* psBufferV, int iStrideV,
ResizeParameters* pcParameters,
bool bClip )
{
//===== Upsampling ======
//TMM_INTERLACE
if (pcParameters->m_iSpatialScalabilityType > SST_RATIO_1 || pcParameters->m_iResampleMode > 0)
{
/* switch (pcParameters->m_iSpatialScalabilityType)
{
case SST_RATIO_1:
break;
default:*/
xGenericUpsampleEss(psBufferY, iStrideY,
psBufferU, iStrideU,
psBufferV, iStrideV,
pcParameters, bClip
);
}
//===== Cropping =====
if(pcParameters->m_iSpatialScalabilityType <= SST_RATIO_1 && pcParameters->m_bCrop)
{
xCrop(psBufferY, iStrideY,
psBufferU, iStrideU,
psBufferV, iStrideV,
pcParameters, bClip
);
}
}
__inline
void
DownConvert::upsampleResidual ( short* psBufferY, int iStrideY,
short* psBufferU, int iStrideU,
short* psBufferV, int iStrideV,
ResizeParameters* pcParameters,
h264::MbDataCtrl* pcMbDataCtrl,
bool bClip )
{
//===== Upsampling ======
//TMM_INTERLACE
if(pcParameters->m_iSpatialScalabilityType > SST_RATIO_1 || pcParameters->m_iResampleMode > 0)
{
/*switch (pcParameters->m_iSpatialScalabilityType)
{
case SST_RATIO_1:
break;
default:*/
xGenericUpsampleEss(psBufferY, iStrideY,
psBufferU, iStrideU,
psBufferV, iStrideV,
pcParameters,
pcMbDataCtrl);
}
//===== Cropping =====
if(pcParameters->m_iSpatialScalabilityType <= SST_RATIO_1 && pcParameters->m_bCrop)
{
xCrop(psBufferY, iStrideY,
psBufferU, iStrideU,
psBufferV, iStrideV,
pcParameters, bClip
);
}
}
__inline
void
DownConvert::xGenericUpsampleEss( short* psBufferY, int iStrideY,
short* psBufferU, int iStrideU,
short* psBufferV, int iStrideV,
ResizeParameters* pcParameters,
h264::MbDataCtrl* pcMbDataCtrl)
{
int iWidth=pcParameters->m_iInWidth;
int iHeight=pcParameters->m_iInHeight;
int width=pcParameters->m_iGlobWidth;
int height=pcParameters->m_iGlobHeight;
int x, y, w, h, j, i;
short *buf1, *ptr1, *buf2, *ptr2, *tmp_buf1, *tmp_buf2;
unsigned char *tmp_buf3;
int resample_mode = pcParameters->m_iResampleMode;
int iNbPasses=1+(resample_mode==1);
int iPass;
bool top_flg;
int input_chroma_phase_shift_x = pcParameters->m_iBaseChromaPhaseX;
int input_chroma_phase_shift_y = pcParameters->m_iBaseChromaPhaseY;
int output_chroma_phase_shift_x = pcParameters->m_iChromaPhaseX;
int output_chroma_phase_shift_y = pcParameters->m_iChromaPhaseY;
tmp_buf1=new short[iWidth*iHeight];
tmp_buf2=new short[width*iHeight];
tmp_buf3=new unsigned char[width*iHeight];
memset(tmp_buf3, 4, width*iHeight);
x=pcParameters->m_iPosX;
y=pcParameters->m_iPosY;
w=pcParameters->m_iOutWidth;
h=pcParameters->m_iOutHeight;
// luma
if(resample_mode>3){
top_flg = (resample_mode==4 || resample_mode==7);
iHeight >>= 1;
xCopyToImageBuffer ( psBufferY+iStrideY*(1-top_flg), iWidth, iHeight, iStrideY*2 );
xCopyFromImageBuffer( psBufferY, iWidth, iHeight, iStrideY, -32768, 32768 );
}
if(resample_mode>0){
height >>= 1;
y >>= 1;
h >>= 1;
}
if(resample_mode==1) {
iStrideY<<=1;
iHeight >>= 1;
}
for(iPass=0;iPass<iNbPasses;iPass++){
if(iPass==1) psBufferY += iStrideY/2;
buf1=buf2=psBufferY;
ptr1=buf1;
ptr2=tmp_buf1;
for(j=0;j<iHeight;j++){
for(i=0;i<iWidth;i++)ptr2[i]=ptr1[i];
ptr2+=iWidth;
ptr1+=iStrideY;
}
xFilterResidualHor(tmp_buf1, tmp_buf2, width, x, w, iWidth, iHeight, pcMbDataCtrl, 0, (resample_mode>0), 0, 0, tmp_buf3);
for(j=0;j<height;j++){
for(i=0;i<width;i++)buf1[i]=0;
buf1+=iStrideY;
}
xFilterResidualVer(tmp_buf2, buf2, iStrideY, x, y, w, h, width, iHeight, 0, (resample_mode>0), 0, 0, tmp_buf3);
}
if(resample_mode>1){
top_flg = (resample_mode==2 || resample_mode==4 || resample_mode==7);
xCopyToImageBuffer ( psBufferY, width, height, iStrideY );
xUpsampling_ver_res ( width, height, y*2, h*2, 0, top_flg );
xCopyFromImageBuffer( psBufferY, width, height*2, iStrideY, -32768, 32768 );
}
// chroma
width>>=1; height>>=1; x>>=1; y>>=1; w>>=1; h>>=1; iWidth>>=1; iHeight>>=1;
if(resample_mode==1 || resample_mode>3)
{
top_flg = (resample_mode==1 || resample_mode==4 || resample_mode==7);
input_chroma_phase_shift_y = input_chroma_phase_shift_y + 1 - 2*top_flg;
}
else
input_chroma_phase_shift_y *= 2;
input_chroma_phase_shift_x *= 2;
if(resample_mode>0)
{
top_flg = (resample_mode==1 || resample_mode==2 || resample_mode==4 || resample_mode==7);
output_chroma_phase_shift_y = output_chroma_phase_shift_y + 1 - 2*top_flg;
}
else
output_chroma_phase_shift_y *= 2;
output_chroma_phase_shift_x *= 2;
// U
if(resample_mode>3){
top_flg = (resample_mode==4 || resample_mode==7);
xCopyToImageBuffer ( psBufferU+iStrideU*(1-top_flg), iWidth, iHeight, iStrideU*2 );
xCopyFromImageBuffer( psBufferU, iWidth, iHeight, iStrideU, -32768, 32768 );
}
if(resample_mode==1) iStrideU<<=1;
for(iPass=0;iPass<iNbPasses;iPass++){
if(iPass==1) {
psBufferU += iStrideU/2;
output_chroma_phase_shift_y += 2;
input_chroma_phase_shift_y += 2;
}
buf1=buf2=psBufferU;
ptr1=buf1;
ptr2=tmp_buf1;
for(j=0;j<iHeight;j++){
for(i=0;i<iWidth;i++)ptr2[i]=ptr1[i];
ptr2+=iWidth;
ptr1+=iStrideU;
}
xFilterResidualHor(tmp_buf1, tmp_buf2, width, x, w, iWidth, iHeight, pcMbDataCtrl, 1, (resample_mode>0),
output_chroma_phase_shift_x, input_chroma_phase_shift_x, tmp_buf3);
for(j=0;j<height;j++){
for(i=0;i<width;i++)buf1[i]=0;
buf1+=iStrideU;
}
xFilterResidualVer(tmp_buf2, buf2, iStrideU, x, y, w, h, width, iHeight, 1, (resample_mode>0),
output_chroma_phase_shift_y, input_chroma_phase_shift_y, tmp_buf3);
}
if(resample_mode>1){
top_flg = (resample_mode==2 || resample_mode==4 || resample_mode==7);
xCopyToImageBuffer ( psBufferU, width, height, iStrideU );
xUpsampling_ver_res ( width, height, y*2, h*2, 1, top_flg );
xCopyFromImageBuffer( psBufferU, width, height*2, iStrideU, -32768, 32768 );
}
// V
if(resample_mode>3){
top_flg = (resample_mode==4 || resample_mode==7);
xCopyToImageBuffer ( psBufferV+iStrideV*(1-top_flg), iWidth, iHeight, iStrideV*2 );
xCopyFromImageBuffer( psBufferV, iWidth, iHeight, iStrideV, -32768, 32768 );
}
if(resample_mode==1) {
iStrideV<<=1;
output_chroma_phase_shift_y -= 2;
input_chroma_phase_shift_y -= 2;
}
for(iPass=0;iPass<iNbPasses;iPass++){
if(iPass==1) {
psBufferV += iStrideV/2;
output_chroma_phase_shift_y += 2;
input_chroma_phase_shift_y += 2;
}
buf1=buf2=psBufferV;
ptr1=buf1;
ptr2=tmp_buf1;
for(j=0;j<iHeight;j++){
for(i=0;i<iWidth;i++)ptr2[i]=ptr1[i];
ptr2+=iWidth;
ptr1+=iStrideV;
}
xFilterResidualHor(tmp_buf1, tmp_buf2, width, x, w, iWidth, iHeight, pcMbDataCtrl, 1, (resample_mode>0),
output_chroma_phase_shift_x, input_chroma_phase_shift_x, tmp_buf3);
for(j=0;j<height;j++){
for(i=0;i<width;i++)buf1[i]=0;
buf1+=iStrideU;
}
xFilterResidualVer(tmp_buf2, buf2, iStrideU, x, y, w, h, width, iHeight, 1, (resample_mode>0),
output_chroma_phase_shift_y, input_chroma_phase_shift_y, tmp_buf3);
}
if(resample_mode>1){
top_flg = (resample_mode==2 || resample_mode==4 || resample_mode==7);
xCopyToImageBuffer ( psBufferV, width, height, iStrideV );
xUpsampling_ver_res ( width, height, y*2, h*2, 1, top_flg );
xCopyFromImageBuffer( psBufferV, width, height*2, iStrideV, -32768, 32768 );
}
delete [] tmp_buf1;
delete [] tmp_buf2;
delete [] tmp_buf3;
}
__inline
void
DownConvert::xGenericUpsampleEss( short* psBufferY, int iStrideY,
short* psBufferU, int iStrideU,
short* psBufferV, int iStrideV,
ResizeParameters* pcParameters,
bool bClip )
{
int min = ( bClip ? 0 : -32768 );
int max = ( bClip ? 255 : 32767 );
int iInWidth = pcParameters->m_iInWidth;
int iInHeight = pcParameters->m_iInHeight;
int iGlobWidth = pcParameters->m_iGlobWidth;
int iGlobHeight = pcParameters->m_iGlobHeight;
int crop_y0 = pcParameters->m_iPosY;
int crop_h = pcParameters->m_iOutHeight;
int resample_mode = pcParameters->m_iResampleMode;
//===== luma =====
if(resample_mode==1 || resample_mode==4 || resample_mode==7)
xCopyToImageBuffer ( psBufferY, iInWidth, iInHeight/2, iStrideY*2 );
else if(resample_mode==5 || resample_mode==6)
xCopyToImageBuffer ( psBufferY+iStrideY, iInWidth, iInHeight/2, iStrideY*2 );
else
xCopyToImageBuffer ( psBufferY, iInWidth, iInHeight, iStrideY );
xUpsampling3 ( pcParameters, true, resample_mode);
if(resample_mode>1){
bool top_flg = (resample_mode==2 || resample_mode==4 || resample_mode==7);
#if UPS4TAP
FILTER_UP_4
#else
FILTER_UP
#endif
xUpsampling_ver ( iGlobWidth, iGlobHeight/2, crop_y0, crop_h, piFilter, top_flg );
}
if(resample_mode==1)
xCopyFromImageBuffer( psBufferY, iGlobWidth, iGlobHeight/2, iStrideY*2, min, max );
else
xCopyFromImageBuffer( psBufferY, iGlobWidth, iGlobHeight, iStrideY, min, max );
if(resample_mode==1){
xCopyToImageBuffer ( psBufferY+iStrideY, iInWidth, iInHeight/2, iStrideY*2 );
xUpsampling3 ( pcParameters, true, 8);
xCopyFromImageBuffer( psBufferY+iStrideY, iGlobWidth, iGlobHeight/2, iStrideY*2, min, max );
}
// ===== parameters for chromas =====
iInWidth >>= 1;
iInHeight >>= 1;
iGlobWidth >>= 1;
iGlobHeight >>= 1;
crop_y0 >>= 1;
crop_h >>= 1;
//===== chroma cb =====
if(resample_mode==1 || resample_mode==4 || resample_mode==7)
xCopyToImageBuffer ( psBufferU, iInWidth, iInHeight/2, iStrideU*2 );
else if(resample_mode==5 || resample_mode==6)
xCopyToImageBuffer ( psBufferU+iStrideU, iInWidth, iInHeight/2, iStrideU*2 );
else
xCopyToImageBuffer ( psBufferU, iInWidth, iInHeight, iStrideU );
xUpsampling3 ( pcParameters, false, resample_mode);
if(resample_mode>1){
bool top_flg = (resample_mode==2 || resample_mode==4 || resample_mode==7);
FILTER_UP_CHROMA
xUpsampling_ver ( iGlobWidth, iGlobHeight/2, crop_y0, crop_h, piFilter_chroma, top_flg );
}
if(resample_mode==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -