diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp index c679a4b58cf281738afa52baac86a8d28989577b..f6d45ebb1c7fc5dc1bcceb2b1077e174cb4dc315 100644 --- a/source/Lib/CommonLib/InterPrediction.cpp +++ b/source/Lib/CommonLib/InterPrediction.cpp @@ -21339,6 +21339,12 @@ void InterPrediction::deriveMVDcandAffine(const PredictionUnit& pu, RefPicList e for (int i = 0; i < numPt; i++) { PictureType pt = (i == 0) ? PIC_RECONSTRUCTION_0 : PIC_RECONSTRUCTION_1; +#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR + if (pt == PIC_RECONSTRUCTION_1) + { + padDirtyArea(pcCurPic, slice, pt); + } +#endif mcFramePadOneSide(pcCurPic, slice, PAD_TOP, pPadBuffYUV, &blkDataTmp, pPadYUVContainerDyn, blkUnitAreaBuff, pCurBuffYUV, pt); mcFramePadOneSide(pcCurPic, slice, PAD_BOTTOM, pPadBuffYUV, &blkDataTmp, pPadYUVContainerDyn, blkUnitAreaBuff, @@ -22019,3 +22025,31 @@ void InterPrediction::deriveMVDcandAffine(const PredictionUnit& pu, RefPicList e } } #endif + +#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR + void InterPrediction::padDirtyArea(Picture* pcCurPic, Slice& slice, PictureType pt) + { + if (slice.getPicHeader()->getNumVerVirtualBoundaries() == 1) + { + const int maxCh = pcCurPic->chromaFormat == CHROMA_400 ? 0 : 2; + for (int chan = 0; chan <= maxCh; chan++) + { + const ComponentID ch = ComponentID(chan); + Pel* piTxtRec = pcCurPic->getBuf(ch, pt).bufAt(0, 0); + const int iStrideRec = pcCurPic->getBuf(ch, pt).stride; + const int iWidthFrm = slice.getPPS()->getPicWidthInLumaSamples() >> getComponentScaleX(ch, CHROMA_420); + const int iHeightFrm = slice.getPPS()->getPicHeightInLumaSamples() >> getComponentScaleY(ch, CHROMA_420); + const int posVBX = slice.getPicHeader()->getVirtualBoundariesPosX(0) >> getComponentScaleX(ch, CHROMA_420); + + for (int idy = 0; idy < iHeightFrm; idy++) + { + for (int idx = posVBX; idx < iWidthFrm; idx++) + { + piTxtRec[idx] = piTxtRec[posVBX - 1]; + } + piTxtRec += iStrideRec; + } + } + } + } +#endif diff --git a/source/Lib/CommonLib/InterPrediction.h b/source/Lib/CommonLib/InterPrediction.h index 3e8afea62d90b94593d1e10fc52a39d8e4fad893..5df028806685149fd7f4995b538aaa3bbc307db4 100644 --- a/source/Lib/CommonLib/InterPrediction.h +++ b/source/Lib/CommonLib/InterPrediction.h @@ -1008,6 +1008,9 @@ public: PredictionUnit *blkDataTmp, PelStorage *pPadYUVContainerDyn, const UnitArea blkUnitAreaBuff, PelStorage *pCurBuffYUV, PictureType pt); void mcFramePadRepExt(Picture *pcCurPic, Slice &slice, PictureType pt); +#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR + void padDirtyArea(Picture* pcCurPic, Slice& slice, PictureType pt); +#endif #else void mcFramePadOneSide(Picture *pcCurPic, Slice &slice, PadDirection padDir, PelStorage *pPadBuffYUV, PredictionUnit *blkDataTmp, PelStorage *pPadYUVContainerDyn, const UnitArea blkUnitAreaBuff, diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index bfafcef6676860ca9ad21a4c85a5794c85e4a54e..c1a1f626f1be5c6341c2d1dcaf0104930e592298 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -255,6 +255,7 @@ #define JVET_AC0144_AFFINE_DMVR_REGRESSION 1 // JVET-AC0144: DMVR for affine with regression refinement #define JVET_AC0158_PIXEL_AFFINE_MC 1 // JVET-AC0158: Pixel based affine motion compensation #define JVET_AD0195_HIGH_PRECISION_BDOF_CORE 1 // JVET_AD0195: High-Precision MV Refinement for BDOF +#define JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR 1 // JVET-AD0123: Reference picture padding for GDR // Inter template matching tools #define ENABLE_INTER_TEMPLATE_MATCHING 1 // It controls whether template matching is enabled for inter prediction