📄 downconverttools.inl
字号:
for( int j = 0; j < iHeight; j++ )
{
for( int i = 0; i < iWidth; i++ )
{
piDes[i] = (int)pucSrc[i];
}
piDes += m_iImageStride;
pucSrc += iStride;
}
}
__inline
void
DownConvert::xCrop ( unsigned char* pucBufferY, int iStrideY,
unsigned char* pucBufferU, int iStrideU,
unsigned char* pucBufferV, int iStrideV,
ResizeParameters* pcParameters )
{
int iOutWidth = pcParameters->m_iOutWidth;
int iOutHeight = pcParameters->m_iOutHeight;
int iPosX = pcParameters->m_iPosX;
int iPosY = pcParameters->m_iPosY;
int iGlobWidth = pcParameters->m_iGlobWidth;
int iGlobHeight = pcParameters->m_iGlobHeight;
unsigned char* ptr;
//===== luma =====
ptr = &pucBufferY[iPosY * iStrideY + iPosX];
xCopyToImageBuffer ( ptr, iOutWidth, iOutHeight, iStrideY);
xSetValue(pucBufferY, iStrideY, iGlobWidth, iGlobHeight, (unsigned char)DEFAULTY);
xCopyFromImageBuffer( pucBufferY, iOutWidth, iOutHeight, iStrideY, 0, 255);
// ===== parameters for chromas =====
iOutWidth >>= 1;
iOutHeight >>= 1;
iPosX >>= 1;
iPosY >>= 1;
iGlobWidth >>= 1;
iGlobHeight >>= 1;
//===== chroma cb =====
ptr = &pucBufferU[iPosY * iStrideU + iPosX];
xCopyToImageBuffer ( ptr, iOutWidth, iOutHeight, iStrideU);
xSetValue(pucBufferU, iStrideU, iGlobWidth, iGlobHeight, (unsigned char)DEFAULTU);
xCopyFromImageBuffer(pucBufferU, iOutWidth, iOutHeight, iStrideU, 0, 255);
//===== chroma cr =====
ptr = &pucBufferV[iPosY * iStrideV + iPosX];
xCopyToImageBuffer ( ptr, iOutWidth, iOutHeight, iStrideV);
xSetValue(pucBufferV, iStrideV, iGlobWidth, iGlobHeight, (unsigned char)DEFAULTV);
xCopyFromImageBuffer( pucBufferV, iOutWidth, iOutHeight, iStrideV, 0, 255);
}
__inline
void
DownConvert::xSetValue ( unsigned char* pucBuffer, int iStride, int iWidth, int iHeight, unsigned char value )
{
for (int y=0; y<iHeight; y++)
memset(&pucBuffer[y*iStride], value, iWidth);
}
__inline
void
DownConvert::xUpsampling( ResizeParameters* pcParameters,
bool bLuma, int type
)
{
switch (type)
{
case 3:
xUpsampling1(pcParameters, bLuma);
break;
case 4:
xUpsampling2(pcParameters, bLuma);
break;
case 0:
xUpsampling3(pcParameters, bLuma);
break;
}
}
__inline
void
DownConvert::xDownsampling( int iWidth, // high-resolution width
int iHeight, // high-resolution height
int aiFilter[] ) // downsampling filter [15coeff+sum]
{
int i, j, k, im7, im6, im5, im4, im3, im2, im1, i0, ip1, ip2, ip3, ip4, ip5, ip6, ip7;
int div = aiFilter[15]*aiFilter[15];
int add = div / 2;
//========== horizontal downsampling ===========
for( j = 0; j < iHeight; j++ )
{
int* piSrc = &m_paiImageBuffer[j*m_iImageStride];
//----- down sample row -----
for ( i = 0; i < iWidth/2; i++ )
{
k = i*2;
im7 = (k< 7) ? 0 : k -7;
im6 = (k< 6) ? 0 : k -6;
im5 = (k< 5) ? 0 : k -5;
im4 = (k< 4) ? 0 : k -4;
im3 = (k< 3) ? 0 : k -3;
im2 = (k< 2) ? 0 : k -2;
im1 = (k< 1) ? 0 : k -1;
i0 = (k<iWidth ) ? k : iWidth-1;
ip1 = (k<iWidth-1) ? k+1 : iWidth-1;
ip2 = (k<iWidth-2) ? k+2 : iWidth-1;
ip3 = (k<iWidth-3) ? k+3 : iWidth-1;
ip4 = (k<iWidth-4) ? k+4 : iWidth-1;
ip5 = (k<iWidth-5) ? k+5 : iWidth-1;
ip6 = (k<iWidth-6) ? k+6 : iWidth-1;
ip7 = (k<iWidth-7) ? k+7 : iWidth-1;
m_paiTmp1dBuffer[i] = aiFilter[ 0]*piSrc[im7]
+ aiFilter[ 1]*piSrc[im6]
+ aiFilter[ 2]*piSrc[im5]
+ aiFilter[ 3]*piSrc[im4]
+ aiFilter[ 4]*piSrc[im3]
+ aiFilter[ 5]*piSrc[im2]
+ aiFilter[ 6]*piSrc[im1]
+ aiFilter[ 7]*piSrc[i0 ]
+ aiFilter[ 8]*piSrc[ip1]
+ aiFilter[ 9]*piSrc[ip2]
+ aiFilter[10]*piSrc[ip3]
+ aiFilter[11]*piSrc[ip4]
+ aiFilter[12]*piSrc[ip5]
+ aiFilter[13]*piSrc[ip6]
+ aiFilter[14]*piSrc[ip7];
}
//----- copy row back to image buffer -----
::memcpy( piSrc, m_paiTmp1dBuffer, (iWidth/2)*sizeof(int) );
}
//=========== vertical downsampling ===========
for( j = 0; j < iWidth/2; j++ )
{
int* piSrc = &m_paiImageBuffer[j];
//----- down sample column -----
for( i = 0; i < iHeight/2; i++)
{
k = i*2;
im7 = ( (k< 7) ? 0 : k -7 ) * m_iImageStride;
im6 = ( (k< 6) ? 0 : k -6 ) * m_iImageStride;
im5 = ( (k< 5) ? 0 : k -5 ) * m_iImageStride;
im4 = ( (k< 4) ? 0 : k -4 ) * m_iImageStride;
im3 = ( (k< 3) ? 0 : k -3 ) * m_iImageStride;
im2 = ( (k< 2) ? 0 : k -2 ) * m_iImageStride;
im1 = ( (k< 1) ? 0 : k -1 ) * m_iImageStride;
i0 = ( (k<iHeight ) ? k : iHeight-1 ) * m_iImageStride;
ip1 = ( (k<iHeight-1) ? k+1 : iHeight-1 ) * m_iImageStride;
ip2 = ( (k<iHeight-2) ? k+2 : iHeight-1 ) * m_iImageStride;
ip3 = ( (k<iHeight-3) ? k+3 : iHeight-1 ) * m_iImageStride;
ip4 = ( (k<iHeight-4) ? k+4 : iHeight-1 ) * m_iImageStride;
ip5 = ( (k<iHeight-5) ? k+5 : iHeight-1 ) * m_iImageStride;
ip6 = ( (k<iHeight-6) ? k+6 : iHeight-1 ) * m_iImageStride;
ip7 = ( (k<iHeight-7) ? k+7 : iHeight-1 ) * m_iImageStride;
m_paiTmp1dBuffer[i] = aiFilter[ 0]*piSrc[im7]
+ aiFilter[ 1]*piSrc[im6]
+ aiFilter[ 2]*piSrc[im5]
+ aiFilter[ 3]*piSrc[im4]
+ aiFilter[ 4]*piSrc[im3]
+ aiFilter[ 5]*piSrc[im2]
+ aiFilter[ 6]*piSrc[im1]
+ aiFilter[ 7]*piSrc[i0 ]
+ aiFilter[ 8]*piSrc[ip1]
+ aiFilter[ 9]*piSrc[ip2]
+ aiFilter[10]*piSrc[ip3]
+ aiFilter[11]*piSrc[ip4]
+ aiFilter[12]*piSrc[ip5]
+ aiFilter[13]*piSrc[ip6]
+ aiFilter[14]*piSrc[ip7];
}
//----- scale and copy back to image buffer -----
for( i = 0; i < iHeight/2; i++ )
{
piSrc[i*m_iImageStride] = ( m_paiTmp1dBuffer[i] + add ) / div;
}
}
}
__inline
void
DownConvert::xUpsampling( int iWidth, // low-resolution width
int iHeight, // low-resolution height
int aiFilter[] ) // downsampling filter [15coeff+sum]
{
int i, j, im3, im2, im1, i0, ip1, ip2, ip3, ip4;
int div = ( aiFilter[15]*aiFilter[15] ) / 4;
int add = div / 2;
//========== vertical upsampling ===========
for( j = 0; j < iWidth; j++ )
{
int* piSrc = &m_paiImageBuffer[j];
//----- upsample column -----
for( i = 0; i < iHeight; i++)
{
im3 = ( (i< 3) ? 0 : i -3 ) * m_iImageStride;
im2 = ( (i< 2) ? 0 : i -2 ) * m_iImageStride;
im1 = ( (i< 1) ? 0 : i -1 ) * m_iImageStride;
i0 = ( (i<iHeight ) ? i : iHeight-1 ) * m_iImageStride;
ip1 = ( (i<iHeight-1) ? i+1 : iHeight-1 ) * m_iImageStride;
ip2 = ( (i<iHeight-2) ? i+2 : iHeight-1 ) * m_iImageStride;
ip3 = ( (i<iHeight-3) ? i+3 : iHeight-1 ) * m_iImageStride;
ip4 = ( (i<iHeight-4) ? i+4 : iHeight-1 ) * m_iImageStride;
//--- even sample ---
m_paiTmp1dBuffer[2*i+0] = aiFilter[13]*piSrc[im3]
+ aiFilter[11]*piSrc[im2]
+ aiFilter[ 9]*piSrc[im1]
+ aiFilter[ 7]*piSrc[i0 ]
+ aiFilter[ 5]*piSrc[ip1]
+ aiFilter[ 3]*piSrc[ip2]
+ aiFilter[ 1]*piSrc[ip3];
//--- odd sample ---
m_paiTmp1dBuffer[2*i+1] = aiFilter[14]*piSrc[im3]
+ aiFilter[12]*piSrc[im2]
+ aiFilter[10]*piSrc[im1]
+ aiFilter[ 8]*piSrc[i0 ]
+ aiFilter[ 6]*piSrc[ip1]
+ aiFilter[ 4]*piSrc[ip2]
+ aiFilter[ 2]*piSrc[ip3]
+ aiFilter[ 0]*piSrc[ip4];
}
//----- copy back to image buffer -----
for( i = 0; i < iHeight*2; i++ )
{
piSrc[i*m_iImageStride] = m_paiTmp1dBuffer[i];
}
}
//========== horizontal upsampling ==========
for( j = 0; j < iHeight*2; j++ )
{
int* piSrc = &m_paiImageBuffer[j*m_iImageStride];
//----- upsample row -----
for ( i = 0; i < iWidth; i++ )
{
im3 = (i< 3) ? 0 : i -3;
im2 = (i< 2) ? 0 : i -2;
im1 = (i< 1) ? 0 : i -1;
i0 = (i<iWidth ) ? i : iWidth-1;
ip1 = (i<iWidth-1) ? i+1 : iWidth-1;
ip2 = (i<iWidth-2) ? i+2 : iWidth-1;
ip3 = (i<iWidth-3) ? i+3 : iWidth-1;
ip4 = (i<iWidth-4) ? i+4 : iWidth-1;
//--- even sample ---
m_paiTmp1dBuffer[2*i+0] = aiFilter[13]*piSrc[im3]
+ aiFilter[11]*piSrc[im2]
+ aiFilter[ 9]*piSrc[im1]
+ aiFilter[ 7]*piSrc[i0 ]
+ aiFilter[ 5]*piSrc[ip1]
+ aiFilter[ 3]*piSrc[ip2]
+ aiFilter[ 1]*piSrc[ip3];
//--- odd sample ---
m_paiTmp1dBuffer[2*i+1] = aiFilter[14]*piSrc[im3]
+ aiFilter[12]*piSrc[im2]
+ aiFilter[10]*piSrc[im1]
+ aiFilter[ 8]*piSrc[i0 ]
+ aiFilter[ 6]*piSrc[ip1]
+ aiFilter[ 4]*piSrc[ip2]
+ aiFilter[ 2]*piSrc[ip3]
+ aiFilter[ 0]*piSrc[ip4];
}
//----- scale and copy back to image buffer -----
for( i = 0; i < iWidth*2; i++ )
{
piSrc[i] = ( m_paiTmp1dBuffer[i] + add ) / div;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//JVT-R006
////////////////////////////////////////////////////////////////////////////////////////
__inline
void
DownConvert::xDownsampling3( int input_width, int input_height, int output_width, int output_height,
int crop_x0, int crop_y0, int crop_w, int crop_h,
int input_chroma_phase_shift_x, int input_chroma_phase_shift_y,
int output_chroma_phase_shift_x, int output_chroma_phase_shift_y )
{
const int filter16[8][16][12] = { // sine, N = 3
{ // D = 1
{0,0,0,0,0,128,0,0,0,0,0,0},
{0,0,0,2,-6,127,7,-2,0,0,0,0},
{0,0,0,3,-12,125,16,-5,1,0,0,0},
{0,0,0,4,-16,120,26,-7,1,0,0,0},
{0,0,0,5,-18,114,36,-10,1,0,0,0},
{0,0,0,5,-20,107,46,-12,2,0,0,0},
{0,0,0,5,-21,99,57,-15,3,0,0,0},
{0,0,0,5,-20,89,68,-18,4,0,0,0},
{0,0,0,4,-19,79,79,-19,4,0,0,0},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -