From d6ee43f8a86fe7f7b11e3ae61a2d5a1d19ce564c Mon Sep 17 00:00:00 2001
From: Philip Cowan <cowanp@sharplabs.com>
Date: Mon, 9 Mar 2020 13:48:55 -0700
Subject: [PATCH] Updates to support JVET-Q0216

---
 source/Lib/CommonLib/TypeDef.h     |  2 ++
 source/Lib/DecoderLib/SEIread.cpp  | 16 ++++++++++++++--
 source/Lib/EncoderLib/SEIwrite.cpp |  9 ++++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 68197ea53..3fd83a361 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -256,6 +256,8 @@
 
 #define JVET_Q0221                                        1 // JVET-Q0221: Decoding unit parameter signalling
 
+#define JVET_Q0216                                        1 // JVET-Q0216: modification to picture timing SEI message
+
 #define APPLY_SBT_SL_ON_MTS                               1 // apply save & load fast algorithm on inter MTS when SBT is on
 
 #define REMOVE_PPS_REXT                                   1  // remove RExt PPS extension
diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp
index 08233e03b..1e4422079 100644
--- a/source/Lib/DecoderLib/SEIread.cpp
+++ b/source/Lib/DecoderLib/SEIread.cpp
@@ -699,8 +699,20 @@ void SEIReader::xParseSEIPictureTiming(SEIPictureTiming& sei, uint32_t payloadSi
       }
       if( sei.m_cpbRemovalDelayDeltaEnabledFlag[ i ] )
       {
-        sei_read_code( pDecodedMessageOutputStream, ceilLog2(bp.m_numCpbRemovalDelayDeltas), symbol, "cpb_removal_delay_delta_idx[i]" );
-        sei.m_cpbRemovalDelayDeltaIdx[ i ] = symbol;
+#if JVET_Q0216
+        if ((bp.m_numCpbRemovalDelayDeltas - 1) > 0)
+        {
+          sei_read_code(pDecodedMessageOutputStream, ceilLog2(bp.m_numCpbRemovalDelayDeltas), symbol, "cpb_removal_delay_delta_idx[i]");
+          sei.m_cpbRemovalDelayDeltaIdx[i] = symbol;
+        }
+        else
+        {
+          sei.m_cpbRemovalDelayDeltaIdx[i] = 0;
+        }
+#else
+        sei_read_code(pDecodedMessageOutputStream, ceilLog2(bp.m_numCpbRemovalDelayDeltas), symbol, "cpb_removal_delay_delta_idx[i]");
+        sei.m_cpbRemovalDelayDeltaIdx[i] = symbol;
+#endif
       }
       else
       {
diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp
index 3673ecea4..7ed20aa88 100644
--- a/source/Lib/EncoderLib/SEIwrite.cpp
+++ b/source/Lib/EncoderLib/SEIwrite.cpp
@@ -362,7 +362,14 @@ void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, const SEIBuf
       }
       if( sei.m_cpbRemovalDelayDeltaEnabledFlag[i] )
       {
-        WRITE_CODE( sei.m_cpbRemovalDelayDeltaIdx[i], ceilLog2(bp.m_numCpbRemovalDelayDeltas),               "cpb_removal_delay_delta_idx[i]" );
+#if JVET_Q0216
+        if ((bp.m_numCpbRemovalDelayDeltas - 1) > 0)
+        {
+          WRITE_CODE(sei.m_cpbRemovalDelayDeltaIdx[i], ceilLog2(bp.m_numCpbRemovalDelayDeltas), "cpb_removal_delay_delta_idx[i]");
+        }
+#else
+        WRITE_CODE(sei.m_cpbRemovalDelayDeltaIdx[i], ceilLog2(bp.m_numCpbRemovalDelayDeltas), "cpb_removal_delay_delta_idx[i]");
+#endif
       }
       else
       {
-- 
GitLab