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

📄 downconvert.inl

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 INL
📖 第 1 页 / 共 4 页
字号:
  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 + -