Changeset 1587 in SHVCSoftware


Ignore:
Timestamp:
14 Nov 2016, 22:27:52 (8 years ago)
Author:
interdigital
Message:

JCTVC-Y0028 was adopted to support 10bit down conversion

Location:
branches/SHM-dev/source/App/TAppDownConvert
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev/source/App/TAppDownConvert/DownConvert.cpp

    r1549 r1587  
    9292
    9393void
    94 DownConvert::downsamplingSVC( unsigned char*    pucBufferY,   int   iStrideY,
    95                               unsigned char*    pucBufferU,   int   iStrideU,
    96                               unsigned char*    pucBufferV,   int   iStrideV,
     94DownConvert::downsamplingSVC( short*    pucBufferY,   int   iStrideY,
     95                              short*    pucBufferU,   int   iStrideU,
     96                              short*    pucBufferV,   int   iStrideV,
    9797                              ResizeParameters* pcParameters, bool  bBotCoincided )
    9898{
     
    130130  if( !bTopAndBottomResampling )
    131131  {
    132     unsigned char* pSrc = pucBufferY + iStrideY * iCurrBot;
    133     unsigned char* pDes = pucBufferY + iStrideY * iBaseBot;
     132    short* pSrc = pucBufferY + iStrideY * iCurrBot;
     133    short* pDes = pucBufferY + iStrideY * iBaseBot;
    134134    xCopyToImageBuffer  ( pSrc,         iCurrW, iCurrH >> iCurrField, iStrideY << iCurrField );
    135135    xCompDownsampling   ( pcParameters, false,  bBotFieldFlag,        bVerticalDownsampling  );
     
    148148  {
    149149    //===== U =====
    150     unsigned char* pSrc = pucBufferU + iStrideU * iCurrBot;
    151     unsigned char* pDes = pucBufferU + iStrideU * iBaseBot;
     150    short* pSrc = pucBufferU + iStrideU * iCurrBot;
     151    short* pDes = pucBufferU + iStrideU * iBaseBot;
    152152    xCopyToImageBuffer  ( pSrc,         iCurrW, iCurrH >> iCurrField, iStrideU << iCurrField );
    153153    xCompDownsampling   ( pcParameters, true,   bBotFieldFlag,        bVerticalDownsampling  );
     
    195195
    196196void
    197 DownConvert::xCopyToImageBuffer( unsigned char* pucSrc, int iWidth, int iHeight, int iStride )
     197DownConvert::xCopyToImageBuffer( short* pucSrc, int iWidth, int iHeight, int iStride )
    198198{
    199199  int* piDes = m_paiImageBuffer;
     
    210210
    211211void
    212 DownConvert::xCopyFromImageBuffer( unsigned char* pucDes, int iWidth, int iHeight, int iStride )
     212DownConvert::xCopyFromImageBuffer( short* pucDes, int iWidth, int iHeight, int iStride )
    213213{
    214214  int* piSrc = m_paiImageBuffer;
     
    217217    for( int i = 0; i < iWidth;  i++ )
    218218    {
    219       pucDes[i] = (unsigned char)piSrc[i];
     219      pucDes[i] = (short)piSrc[i];
    220220    }
    221221    pucDes  += iStride;
     
    262262  int   iScaleX     = ( ( (unsigned int)iScaledW << iShiftX ) + ( iRefW >> 1 ) ) / iRefW;
    263263  int   iScaleY     = ( ( (unsigned int)iScaledH << iShiftY ) + ( iRefH >> 1 ) ) / iRefH;
     264
     265  int   inputBitDepth = pcParameters->inputBitDepth;
     266  int   outputBitDepth = pcParameters->outputBitDepth;
     267
    264268  if( ! pcParameters->m_bFrameMbsOnlyFlag || ! pcParameters->m_bRefLayerFrameMbsOnlyFlag )
    265269  {
     
    304308  if( bVerticalDownsampling )
    305309  {
    306     xVertDownsampling( iCurrW, iCurrH, bBotFlag );
     310    xVertDownsampling( iCurrW, iCurrH, bBotFlag, inputBitDepth, outputBitDepth);
    307311  }
    308312
     
    311315                      iLOffset, iTOffset, iROffset, iBOffset,
    312316                      iShiftX,  iShiftY,  iScaleX,  iScaleY,
    313                       iAddX,    iAddY,    iDeltaX,  iDeltaY );
     317                      iAddX,    iAddY,    iDeltaX,  iDeltaY,
     318                      inputBitDepth, outputBitDepth);
    314319}
    315320
     
    317322DownConvert::xVertDownsampling( int   iBaseW,
    318323                                int   iBaseH,
    319                                 bool  bBotFlag )
     324                                bool  bBotFlag, int inputBitDepth, int outputBitDepth)
    320325{
    321326  int aiVertFilter[13]  = { 2, 0, -4, -3, 5, 19, 26, 19, 5, -3, -4, 0, 2 };
     
    323328  int iCurrW            = iBaseW;
    324329  int iCurrH            = iBaseH << 1;
     330
     331  int shift = 6 + (inputBitDepth - outputBitDepth);
     332  int shift_round = (1 << (shift -1));
    325333
    326334  //===== vertical downsampling =====
     
    336344        m_paiTmp1dBuffer[i] += aiVertFilter[k] * piSrc[m*m_iImageStride];
    337345      }
    338       m_paiTmp1dBuffer[i] = ( m_paiTmp1dBuffer[i] + 32 ) >> 6;
     346      m_paiTmp1dBuffer[i] = ( m_paiTmp1dBuffer[i] + shift_round ) >> shift;
    339347    }
    340348    //--- clip and copy back to image buffer ---
    341     for( int n = 0; n < iBaseH; n++ )
    342     {
    343       piSrc[n*m_iImageStride] = xClip( m_paiTmp1dBuffer[n], 0, 255 );
    344     }
     349      for( int n = 0; n < iBaseH; n++ )
     350      {
     351        piSrc[n*m_iImageStride] = xClip( m_paiTmp1dBuffer[n], 0, ((1<<outputBitDepth)-1) );
     352      }
    345353  }
    346354}
     
    350358                                 int iLOffset, int iTOffset, int iROffset, int iBOffset,
    351359                                 int iShiftX,  int iShiftY,  int iScaleX,  int iScaleY,
    352                                  int iAddX,    int iAddY,    int iDeltaX,  int iDeltaY )
     360                                 int iAddX,    int iAddY,    int iDeltaX,  int iDeltaY, int inputBitDepth, int outputBitDepth )
    353361{
    354362  const int filter16[8][16][12] =
     
    527535  int iShiftYM4 = iShiftY - 4;
    528536
     537  int shift = 14 + (inputBitDepth - outputBitDepth);
     538  int shift_round = (1 << (shift -1));
     539
    529540  //===== horizontal downsampling =====
    530541  {
     
    567578          m_paiTmp1dBuffer[j] += filter16[iVerFilter][iPhase][k] * piSrc[m*m_iImageStride];
    568579        }
    569         m_paiTmp1dBuffer[j] = ( m_paiTmp1dBuffer[j] + 8192 ) >> 14;
     580        m_paiTmp1dBuffer[j] = ( m_paiTmp1dBuffer[j] + shift_round ) >> shift;
    570581      }
    571582      //--- clip and copy back to image buffer ---
    572       for( int n = 0; n < iBaseH; n++ )
    573       {
    574         piSrc[n*m_iImageStride] = xClip( m_paiTmp1dBuffer[n], 0, 255 );
    575       }
    576     }
    577   }
    578 }
    579 
    580 
    581 
    582 
     583        for( int n = 0; n < iBaseH; n++ )
     584        {
     585          piSrc[n*m_iImageStride] = xClip( m_paiTmp1dBuffer[n], 0, ((1<<outputBitDepth)-1));
     586        }
     587    }
     588  }
     589}
     590
     591
     592
     593
  • branches/SHM-dev/source/App/TAppDownConvert/DownConvert.h

    r1549 r1587  
    9494    , m_iRefLayerWidthInSamples     ( 0 )
    9595    , m_iRefLayerHeightInSamples    ( 0 )
     96    , inputBitDepth     ( 8 )
     97    , outputBitDepth    ( 8 )
    9698  {
    9799  };
     
    129131  Int   m_iRefLayerWidthInSamples;
    130132  Int   m_iRefLayerHeightInSamples;
     133
     134  //===== parameters for bit depth =====
     135  int inputBitDepth;
     136  int outputBitDepth;
    131137};
    132138
     
    146152  // main functions for DownConvert Tool
    147153  //=====================================
    148   void  downsamplingSVC             ( unsigned char*          pucBufferY,    int   iStrideY,
    149                                       unsigned char*          pucBufferU,    int   iStrideU,
    150                                       unsigned char*          pucBufferV,    int   iStrideV,
     154  void  downsamplingSVC             ( short*          pucBufferY,    int   iStrideY,
     155                                      short*          pucBufferU,    int   iStrideU,
     156                                      short*          pucBufferV,    int   iStrideV,
    151157                                      ResizeParameters*       pcParameters,  bool  bBotCoincided = false );
    152158
     
    164170  //=======================================
    165171  //--- place to and get from image buffer ---
    166   void  xCopyToImageBuffer          ( unsigned char*        pucSrc,
     172  void  xCopyToImageBuffer          ( short*        pucSrc,
    167173                                      int                   iWidth,
    168174                                      int                   iHeight,
    169175                                      int                   iStride );
    170   void  xCopyFromImageBuffer        ( unsigned char*        pucDes,
     176  void  xCopyFromImageBuffer        ( short*        pucDes,
    171177                                      int                   iWidth,
    172178                                      int                   iHeight,
     
    179185  void  xVertDownsampling           ( int                   iBaseW,
    180186                                      int                   iBaseH,
    181                                       bool                  bBotFlag );
     187                                      bool                  bBotFlag,
     188                                      int                   inputBitDepth,
     189                                      int                   outputBitDepth);
    182190  void  xBasicDownsampling          ( int  iBaseW,   int  iBaseH,   int  iCurrW,   int  iCurrH,
    183191                                      int  iLOffset, int  iTOffset, int  iROffset, int  iBOffset,
    184192                                      int  iShiftX,  int  iShiftY,  int  iScaleX,  int  iScaleY,
    185                                       int  iAddX,    int  iAddY,    int  iDeltaX,  int  iDeltaY );
     193                                      int  iAddX,    int  iAddY,    int  iDeltaX,  int  iDeltaY,
     194                                      int inputBitDepth, int outputBitDepth);
    186195private:
    187196  //===== member variables =====
  • branches/SHM-dev/source/App/TAppDownConvert/TAppDownConvert.cpp

    r1549 r1587  
    4848  int            stride;
    4949  int            lines;
    50   unsigned char* data;
    51   unsigned char* data2;
     50  short* data;
     51  short* data2;
    5252} ColorComponent;
    5353
    5454typedef struct
    5555{
     56  int inputBitDepth;
     57  int outputBitDepth;
    5658  ColorComponent y;
    5759  ColorComponent u;
     
    6870  c.stride  = maxwidth;
    6971  c.lines   = maxheight;
    70   c.data    = new unsigned char [ size ];
    71   c.data2   = new unsigned char [ size ];
     72  c.data    = new short [ size ];
     73  c.data2   = new short [ size ];
    7274
    7375  if( ! c.data || ! c.data2 )
     
    9092
    9193int
    92   readColorComponent( ColorComponent& c, FILE* file, int width, int height, bool second )
     94  readColorComponent( ColorComponent& c, FILE* file, int width, int height, int inputBitDepth, bool second )
    9395{
    9496  assert( width  <= c.stride );
    9597  assert( height <= c.lines  );
    96 
     98  unsigned char *temp=NULL;
     99 
    97100  int iMaxPadWidth  = gMin( c.stride, ( ( width  + 15 ) >> 4 ) << 4 );
    98101  int iMaxPadHeight = gMin( c.lines,  ( ( height + 31 ) >> 5 ) << 5 );
     
    100103  for( int i = 0; i < height; i++ )
    101104  {
    102     unsigned char* buffer = ( second ? c.data2 : c.data ) + i * c.stride;
    103     int            rsize  = (int)fread( buffer, sizeof(unsigned char), width, file );
     105    short* buffer = ( second ? c.data2 : c.data ) + i * c.stride;
     106    int            rsize;
     107   
     108    if (inputBitDepth == 10)
     109    {
     110       rsize = (int)fread( buffer, sizeof(short), width, file );
     111    }
     112    else
     113    {
     114       if (temp == NULL)
     115         temp = (unsigned char * )calloc(width, sizeof(unsigned char));
     116       rsize = (int)fread( temp, sizeof(unsigned char), width, file );
     117       for (int j = 0; j < width; j++)
     118         buffer[j] = (short) temp[j];
     119    }
    104120    if( rsize != width )
    105121    {
     
    113129  for( int yp = height; yp < iMaxPadHeight; yp++ )
    114130  {
    115     unsigned char* buffer  = ( second ? c.data2 : c.data ) + yp * c.stride;
    116     unsigned char* bufferX = buffer - c.stride;
     131    short* buffer  = ( second ? c.data2 : c.data ) + yp * c.stride;
     132    short* bufferX = buffer - c.stride;
    117133    for( int xp = 0; xp < c.stride; xp++ )
    118134    {
     
    120136    }
    121137  }
     138  if (temp!=NULL)
     139    free(temp);
    122140  return 0;
    123141}
     
    126144  duplicateColorComponent( ColorComponent& c )
    127145{
    128   memcpy( c.data2, c.data, c.stride * c.lines * sizeof(unsigned char) );
     146  memcpy( c.data2, c.data, c.stride * c.lines * sizeof(short) );
    129147}
    130148
     
    133151{
    134152  int            offs = ( bBotField ? c.stride : 0 );
    135   unsigned char* pDes = c.data  + offs;
    136   unsigned char* pSrc = c.data2 + offs;
     153  short* pDes = c.data  + offs;
     154  short* pSrc = c.data2 + offs;
    137155  for( int i = 0; i < c.lines / 2; i++, pDes += 2*c.stride, pSrc += 2*c.stride )
    138156  {
    139     memcpy( pDes, pSrc, c.stride * sizeof(unsigned char) );
    140   }
    141 }
    142 
    143 void
    144   writeColorComponent( ColorComponent& c, FILE* file, int width, int height, bool second )
     157    memcpy( pDes, pSrc, c.stride * sizeof(short) );
     158  }
     159}
     160
     161void
     162  writeColorComponent( ColorComponent& c, FILE* file, int width, int height, int outputBitDepth, bool second )
    145163{
    146164  assert( width  <= c.stride );
    147165  assert( height <= c.lines  );
    148 
     166  unsigned char* temp = NULL;
     167       
    149168  for( int i = 0; i < height; i++ )
    150169  {
    151     unsigned char* buffer = ( second ? c.data2 : c.data ) + i * c.stride;
    152     int            wsize  = (int)fwrite( buffer, sizeof(unsigned char), width, file );
     170    short* buffer = ( second ? c.data2 : c.data ) + i * c.stride;
     171    int            wsize;
     172   
     173    if ( outputBitDepth == 8 )
     174    {
     175      if (temp == NULL)
     176        temp = (unsigned char * )calloc(width, sizeof(unsigned char));
     177      for (int j = 0; j < width; j ++)
     178        temp[j] = (unsigned char)buffer[j];
     179      wsize = (int)fwrite( temp, sizeof(unsigned char), width, file );
     180    }
     181    else
     182    {
     183      wsize = (int)fwrite( buffer, sizeof(short), width, file );
     184    }
    153185
    154186    if( wsize != width )
     
    162194
    163195void
    164   createFrame( YuvFrame& f, int width, int height )
    165 {
     196  createFrame( YuvFrame& f, int width, int height, int inputBitDepth, int outputBitDepth )
     197{
     198  f.inputBitDepth = inputBitDepth;
     199  f.outputBitDepth = outputBitDepth;
    166200  createColorComponent( f.y, width,      height      );
    167201  createColorComponent( f.u, width >> 1, height >> 1 );
     
    180214  readFrame( YuvFrame& f, FILE* file, int width, int height, bool second = false )
    181215{
    182   ROTRS( readColorComponent( f.y, file, width,      height,      second ), 1 );
    183   ROTRS( readColorComponent( f.u, file, width >> 1, height >> 1, second ), 1 );
    184   ROTRS( readColorComponent( f.v, file, width >> 1, height >> 1, second ), 1 );
     216  ROTRS( readColorComponent( f.y, file, width,      height,      f.inputBitDepth, second ), 1 );
     217  ROTRS( readColorComponent( f.u, file, width >> 1, height >> 1, f.inputBitDepth, second ), 1 );
     218  ROTRS( readColorComponent( f.v, file, width >> 1, height >> 1, f.inputBitDepth, second ), 1 );
    185219  return 0;
    186220}
     
    205239  writeFrame( YuvFrame& f, FILE* file, int width, int height, bool both = false )
    206240{
    207   writeColorComponent( f.y, file, width,      height,      false );
    208   writeColorComponent( f.u, file, width >> 1, height >> 1, false );
    209   writeColorComponent( f.v, file, width >> 1, height >> 1, false );
     241  writeColorComponent( f.y, file, width,      height,      f.outputBitDepth, false );
     242  writeColorComponent( f.u, file, width >> 1, height >> 1, f.outputBitDepth, false );
     243  writeColorComponent( f.v, file, width >> 1, height >> 1, f.outputBitDepth, false );
    210244
    211245  if( both )
    212246  {
    213     writeColorComponent( f.y, file, width,      height,      true );
    214     writeColorComponent( f.u, file, width >> 1, height >> 1, true );
    215     writeColorComponent( f.v, file, width >> 1, height >> 1, true );
     247    writeColorComponent( f.y, file, width,      height,      f.outputBitDepth, true );
     248    writeColorComponent( f.u, file, width >> 1, height >> 1, f.outputBitDepth, true );
     249    writeColorComponent( f.v, file, width >> 1, height >> 1, f.outputBitDepth, true );
    216250  }
    217251}
     
    227261      fprintf ( stderr, "\nERROR: %s\n", message );
    228262    }
    229     fprintf (   stderr, "\nUsage: %s <win> <hin> <in> <wout> <hout> <out> [<t> [<skip> [<frms>]]] [[-phase <args>] ]\n\n", name );
     263    fprintf (   stderr, "\nUsage: %s <win> <hin> <in> <wout> <hout> <out> [<bin> <bout> <method> <t> [<skip> [<frms>]]] [[-phase <args>] ]\n\n", name );
    230264    fprintf (   stderr, "  win     : input width  (luma samples)\n" );
    231265    fprintf (   stderr, "  hin     : input height (luma samples)\n" );
     
    235269    fprintf (   stderr, "  out     : output file\n" );
    236270    fprintf (   stderr, "\n--------------------------- OPTIONAL ---------------------------\n\n" );
     271    fprintf (   stderr, "  bin     : input bit depth (8 or 10) (default: 8)\n" );
     272    fprintf (   stderr, "  bout    : output bit depth (8 or 10) (default: 8)\n" );
     273    fprintf (   stderr, "  method  : sampling method (0, 1, 2, 3, 4) (default: 0)\n" );
    237274    fprintf (   stderr, "  t       : number of temporal downsampling stages (default: 0)\n" );
    238275    fprintf (   stderr, "  skip    : number of frames to skip at start (default: 0)\n" );
     
    244281    fprintf (   stderr, "   out_uv_ph_x: output chroma phase shift in horizontal direction (default:-1)\n" );
    245282    fprintf (   stderr, "   out_uv_ph_y: output chroma phase shift in vertical   direction (default: 0)\n" );
     283    fprintf (   stderr, "\n-------------------------- EXAMPLE --------------------------\n\n" );
     284    fprintf (   stderr, "\nUsage: %s 4096 2048 input_video_4096x2048_10bits.yuv 2048 1024 output_video_2048x1024_8bits.yuv 10 8\n\n", name );
    246285    fprintf (   stderr, "\n\n");
    247286    exit    (   1 );
     
    304343    cRP.m_iScaledRefFrmWidth  = iScaledRefFrmW;
    305344    cRP.m_iScaledRefFrmHeight = iScaledRefFrmH;
     345    cRP.inputBitDepth         = rcFrame.inputBitDepth;
     346    cRP.outputBitDepth        = rcFrame.outputBitDepth;
    306347  }
    307348  assert( resamplingMethod == 0 );
     
    354395  FILE* outputFile                  = 0;
    355396  FILE* croppingParametersFile      = 0;
     397  int   inputBitDepth               = 8;
     398  int   outputBitDepth              = 8;
    356399  int   resamplingMethod            = 0;
    357400  int   resamplingMode              = 0;
     
    396439      print_usage_and_exit( cRP.m_iChromaPhaseY         > 1 || cRP.m_iChromaPhaseY         < -1, argv[0], "wrong phase x parameters (range : [-1, 1])");
    397440    }
    398     else if (i == 7)
     441    else if (i == 7) // input bit depth
     442    {
     443      inputBitDepth = atoi( argv[i++] );
     444      print_usage_and_exit( inputBitDepth != 8 && inputBitDepth != 10, argv[0], "wrong input bit depth (8 bit or 10 bit)");
     445    }
     446    else if (i == 8) // output bit depth
     447    {
     448      outputBitDepth = atoi( argv[i++] );
     449      print_usage_and_exit( outputBitDepth != 8 && outputBitDepth != 10, argv[0], "wrong output bit depth (8 bit or 10 bit)");
     450    }
     451    else if (i == 9) // downsampling methods
    399452    {
    400453      methodInitialized = true;
     
    439492      }
    440493    }
    441     else if( i == 8 )
     494    else if( i == 10 ) // temporal stages
    442495    {
    443496      int TStages = atoi( argv[i++] );
     
    445498      print_usage_and_exit( TStages < 0,              argv[0], "negative number of temporal stages" );
    446499    }
    447     else if( i == 9 )
     500    else if( i == 11 ) // skipped frames
    448501    {
    449502      skipAtStart = atoi( argv[i++] );
    450503      print_usage_and_exit( skipAtStart < 0,          argv[0], "negative number of skipped frames at start" );
    451504    }
    452     else if( i == 10 )
     505    else if( i == 12 ) // output frames
    453506    {
    454507      maxNumOutputFrames = atoi( argv[i++] );
     
    515568    maxWidth      = ( ( maxWidth  * minWRnd16 + ( minWidth  << 4 ) - 1 ) / ( minWidth  << 4 ) ) << 4;
    516569    maxHeight     = ( ( maxHeight * minHRnd32 + ( minHeight << 4 ) - 1 ) / ( minHeight << 4 ) ) << 4;
    517     createFrame( cFrame, maxWidth, maxHeight );
     570    createFrame( cFrame, maxWidth, maxHeight, inputBitDepth, outputBitDepth );
    518571    cDownConvert.init(   maxWidth, maxHeight );
    519572  }
Note: See TracChangeset for help on using the changeset viewer.