From bafa3bbbe5f9c787fd34584d7a4430e528c3896b Mon Sep 17 00:00:00 2001
From: Vadim Seregin <vseregin@qti.qualcomm.com>
Date: Thu, 15 Aug 2019 09:29:24 -0700
Subject: [PATCH] conformance window

---
 source/App/DecoderApp/DecApp.cpp   |  4 ++--
 source/Lib/CommonLib/TypeDef.h     |  1 +
 source/Lib/CommonLib/UnitTools.cpp | 10 ++++++++++
 source/Lib/EncoderLib/EncLib.cpp   | 22 ++++++++++++++++------
 4 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp
index 1ca5a23410..914b19f7cf 100644
--- a/source/App/DecoderApp/DecApp.cpp
+++ b/source/App/DecoderApp/DecApp.cpp
@@ -472,7 +472,7 @@ void DecApp::xWriteOutput( PicList* pcListPic, uint32_t tId )
 #else
           const Window &conf    = pcPic->cs->sps->getConformanceWindow();
 #endif
-#if JVET_O1164_RPR          
+#if JVET_O1164_RPR
           m_cVideoIOYuvReconFile.write( pcPic->cs->sps->getMaxPicWidthInLumaSamples(), pcPic->cs->sps->getMaxPicHeightInLumaSamples(), pcPic->getRecoBuf(),
 #else
           m_cVideoIOYuvReconFile.write( pcPic->getRecoBuf(),
@@ -616,7 +616,7 @@ void DecApp::xFlushOutput( PicList* pcListPic )
 #else
           const Window &conf    = pcPic->cs->sps->getConformanceWindow();
 #endif
-#if JVET_O1164_RPR          
+#if JVET_O1164_RPR
           m_cVideoIOYuvReconFile.write( pcPic->cs->sps->getMaxPicWidthInLumaSamples(), pcPic->cs->sps->getMaxPicHeightInLumaSamples(), pcPic->getRecoBuf(),
 #else
           m_cVideoIOYuvReconFile.write( pcPic->getRecoBuf(),
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index cacb786325..e90148d9a3 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -55,6 +55,7 @@
 #define JVET_O1164_PS                                     1
 #define RPR_BUFFER                                        1  // lossless
 #define RPR_CTC_PRINT                                     1
+#define RPR_CONF_WINDOW                                   1
 #endif
 
 #define JVET_O0119_BASE_PALETTE_444                       1 // JVET-O0119: Palette mode in HEVC and palette mode signaling in JVET-N0258. Only enabled for YUV444.
diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index 477862d8ad..e2aa8ac775 100755
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -107,10 +107,20 @@ void CS::setRefinedMotionField(CodingStructure &cs)
 #if JVET_O1164_RPR
 bool CU::getRprScaling( const SPS* sps, const PPS* curPPS, const PPS* refPPS, int& xScale, int& yScale )
 {
+
+#if RPR_CONF_WINDOW
+  const Window& curConfWindow = curPPS->getConformanceWindow();
+  int curPicWidth = curPPS->getPicWidthInLumaSamples() - (curConfWindow.getWindowLeftOffset() + curConfWindow.getWindowRightOffset()) * SPS::getWinUnitY(sps->getChromaFormatIdc());
+  int curPicHeight = curPPS->getPicHeightInLumaSamples() - (curConfWindow.getWindowTopOffset() + curConfWindow.getWindowBottomOffset()) * SPS::getWinUnitY(sps->getChromaFormatIdc());
+  const Window& refConfWindow = refPPS->getConformanceWindow();
+  int refPicWidth = refPPS->getPicWidthInLumaSamples() - (refConfWindow.getWindowLeftOffset() + refConfWindow.getWindowRightOffset()) * SPS::getWinUnitY(sps->getChromaFormatIdc());
+  int refPicHeight = refPPS->getPicHeightInLumaSamples() - (refConfWindow.getWindowTopOffset() + refConfWindow.getWindowBottomOffset()) * SPS::getWinUnitY(sps->getChromaFormatIdc());
+#else
   int curPicWidth = curPPS->getPicWidthInLumaSamples();
   int curPicHeight = curPPS->getPicHeightInLumaSamples();
   int refPicWidth = refPPS->getPicWidthInLumaSamples();
   int refPicHeight = refPPS->getPicHeightInLumaSamples();
+#endif
 
   xScale = ( ( refPicWidth << 14 ) + ( curPicWidth >> 1 ) ) / curPicWidth;
   yScale = ( ( refPicHeight << 14 ) + ( curPicHeight >> 1 ) ) / curPicHeight;
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 96b562cc64..e00df6e3dd 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -292,13 +292,23 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf )
   if( m_rprEnabled )
   {
     PPS &pps = *( m_ppsMap.allocatePS( 3 ) );
-    int scaledWidth = int( pps0.getPicWidthInLumaSamples() / m_scalingRatio );
-    int temp = scaledWidth >> 3;
-    int width = ( scaledWidth - ( temp << 3 ) > 0 ? temp + 1 : temp ) << 3;
+#if RPR_CONF_WINDOW
+    Window& inputConfWindow = pps0.getConformanceWindow();
+    int scaledWidth = int((pps0.getPicWidthInLumaSamples() - (inputConfWindow.getWindowLeftOffset() + inputConfWindow.getWindowRightOffset()) * SPS::getWinUnitX(sps0.getChromaFormatIdc())) / m_scalingRatio);
+#else
+    int scaledWidth = int(pps0.getPicWidthInLumaSamples() / m_scalingRatio);
+#endif
+    int minSizeUnit = std::max(8, (int)(sps0.getMaxCUHeight() >> (sps0.getMaxCodingDepth() - 1)));
+    int temp = scaledWidth / minSizeUnit;
+    int width = ( scaledWidth - ( temp * minSizeUnit) > 0 ? temp + 1 : temp ) * minSizeUnit;
 
-    int scaledHeight = int( pps0.getPicHeightInLumaSamples() / m_scalingRatio );
-    temp = scaledHeight >> 3;
-    int height = ( scaledHeight - ( temp << 3 ) > 0 ? temp + 1 : temp ) << 3;
+#if RPR_CONF_WINDOW
+    int scaledHeight = int((pps0.getPicHeightInLumaSamples() - (inputConfWindow.getWindowTopOffset() + inputConfWindow.getWindowBottomOffset()) * SPS::getWinUnitY(sps0.getChromaFormatIdc())) / m_scalingRatio);
+#else
+    int scaledHeight = int(pps0.getPicHeightInLumaSamples() / m_scalingRatio);
+#endif
+    temp = scaledHeight / minSizeUnit;
+    int height = ( scaledHeight - ( temp * minSizeUnit) > 0 ? temp + 1 : temp ) * minSizeUnit;
 
     pps.setPicWidthInLumaSamples( width );
     pps.setPicHeightInLumaSamples( height );
-- 
GitLab