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, |
762 | 762 | } |
763 | 763 | } |
764 | 764 | |
765 | | void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight) |
| 765 | void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag) |
766 | 766 | { |
767 | 767 | |
768 | 768 | // 1.1 set up margin for back up memory allocation |
… |
… |
void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWi |
799 | 799 | |
800 | 800 | |
801 | 801 | // 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); |
803 | 803 | Pel *src = s.bufAt(left, top); |
804 | 804 | |
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); |
808 | 810 | |
809 | 811 | |
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); |
813 | 815 | |
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 | } |
821 | 824 | } |
822 | | |
823 | 825 | // 3.3.1 set back up buffer for above |
824 | 826 | PelBuf dBufTop = m_bufSubPicAbove.getBuf(compID); |
825 | 827 | Pel *dstTop = dBufTop.bufAt(0, 0); |
… |
… |
void Picture::saveSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWi |
839 | 841 | } |
840 | 842 | } |
841 | 843 | |
842 | | void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight) |
| 844 | void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag) |
843 | 845 | { |
844 | 846 | |
845 | 847 | for (int comp = 0; comp < getNumberValidComponents(cs->area.chromaFormat); comp++) |
… |
… |
void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPic |
859 | 861 | int height = subPicHeight >> getComponentScaleY(compID, cs->area.chromaFormat); |
860 | 862 | |
861 | 863 | // 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); |
863 | 865 | Pel *src = s.bufAt(left, top); |
864 | 866 | |
865 | 867 | // 4.1 apply padding for left and right |
| 868 | if (!refWrapAroundFlag) |
866 | 869 | { |
867 | 870 | Pel *dstLeft = src - xmargin; |
868 | 871 | Pel *dstRight = src + width; |
… |
… |
void Picture::extendSubPicBorder(int POC, int subPicX0, int subPicY0, int subPic |
905 | 908 | } // end of for |
906 | 909 | } |
907 | 910 | |
908 | | void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight) |
| 911 | void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPicWidth, int subPicHeight, bool refWrapAroundFlag) |
909 | 912 | { |
910 | 913 | for (int comp = 0; comp < getNumberValidComponents(cs->area.chromaFormat); comp++) |
911 | 914 | { |
… |
… |
void Picture::restoreSubPicBorder(int POC, int subPicX0, int subPicY0, int subPi |
924 | 927 | int height = subPicHeight >> getComponentScaleY(compID, cs->area.chromaFormat); |
925 | 928 | |
926 | 929 | // 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); |
928 | 931 | Pel *src = s.bufAt(left, top); |
929 | 932 | |
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); |
933 | 938 | |
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); |
937 | 942 | |
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; |
941 | 946 | |
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 | } |
947 | 953 | } |
948 | 954 | |
949 | 955 | |
diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h
index cee9b5dc..8e9a39ba 100644
a
|
b
|
public: |
197 | 197 | PelStorage m_bufSubPicLeft; |
198 | 198 | PelStorage m_bufSubPicRight; |
199 | 199 | |
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); |
203 | 203 | |
204 | 204 | bool getSubPicSaved() { return m_isSubPicBorderSaved; } |
205 | 205 | void setSubPicSaved(bool bVal) { m_isSubPicBorderSaved = bVal; } |
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 |
178 | 178 | if (!refPic->getSubPicSaved()) |
179 | 179 | #endif |
180 | 180 | { |
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()); |
183 | 183 | refPic->setSubPicSaved(true); |
184 | 184 | } |
185 | 185 | } |
… |
… |
void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb |
293 | 293 | Picture *refPic = slice->getRefPic((RefPicList)rlist, idx); |
294 | 294 | if (refPic->getSubPicSaved()) |
295 | 295 | { |
296 | | refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight); |
| 296 | refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, slice->getPPS()->getWrapAroundEnabledFlag()); |
297 | 297 | refPic->setSubPicSaved(false); |
298 | 298 | } |
299 | 299 | } |
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 |
1586 | 1586 | if (!refPic->getSubPicSaved()) |
1587 | 1587 | #endif |
1588 | 1588 | { |
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()); |
1591 | 1591 | refPic->setSubPicSaved(true); |
1592 | 1592 | } |
1593 | 1593 | } |
… |
… |
void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons |
1802 | 1802 | Picture *refPic = pcSlice->getRefPic((RefPicList)rlist, idx); |
1803 | 1803 | if (refPic->getSubPicSaved()) |
1804 | 1804 | { |
1805 | | refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight); |
| 1805 | refPic->restoreSubPicBorder(refPic->getPOC(), subPicX, subPicY, subPicWidth, subPicHeight, pcSlice->getPPS()->getWrapAroundEnabledFlag()); |
1806 | 1806 | refPic->setSubPicSaved(false); |
1807 | 1807 | } |
1808 | 1808 | } |