Ticket #981: display_window_v2.patch

File display_window_v2.patch, 10.1 KB (added by bheng, 11 years ago)

Updated patch to fix several issues with display window cropping.

  • App/TAppDecoder/TAppDecTop.cpp

     
    264264      if ( m_pchReconFile )
    265265      {
    266266        const Window &conf = pcPic->getConformanceWindow();
    267         const Window &defDisp =  m_respectDefDispWindow || !pcPic->getSlice(0)->getSPS()->getVuiParametersPresentFlag() ?
    268                             pcPic->getSlice(0)->getSPS()->getVuiParameters()->getDefaultDisplayWindow() :
    269                             Window();
     267        const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    270268        m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    271269                                       conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    272270                                       conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
     
    323321      if ( m_pchReconFile )
    324322      {
    325323        const Window &conf = pcPic->getConformanceWindow();
    326         const Window &defDisp =  m_respectDefDispWindow || !pcPic->getSlice(0)->getSPS()->getVuiParametersPresentFlag() ?
    327                             pcPic->getSlice(0)->getSPS()->getVuiParameters()->getDefaultDisplayWindow() :
    328                             Window();
     324        const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window();
    329325        m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(),
    330326                                       conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(),
    331327                                       conf.getWindowRightOffset() + defDisp.getWindowRightOffset(),
  • Lib/TLibCommon/TComPic.cpp

     
    7272{
    7373}
    7474
    75 Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow,
     75Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow,
    7676                      Int *numReorderPics, Bool bIsVirtual)
    7777
    7878{
     
    9292
    9393  /* store conformance window parameters with picture */
    9494  m_conformanceWindow = conformanceWindow;
     95 
     96  /* store display window parameters with picture */
     97  m_defaultDisplayWindow = defaultDisplayWindow;
    9598
    9699  /* store number of reorder pics with picture */
    97100  memcpy(m_numReorderPics, numReorderPics, MAX_TLAYER*sizeof(Int));
  • Lib/TLibCommon/TComPic.h

     
    7979 
    8080  Int                   m_numReorderPics[MAX_TLAYER];
    8181  Window                m_conformanceWindow;
     82  Window                m_defaultDisplayWindow;
    8283
    8384  std::vector<std::vector<TComDataCU*> > m_vSliceCUDataLink;
    8485
     
    8889  TComPic();
    8990  virtual ~TComPic();
    9091 
    91   Void          create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow,
     92  Void          create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow,
    9293                        Int *numReorderPics, Bool bIsVirtual = false );
    9394                       
    9495  virtual Void  destroy();
     
    147148  Void          clearSliceBuffer()           {m_apcPicSym->clearSliceBuffer();         }
    148149
    149150  Window&       getConformanceWindow()  { return m_conformanceWindow; }
     151  Window&       getDefDisplayWindow()   { return m_defaultDisplayWindow; }
    150152
    151153  Void          createNonDBFilterInfo   (std::vector<Int> sliceStartAddress, Int sliceGranularityDepth
    152154                                        ,std::vector<Bool>* LFCrossSliceBoundary
  • Lib/TLibDecoder/TDecCAVLC.cpp

     
    407407  if (uiCode != 0)
    408408  {
    409409    Window &defDisp = pcVUI->getDefaultDisplayWindow();
    410     READ_UVLC(   uiCode, "def_disp_win_left_offset" );                defDisp.setWindowLeftOffset  ( uiCode );
    411     READ_UVLC(   uiCode, "def_disp_win_right_offset" );               defDisp.setWindowRightOffset ( uiCode );
    412     READ_UVLC(   uiCode, "def_disp_win_top_offset" );                 defDisp.setWindowTopOffset   ( uiCode );
    413     READ_UVLC(   uiCode, "def_disp_win_bottom_offset" );              defDisp.setWindowBottomOffset( uiCode );
     410    READ_UVLC(   uiCode, "def_disp_win_left_offset" );                defDisp.setWindowLeftOffset  ( uiCode * TComSPS::getWinUnitX( pcSPS->getChromaFormatIdc()) );
     411    READ_UVLC(   uiCode, "def_disp_win_right_offset" );               defDisp.setWindowRightOffset ( uiCode * TComSPS::getWinUnitX( pcSPS->getChromaFormatIdc()) );
     412    READ_UVLC(   uiCode, "def_disp_win_top_offset" );                 defDisp.setWindowTopOffset   ( uiCode * TComSPS::getWinUnitY( pcSPS->getChromaFormatIdc()) );
     413    READ_UVLC(   uiCode, "def_disp_win_bottom_offset" );              defDisp.setWindowBottomOffset( uiCode * TComSPS::getWinUnitY( pcSPS->getChromaFormatIdc()) );
    414414  }
    415415#if L0043_TIMING_INFO
    416416  TimingInfo *timingInfo = pcVUI->getTimingInfo();
  • Lib/TLibDecoder/TDecTop.cpp

     
    117117{
    118118  Int  numReorderPics[MAX_TLAYER];
    119119  Window &conformanceWindow = pcSlice->getSPS()->getConformanceWindow();
     120  Window defaultDisplayWindow = pcSlice->getSPS()->getVuiParametersPresentFlag() ? pcSlice->getSPS()->getVuiParameters()->getDefaultDisplayWindow() : Window();
    120121
    121122  for( Int temporalLayer=0; temporalLayer < MAX_TLAYER; temporalLayer++)
    122123  {
     
    129130    rpcPic = new TComPic();
    130131   
    131132    rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    132                      conformanceWindow, numReorderPics, true);
     133                     conformanceWindow, defaultDisplayWindow, numReorderPics, true);
    133134    rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
    134135    m_cListPic.pushBack( rpcPic );
    135136   
     
    167168  }
    168169  rpcPic->destroy();
    169170  rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    170                    conformanceWindow, numReorderPics, true);
     171                   conformanceWindow, defaultDisplayWindow, numReorderPics, true);
    171172  rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
    172173}
    173174
  • Lib/TLibEncoder/TEncPic.cpp

     
    126126 * \return Void
    127127 */
    128128Void TEncPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 
    129                       Window &conformanceWindow, Int *numReorderPics, Bool bIsVirtual )
     129                      Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual )
    130130{
    131131  TComPic::create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, 
    132                    conformanceWindow, numReorderPics, bIsVirtual );
     132                   conformanceWindow, defaultDisplayWindow, numReorderPics, bIsVirtual );
    133133  m_uiMaxAQDepth = uiMaxAQDepth;
    134134  if ( uiMaxAQDepth > 0 )
    135135  {
  • Lib/TLibEncoder/TEncPic.h

     
    103103  virtual ~TEncPic();
    104104
    105105  Void          create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth,   
    106                         Window &conformanceWindow, Int *numReorderPics, Bool bIsVirtual = false );
     106                        Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual = false );
    107107  virtual Void  destroy();
    108108
    109109  TEncPicQPAdaptationLayer* getAQLayer( UInt uiDepth )  { return &m_acAQLayer[uiDepth]; }
  • Lib/TLibEncoder/TEncTop.cpp

     
    421421    {
    422422      TEncPic* pcEPic = new TEncPic;
    423423      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
    424                       m_conformanceWindow, m_numReorderPics);
     424                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
    425425      rpcPic = pcEPic;
    426426    }
    427427    else
     
    429429      rpcPic = new TComPic;
    430430
    431431      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    432                       m_conformanceWindow, m_numReorderPics);
     432                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
    433433    }
    434434    if (getUseSAO())
    435435    {
  • Lib/TLibVideoIO/TVideoIOYuv.cpp

     
    462462    dstPicYuv = pPicYuv;
    463463  }
    464464  // location of upper left pel in a plane
    465   Int planeOffset = 0; //confLeft + confTop * iStride;
     465  Int planeOffset = confLeft + confTop * iStride;
    466466 
    467467  if (! writePlane(m_cHandle, dstPicYuv->getLumaAddr() + planeOffset, is16bit, iStride, width, height))
    468468  {
     
    475475  iStride >>= 1;
    476476  confLeft >>= 1;
    477477  confRight >>= 1;
     478  confTop >>= 1;
     479  confBottom >>= 1;
    478480
    479   planeOffset = 0; // confLeft + confTop * iStride;
     481  planeOffset = confLeft + confTop * iStride;
    480482
    481483  if (! writePlane(m_cHandle, dstPicYuv->getCbAddr() + planeOffset, is16bit, iStride, width, height))
    482484  {