[x265] [PATCH 4 of 5] dhdr10-opt: limits frames for which tone mapping SEI is inserted

bhavna at multicorewareinc.com bhavna at multicorewareinc.com
Thu Apr 20 07:47:01 CEST 2017


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1492645223 25200
#      Wed Apr 19 16:40:23 2017 -0700
# Node ID 8dbdf0b6a8ff6972136313a0199a0016948bb430
# Parent  9c3ae5906579b7494ca86b957c68d66d69d2817a
dhdr10-opt: limits frames for which tone mapping SEI is inserted

diff -r 9c3ae5906579 -r 8dbdf0b6a8ff doc/reST/cli.rst
--- a/doc/reST/cli.rst	Tue Mar 28 10:53:31 2017 +0530
+++ b/doc/reST/cli.rst	Wed Apr 19 16:40:23 2017 -0700
@@ -1876,6 +1876,16 @@
 	Add luma and chroma offsets for HDR/WCG content.
 	Input video should be 10 bit 4:2:0. Applicable for HDR content.
 	Default disabled. **Experimental Feature**
+	
+.. option:: --dhdr10-info <filename>
+
+	Inserts tone mapping information as an SEI message.
+	
+.. option:: --dhdr10-opt, --no-dhdr10-opt
+
+	Limits the frames for which tone mapping information is inserted as 
+	SEI message. Inserts SEI only for IDR frames and for frames where tone
+	mapping information has changed.
 
 .. option:: --min-luma <integer>
 
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/CMakeLists.txt
--- a/source/CMakeLists.txt	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/CMakeLists.txt	Wed Apr 19 16:40:23 2017 -0700
@@ -29,7 +29,7 @@
 option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 115)
+set(X265_BUILD 116)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/common/param.cpp
--- a/source/common/param.cpp	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/common/param.cpp	Wed Apr 19 16:40:23 2017 -0700
@@ -272,8 +272,11 @@
     param->bAQMotion = 0;
     param->bHDROpt = 0;
     param->analysisRefineLevel = 5;
+
     param->toneMapFile = NULL;
+    param->bDhdr10opt = 0;
 }
+
 int x265_param_default_preset(x265_param* param, const char* preset, const char* tune)
 {
 #if EXPORT_C_API
@@ -950,6 +953,7 @@
         OPT("hdr-opt") p->bHDROpt = atobool(value);
         OPT("limit-sao") p->bLimitSAO = atobool(value);
         OPT("dhdr10-info") p->toneMapFile = strdup(value);
+        OPT("dhdr10-opt") p->bDhdr10opt = atobool(value);
         else
             return X265_PARAM_BAD_NAME;
     }
@@ -1663,6 +1667,7 @@
     BOOL(p->bAQMotion, "aq-motion");
     BOOL(p->bEmitHDRSEI, "hdr");
     BOOL(p->bHDROpt, "hdr-opt");
+    BOOL(p->bDhdr10opt, "dhdr10-opt");
     s += sprintf(s, " refine-level=%d", p->analysisRefineLevel);
     BOOL(p->bLimitSAO, "limit-sao");
 #undef BOOL
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/encoder/encoder.cpp	Wed Apr 19 16:40:23 2017 -0700
@@ -87,6 +87,7 @@
     MotionEstimate::initScales();
 #if ENABLE_DYNAMIC_HDR10
     m_hdr10plus_api = hdr10plus_api_get();
+    m_prevTonemapPayload.payload = NULL;
 #endif
 }
 inline char *strcatFilename(const char *input, const char *suffix)
@@ -2226,6 +2227,12 @@
         x265_log(p, X265_LOG_WARNING, "Dynamic-rd disabled, requires RD <= 4, VBV and aq-mode enabled\n");
     }
 #ifdef ENABLE_DYNAMIC_HDR10
+    if (m_param->bDhdr10opt && m_param->toneMapFile == NULL)
+    {
+        x265_log(p, X265_LOG_WARNING, "Disabling dhdr10-opt. dhdr10-info must be enabled.\n");
+        m_param->bDhdr10opt = 0;
+    }
+
     if (m_param->toneMapFile)
     {
         if (!x265_fopen(p->toneMapFile, "r"))
@@ -2246,6 +2253,11 @@
         m_bToneMap = 0;
         m_param->toneMapFile = NULL;
     }
+    else if (m_param->bDhdr10opt)
+    {
+        x265_log(p, X265_LOG_WARNING, "Disabling dhdr10-opt. dhdr10-info must be enabled.\n");
+        m_param->bDhdr10opt = 0;
+    }
 #endif
 
     if (p->uhdBluray)
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/encoder/encoder.h
--- a/source/encoder/encoder.h	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/encoder/encoder.h	Wed Apr 19 16:40:23 2017 -0700
@@ -175,9 +175,15 @@
 
     int                     m_bToneMap; // Enables tone-mapping
     const hdr10plus_api*    m_hdr10plus_api;
+    x265_sei_payload        m_prevTonemapPayload;
 
     Encoder();
-    ~Encoder() {}
+    ~Encoder() 
+    {
+        if (m_prevTonemapPayload.payload != NULL)
+            X265_FREE(m_prevTonemapPayload.payload);
+    }
+
     void create();
     void stopJobs();
     void destroy();
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/encoder/frameencoder.cpp	Wed Apr 19 16:40:23 2017 -0700
@@ -448,6 +448,40 @@
     /* Get the QP for this frame from rate control. This call may block until
      * frames ahead of it in encode order have called rateControlEnd() */
     m_rce.encodeOrder = m_frame->m_encodeOrder;
+    bool payloadChange = false;
+    bool writeSei = true;
+    if (m_param->bDhdr10opt)
+    {
+        for (int i = 0; i < m_frame->m_userSEI.numPayloads; i++)
+        {
+            x265_sei_payload *payload = &m_frame->m_userSEI.payloads[i];
+            if(payload->payloadType == USER_DATA_REGISTERED_ITU_T_T35)
+            {
+                if (m_top->m_prevTonemapPayload.payload != NULL && payload->payloadSize == m_top->m_prevTonemapPayload.payloadSize)
+                {
+                    if (memcmp(m_top->m_prevTonemapPayload.payload, payload->payload, payload->payloadSize) != 0)
+                        payloadChange = true;
+                }
+                else
+                {
+                    payloadChange = true;
+                    if (m_top->m_prevTonemapPayload.payload != NULL)
+                        x265_free(m_top->m_prevTonemapPayload.payload);
+                    m_top->m_prevTonemapPayload.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) * payload->payloadSize);
+                }
+
+                if (payloadChange)
+                {
+                    m_top->m_prevTonemapPayload.payloadType = payload->payloadType;
+                    m_top->m_prevTonemapPayload.payloadSize = payload->payloadSize;
+                    memcpy(m_top->m_prevTonemapPayload.payload, payload->payload, payload->payloadSize);
+                }
+
+                bool isIDR = m_frame->m_lowres.sliceType == X265_TYPE_IDR;
+                writeSei = payloadChange || isIDR;
+            }
+        }
+    }
     int qp = m_top->m_rateControl->rateControlStart(m_frame, &m_rce, m_top);
     m_rce.newQp = qp;
 
@@ -627,13 +661,16 @@
         }
         else if (payload->payloadType == USER_DATA_REGISTERED_ITU_T_T35)
         {
-            SEICreativeIntentMeta sei;
-            sei.cim = payload->payload;
-            m_bs.resetBits();
-            sei.setSize(payload->payloadSize);
-            sei.write(m_bs, *slice->m_sps);
-            m_bs.writeByteAlignment();
-            m_nalList.serialize(NAL_UNIT_PREFIX_SEI, m_bs);
+            if (writeSei)
+            {
+                SEICreativeIntentMeta sei;
+                sei.cim = payload->payload;
+                m_bs.resetBits();
+                sei.setSize(payload->payloadSize);
+                sei.write(m_bs, *slice->m_sps);
+                m_bs.writeByteAlignment();
+                m_nalList.serialize(NAL_UNIT_PREFIX_SEI, m_bs);
+            }
         }
         else
             x265_log(m_param, X265_LOG_ERROR, "Unrecognized SEI type\n");
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/x265.h
--- a/source/x265.h	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/x265.h	Wed Apr 19 16:40:23 2017 -0700
@@ -1388,6 +1388,9 @@
     /* File containing the tone mapping information */
     const char*     toneMapFile;
 
+    /* Insert tone mapping information only for IDR frames and when the 
+     * tone mapping information changes. */
+    int       bDhdr10opt;
 } x265_param;
 /* x265_param_alloc:
  *  Allocates an x265_param instance. The returned param structure is not
diff -r 9c3ae5906579 -r 8dbdf0b6a8ff source/x265cli.h
--- a/source/x265cli.h	Tue Mar 28 10:53:31 2017 +0530
+++ b/source/x265cli.h	Wed Apr 19 16:40:23 2017 -0700
@@ -269,6 +269,8 @@
     { "limit-sao",            no_argument, NULL, 0 },
     { "no-limit-sao",         no_argument, NULL, 0 },
     { "dhdr10-info",    required_argument, NULL, 0 },
+    { "dhdr10-opt",           no_argument, NULL, 0},
+    { "no-dhdr10-opt",        no_argument, NULL, 0},
     { 0, 0, 0, 0 },
     { 0, 0, 0, 0 },
     { 0, 0, 0, 0 },
@@ -316,6 +318,7 @@
     H1("                                 3 - i444 (4:4:4)\n");
 #if ENABLE_DYNAMIC_HDR10
     H0("   --dhdr10-info <filename>      JSON file containing the Creative Intent Metadata to be encoded as Dynamic Tone Mapping \n");
+    H0("   --[no-]dhdr10-opt             Insert tone mapping SEI only for IDR frames and when the tone mapping information changes. Default disabled");
 #endif
     H0("-f/--frames <integer>            Maximum number of frames to encode. Default all\n");
     H0("   --seek <integer>              First frame to encode\n");


More information about the x265-devel mailing list