Ticket #1145: fix_refwrap_subpic.diff

File fix_refwrap_subpic.diff, 9.8 KB (added by wzeng, 4 years ago)
  • source/Lib/CommonLib/Picture.cpp

    diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp
    index 17cf848e..a906cc99 100644
    a b void Picture::rescalePicture( const std::pair<int, int> scalingRatio, 
    762762  }
    763763}
    764764
    765 void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight)
     765void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag)
    766766{
    767767
    768768  // 1.1 set up margin for back up memory allocation
    void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWi 
    799799
    800800
    801801    // 3.1.1 set reconstructed picture
    802     PelBuf s = M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
     802    PelBuf s = refWrapAroundFlag ? M_BUFS(0, PIC_RECON_WRAP).get(compID) : M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
    803803    Pel *src = s.bufAt(left, top);
    804804
    805     // 3.2.1 set back up buffer for left
    806     PelBuf dBufLeft   = m_bufSubPicLeft.getBuf(compID);
    807     Pel    *dstLeft   = dBufLeft.bufAt(0, 0);
     805    if (!refWrapAroundFlag)
     806    {
     807      // 3.2.1 set back up buffer for left
     808      PelBuf dBufLeft   = m_bufSubPicLeft.getBuf(compID);
     809      Pel    *dstLeft   = dBufLeft.bufAt(0, 0);
    808810
    809811
    810     // 3.2.2 set back up buffer for right
    811     PelBuf dBufRight  = m_bufSubPicRight.getBuf(compID);
    812     Pel    *dstRight  = dBufRight.bufAt(0, 0);
     812      // 3.2.2 set back up buffer for right
     813      PelBuf dBufRight  = m_bufSubPicRight.getBuf(compID);
     814      Pel    *dstRight  = dBufRight.bufAt(0, 0);
    813815
    814     // 3.2.3 copy to recon picture to back up buffer
    815     Pel *srcLeft  = src - xmargin;
    816     Pel *srcRight = src + width;
    817     for (int y = 0; y < height; y++)
    818     {
    819       ::memcpy(dstLeft  + y *  dBufLeft.stride, srcLeft  + y * s.stride, sizeof(Pel) * xmargin);
    820       ::memcpy(dstRight + y * dBufRight.stride, srcRight + y * s.stride, sizeof(Pel) * xmargin);
     816      // 3.2.3 copy to recon picture to back up buffer
     817      Pel *srcLeft  = src - xmargin;
     818      Pel *srcRight = src + width;
     819      for (int y = 0; y < height; y++)
     820      {
     821        ::memcpy(dstLeft  + y *  dBufLeft.stride, srcLeft  + y * s.stride, sizeof(Pel) * xmargin);
     822        ::memcpy(dstRight + y * dBufRight.stride, srcRight + y * s.stride, sizeof(Pel) * xmargin);
     823      }
    821824    }
    822 
    823825    // 3.3.1 set back up buffer for above
    824826    PelBuf dBufTop = m_bufSubPicAbove.getBuf(compID);
    825827    Pel    *dstTop = dBufTop.bufAt(0, 0);
    void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWi 
    839841  }
    840842}
    841843
    842 void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight)
     844void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag)
    843845{
    844846
    845847  for (int comp = 0; comp < getNumberValidComponents(cs->area.chromaFormat); comp++)
    void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPic 
    859861    int height = subPicHeight >> getComponentScaleY(compID, cs->area.chromaFormat);
    860862
    861863    // 3.1 set reconstructed picture
    862     PelBuf s = M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
     864    PelBuf s = refWrapAroundFlag ? M_BUFS(0, PIC_RECON_WRAP).get(compID) : M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
    863865    Pel *src = s.bufAt(left, top);
    864866
    865867    // 4.1 apply padding for left and right
     868    if (!refWrapAroundFlag)
    866869    {
    867870      Pel *dstLeft  = src - xmargin;
    868871      Pel *dstRight = src + width;
    void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPic 
    905908  } // end of for
    906909}
    907910
    908 void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight)
     911void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag)
    909912{
    910913  for (int comp = 0; comp < getNumberValidComponents(cs->area.chromaFormat); comp++)
    911914  {
    void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPi 
    924927    int height = subPicHeight >> getComponentScaleY(compID, cs->area.chromaFormat);
    925928
    926929    // 3.1 set reconstructed picture
    927     PelBuf s = M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
     930    PelBuf s = refWrapAroundFlag ? M_BUFS(0, PIC_RECON_WRAP).get(compID) : M_BUFS(0, PIC_RECONSTRUCTION).get(compID);
    928931    Pel *src = s.bufAt(left, top);
    929932
    930     // 4.2.1 copy from back up buffer to recon picture
    931     PelBuf dBufLeft = m_bufSubPicLeft.getBuf(compID);
    932     Pel    *dstLeft = dBufLeft.bufAt(0, 0);
     933    if (!refWrapAroundFlag)
     934    {
     935      // 4.2.1 copy from back up buffer to recon picture
     936      PelBuf dBufLeft = m_bufSubPicLeft.getBuf(compID);
     937      Pel    *dstLeft = dBufLeft.bufAt(0, 0);
    933938
    934     // 4.2.2 set back up buffer for right
    935     PelBuf dBufRight = m_bufSubPicRight.getBuf(compID);
    936     Pel    *dstRight = dBufRight.bufAt(0, 0);
     939      // 4.2.2 set back up buffer for right
     940      PelBuf dBufRight = m_bufSubPicRight.getBuf(compID);
     941      Pel    *dstRight = dBufRight.bufAt(0, 0);
    937942
    938     // 4.2.3 copy to recon picture to back up buffer
    939     Pel *srcLeft  = src - xmargin;
    940     Pel *srcRight = src + width;
     943      // 4.2.3 copy to recon picture to back up buffer
     944      Pel *srcLeft  = src - xmargin;
     945      Pel *srcRight = src + width;
    941946
    942     for (int y = 0; y < height; y++)
    943     {
    944       // the destination and source position is reversed on purpose
    945       ::memcpy(srcLeft  + y * s.stride,  dstLeft + y *  dBufLeft.stride, sizeof(Pel) * xmargin);
    946       ::memcpy(srcRight + y * s.stride, dstRight + y * dBufRight.stride, sizeof(Pel) * xmargin);
     947      for (int y = 0; y < height; y++)
     948      {
     949        // the destination and source position is reversed on purpose
     950        ::memcpy(srcLeft  + y * s.stride,  dstLeft + y *  dBufLeft.stride, sizeof(Pel) * xmargin);
     951        ::memcpy(srcRight + y * s.stride, dstRight + y * dBufRight.stride, sizeof(Pel) * xmargin);
     952      }
    947953    }
    948954
    949955
  • source/Lib/CommonLib/Picture.h

    diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h
    index cee9b5dc..8e9a39ba 100644
    a b public: 
    197197  PelStorage m_bufSubPicLeft;
    198198  PelStorage m_bufSubPicRight;
    199199
    200   void    saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight);
    201   void  extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight);
    202   void restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight);
     200  void    saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag);
     201  void  extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag);
     202  void restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag);
    203203
    204204  bool getSubPicSaved()          { return m_isSubPicBorderSaved; }
    205205  void setSubPicSaved(bool bVal) { m_isSubPicBorderSaved = bVal; }
  • source/Lib/DecoderLib/DecSlice.cpp

    diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp
    index 335b79ae..2cf2565c 100644
    a b void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb 
    178178          if (!refPic->getSubPicSaved())
    179179#endif
    180180          {
    181             refPic->saveSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
    182             refPic->extendSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
     181            refPic->saveSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, slice->getPPS()->getWrapAroundEnabledFlag());
     182            refPic->extendSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, slice->getPPS()->getWrapAroundEnabledFlag());
    183183            refPic->setSubPicSaved(true);
    184184          }
    185185        }
    void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb 
    293293          Picture *refPic = slice->getRefPic((RefPicList)rlist, idx);
    294294          if (refPic->getSubPicSaved())
    295295          {
    296             refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
     296            refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, slice->getPPS()->getWrapAroundEnabledFlag());
    297297            refPic->setSubPicSaved(false);
    298298          }
    299299        }
  • source/Lib/EncoderLib/EncSlice.cpp

    diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
    index 60d94c0d..436dea3d 100644
    a b void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons 
    15861586          if (!refPic->getSubPicSaved())
    15871587#endif
    15881588          {
    1589             refPic->saveSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
    1590             refPic->extendSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
     1589            refPic->saveSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, pcSlice->getPPS()->getWrapAroundEnabledFlag());
     1590            refPic->extendSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, pcSlice->getPPS()->getWrapAroundEnabledFlag());
    15911591            refPic->setSubPicSaved(true);
    15921592          }
    15931593        }
    void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons 
    18021802          Picture *refPic = pcSlice->getRefPic((RefPicList)rlist, idx);
    18031803          if (refPic->getSubPicSaved())
    18041804          {
    1805             refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight);
     1805            refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, pcSlice->getPPS()->getWrapAroundEnabledFlag());
    18061806            refPic->setSubPicSaved(false);
    18071807          }
    18081808        }