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

📄 downconverttools.inl

📁 JVT-S203 contains the JSVM 6 reference software. It corresponds to CVS tag “JSVM_5_12_1”. For obt
💻 INL
📖 第 1 页 / 共 4 页
字号:

  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 + -