[x265] [PATCH 3 of 5] sei clean up

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


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1490678611 -19800
#      Tue Mar 28 10:53:31 2017 +0530
# Node ID 9c3ae5906579b7494ca86b957c68d66d69d2817a
# Parent  e2eb86dce7f493cd14ea3d8bc002d17f839b1aa7
sei clean up

diff -r e2eb86dce7f4 -r 9c3ae5906579 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Wed Apr 19 16:36:59 2017 -0700
+++ b/source/encoder/encoder.cpp	Tue Mar 28 10:53:31 2017 +0530
@@ -86,7 +86,7 @@
         m_frameEncoder[i] = NULL;
     MotionEstimate::initScales();
 #if ENABLE_DYNAMIC_HDR10
-    api = hdr10plus_api_get();
+    m_hdr10plus_api = hdr10plus_api_get();
 #endif
 }
 inline char *strcatFilename(const char *input, const char *suffix)
@@ -602,7 +602,7 @@
         if (m_bToneMap)
         {
             uint8_t *cim = NULL;
-            if (api->hdr10plus_json_to_frame_cim(m_param->toneMapFile, pic_in->poc, cim))
+            if (m_hdr10plus_api->hdr10plus_json_to_frame_cim(m_param->toneMapFile, pic_in->poc, cim))
             {
                 toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) * cim[0]);
                 toneMap.payloadSize = cim[0];
@@ -1758,9 +1758,8 @@
                 
                 bs.resetBits();
                 SEIuserDataUnregistered idsei;
-                idsei.m_payloadType = USER_DATA_UNREGISTERED;
                 idsei.m_userData = (uint8_t*)buffer;
-                idsei.m_userDataLength = (uint32_t)strlen(buffer);
+                idsei.setSize((uint32_t)strlen(buffer));
                 idsei.write(bs, m_sps);
                 bs.writeByteAlignment();
                 list.serialize(NAL_UNIT_PREFIX_SEI, bs);
diff -r e2eb86dce7f4 -r 9c3ae5906579 source/encoder/encoder.h
--- a/source/encoder/encoder.h	Wed Apr 19 16:36:59 2017 -0700
+++ b/source/encoder/encoder.h	Tue Mar 28 10:53:31 2017 +0530
@@ -172,8 +172,10 @@
     /* For HDR*/
     double                m_cB;
     double                m_cR;
-    int                m_bToneMap; // Enables tone-mapping
-    const hdr10plus_api*     api;
+
+    int                     m_bToneMap; // Enables tone-mapping
+    const hdr10plus_api*    m_hdr10plus_api;
+
     Encoder();
     ~Encoder() {}
     void create();
diff -r e2eb86dce7f4 -r 9c3ae5906579 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Wed Apr 19 16:36:59 2017 -0700
+++ b/source/encoder/frameencoder.cpp	Tue Mar 28 10:53:31 2017 +0530
@@ -615,30 +615,28 @@
     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 (payload->payloadType == USER_DATA_UNREGISTERED)
         {
             SEIuserDataUnregistered sei;
-            sei.m_payloadType = payload->payloadType;
-            sei.m_userDataLength = payload->payloadSize;
             sei.m_userData = 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 ENABLE_DYNAMIC_HDR10
-        else if (m_param->toneMapFile != NULL)
+        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);
         }
-#endif
+        else
+            x265_log(m_param, X265_LOG_ERROR, "Unrecognized SEI type\n");
     }
     /* CQP and CRF (without capped VBV) doesn't use mid-frame statistics to 
      * tune RateControl parameters for other frames.
@@ -948,29 +946,32 @@
     if (m_param->decodedPictureHashSEI)
     {
         int planes = (m_frame->m_param->internalCsp != X265_CSP_I400) ? 3 : 1;
+        int32_t payloadSize = 0;
         if (m_param->decodedPictureHashSEI == 1)
         {
             m_seiReconPictureDigest.m_method = SEIDecodedPictureHash::MD5;
             for (int i = 0; i < planes; i++)
                 MD5Final(&m_state[i], m_seiReconPictureDigest.m_digest[i]);
+            payloadSize = 1 + 16 * planes;
         }
         else if (m_param->decodedPictureHashSEI == 2)
         {
             m_seiReconPictureDigest.m_method = SEIDecodedPictureHash::CRC;
             for (int i = 0; i < planes; i++)
                 crcFinish(m_crc[i], m_seiReconPictureDigest.m_digest[i]);
+            payloadSize = 1 + 2 * planes;
         }
         else if (m_param->decodedPictureHashSEI == 3)
         {
             m_seiReconPictureDigest.m_method = SEIDecodedPictureHash::CHECKSUM;
             for (int i = 0; i < planes; i++)
                 checksumFinish(m_checksum[i], m_seiReconPictureDigest.m_digest[i]);
+            payloadSize = 1 + 4 * planes;
         }
-
         m_bs.resetBits();
+        m_seiReconPictureDigest.setSize(payloadSize);
         m_seiReconPictureDigest.write(m_bs, *slice->m_sps);
         m_bs.writeByteAlignment();
-
         m_nalList.serialize(NAL_UNIT_SUFFIX_SEI, m_bs);
     }
 
diff -r e2eb86dce7f4 -r 9c3ae5906579 source/encoder/sei.cpp
--- a/source/encoder/sei.cpp	Wed Apr 19 16:36:59 2017 -0700
+++ b/source/encoder/sei.cpp	Tue Mar 28 10:53:31 2017 +0530
@@ -38,24 +38,38 @@
  * in bitstream bs */
 void SEI::write(Bitstream& bs, const SPS& sps)
 {
+    uint32_t type = m_payloadType;
+    m_bitIf = &bs;
     BitCounter count;
-    m_bitIf = &count;
+    bool hrdTypes = (m_payloadType == ACTIVE_PARAMETER_SETS || m_payloadType == PICTURE_TIMING || m_payloadType == BUFFERING_PERIOD);
+    if (hrdTypes)
+    {
+        m_bitIf = &count;
+        /* virtual writeSEI method, write to bit counter to determine size */
+        writeSEI(sps);
+        m_bitIf = &bs;
+        uint32_t type = m_payloadType;
+        for (; type >= 0xff; type -= 0xff)
+            WRITE_CODE(0xff, 8, "payload_type");
+    }
+    WRITE_CODE(type, 8, "payload_type");
+    uint32_t payloadSize;
+    if (hrdTypes || m_payloadType == USER_DATA_UNREGISTERED)
+    {
+        if (hrdTypes)
+        {
+            X265_CHECK(0 == (count.getNumberOfWrittenBits() & 7), "payload unaligned\n");
+            payloadSize = count.getNumberOfWrittenBits() >> 3;
+        }
+        else
+            payloadSize = m_payloadSize + 16;
 
-    /* virtual writeSEI method, write to bit counter */
-    writeSEI(sps);
-
-    m_bitIf = &bs;
-    uint32_t type = payloadType();
-    for (; type >= 0xff; type -= 0xff)
-        WRITE_CODE(0xff, 8, "payload_type");
-    WRITE_CODE(type, 8, "payload_type");
-
-    X265_CHECK(0 == (count.getNumberOfWrittenBits() & 7), "payload unaligned\n");
-    uint32_t payloadSize = count.getNumberOfWrittenBits() >> 3;
-    for (; payloadSize >= 0xff; payloadSize -= 0xff)
-        WRITE_CODE(0xff, 8, "payload_size");
-    WRITE_CODE(payloadSize, 8, "payload_size");
-
+        for (; payloadSize >= 0xff; payloadSize -= 0xff)
+            WRITE_CODE(0xff, 8, "payload_size");
+        WRITE_CODE(payloadSize, 8, "payload_size");
+    }
+    else if(m_payloadType != USER_DATA_REGISTERED_ITU_T_T35)
+        WRITE_CODE(m_payloadSize, 8, "payload_size");
     /* virtual writeSEI method, write to bs */
     writeSEI(sps);
 }
@@ -72,3 +86,8 @@
         }
     }
 }
+
+void SEI::setSize(uint32_t size)
+{
+    m_payloadSize = size;
+}
diff -r e2eb86dce7f4 -r 9c3ae5906579 source/encoder/sei.h
--- a/source/encoder/sei.h	Wed Apr 19 16:36:59 2017 -0700
+++ b/source/encoder/sei.h	Tue Mar 28 10:53:31 2017 +0530
@@ -34,53 +34,34 @@
 class SEI : public SyntaxElementWriter
 {
 public:
+    /* SEI users call write() to marshal an SEI to a bitstream.
+     * The write() method calls writeSEI() which encodes the header */
+    void write(Bitstream& bs, const SPS& sps);
 
-    /* SEI users call write() to marshal an SEI to a bitstream. SEI
-     * subclasses may implement write() or accept the default write()
-     * method which calls writeSEI() with a bitcounter to determine
-     * the size, then it encodes the header and calls writeSEI a
-     * second time for the real encode. */
-    virtual void write(Bitstream& bs, const SPS& sps);
-
+    void setSize(uint32_t size);
     virtual ~SEI() {}
-
 protected:
-
-    virtual SEIPayloadType payloadType() const = 0;
-
-    virtual void writeSEI(const SPS&) { X265_CHECK(0, "empty writeSEI method called\n");  }
-
+    SEIPayloadType  m_payloadType;
+    uint32_t        m_payloadSize;
+    virtual void writeSEI(const SPS&) = 0;
     void writeByteAlign();
 };
 
 class SEIuserDataUnregistered : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return m_payloadType; }
-
-    SEIuserDataUnregistered() : m_userData(NULL) {}
-
+    SEIuserDataUnregistered() : m_userData(NULL)
+    {
+        m_payloadType = USER_DATA_UNREGISTERED;
+        m_payloadSize = 0;
+    }
     static const uint8_t m_uuid_iso_iec_11578[16];
-    SEIPayloadType m_payloadType;
-    uint32_t m_userDataLength;
     uint8_t *m_userData;
-
-    void write(Bitstream& bs, const SPS&)
+    void writeSEI(const SPS&)
     {
-        m_bitIf = &bs;
-
-        WRITE_CODE(m_payloadType, 8, "payload_type");
-
-        uint32_t payloadSize = 16 + m_userDataLength;
-        for (; payloadSize >= 0xff; payloadSize -= 0xff)
-            WRITE_CODE(0xff, 8, "payload_size");
-        WRITE_CODE(payloadSize, 8, "payload_size");
-
         for (uint32_t i = 0; i < 16; i++)
             WRITE_CODE(m_uuid_iso_iec_11578[i], 8, "sei.uuid_iso_iec_11578[i]");
-
-        for (uint32_t i = 0; i < m_userDataLength; i++)
+        for (uint32_t i = 0; i < m_payloadSize; i++)
             WRITE_CODE(m_userData[i], 8, "user_data");
     }
 };
@@ -88,15 +69,16 @@
 class SEIMasteringDisplayColorVolume : public SEI
 {
 public:
-
+    SEIMasteringDisplayColorVolume()
+    {
+        m_payloadType = MASTERING_DISPLAY_INFO;
+        m_payloadSize = (8 * 2 + 2 * 4);
+    }
     uint16_t displayPrimaryX[3];
     uint16_t displayPrimaryY[3];
     uint16_t whitePointX, whitePointY;
     uint32_t maxDisplayMasteringLuminance;
     uint32_t minDisplayMasteringLuminance;
-
-    SEIPayloadType payloadType() const { return MASTERING_DISPLAY_INFO; }
-
     bool parse(const char* value)
     {
         return sscanf(value, "G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)",
@@ -106,14 +88,8 @@
                       &whitePointX, &whitePointY,
                       &maxDisplayMasteringLuminance, &minDisplayMasteringLuminance) == 10;
     }
-
-    void write(Bitstream& bs, const SPS&)
+    void writeSEI(const SPS&)
     {
-        m_bitIf = &bs;
-
-        WRITE_CODE(MASTERING_DISPLAY_INFO, 8, "payload_type");
-        WRITE_CODE(8 * 2 + 2 * 4, 8, "payload_size");
-
         for (uint32_t i = 0; i < 3; i++)
         {
             WRITE_CODE(displayPrimaryX[i], 16, "display_primaries_x[ c ]");
@@ -129,18 +105,15 @@
 class SEIContentLightLevel : public SEI
 {
 public:
-
+    SEIContentLightLevel()
+    {
+        m_payloadType = CONTENT_LIGHT_LEVEL_INFO;
+        m_payloadSize = 4;
+    }
     uint16_t max_content_light_level;
     uint16_t max_pic_average_light_level;
-
-    SEIPayloadType payloadType() const { return CONTENT_LIGHT_LEVEL_INFO; }
-
-    void write(Bitstream& bs, const SPS&)
+    void writeSEI(const SPS&)
     {
-        m_bitIf = &bs;
-
-        WRITE_CODE(CONTENT_LIGHT_LEVEL_INFO, 8, "payload_type");
-        WRITE_CODE(4, 8, "payload_size");
         WRITE_CODE(max_content_light_level,     16, "max_content_light_level");
         WRITE_CODE(max_pic_average_light_level, 16, "max_pic_average_light_level");
     }
@@ -149,42 +122,22 @@
 class SEIDecodedPictureHash : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return DECODED_PICTURE_HASH; }
-
+    SEIDecodedPictureHash()
+    {
+        m_payloadType = DECODED_PICTURE_HASH;
+        m_payloadSize = 0;
+    }
     enum Method
     {
         MD5,
         CRC,
         CHECKSUM,
     } m_method;
-
     uint8_t m_digest[3][16];
-
-    void write(Bitstream& bs, const SPS& sps)
+    void writeSEI(const SPS& sps)
     {
-        m_bitIf = &bs;
-
         int planes = (sps.chromaFormatIdc != X265_CSP_I400) ? 3 : 1;
-
-        WRITE_CODE(DECODED_PICTURE_HASH, 8, "payload_type");
-
-        switch (m_method)
-        {
-        case MD5:
-            WRITE_CODE(1 + 16 * planes, 8, "payload_size");
-            WRITE_CODE(MD5, 8, "hash_type");
-            break;
-        case CRC:
-            WRITE_CODE(1 + 2 * planes, 8, "payload_size");
-            WRITE_CODE(CRC, 8, "hash_type");
-            break;
-        case CHECKSUM:
-            WRITE_CODE(1 + 4 * planes, 8, "payload_size");
-            WRITE_CODE(CHECKSUM, 8, "hash_type");
-            break;
-        }
-
+        WRITE_CODE(m_method, 8, "hash_type");
         for (int yuvIdx = 0; yuvIdx < planes; yuvIdx++)
         {
             if (m_method == MD5)
@@ -209,9 +162,11 @@
 class SEIActiveParameterSets : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return ACTIVE_PARAMETER_SETS; }
-
+    SEIActiveParameterSets()
+    {
+        m_payloadType = ACTIVE_PARAMETER_SETS;
+        m_payloadSize = 0;
+    }
     bool m_selfContainedCvsFlag;
     bool m_noParamSetUpdateFlag;
 
@@ -229,16 +184,14 @@
 class SEIBufferingPeriod : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return BUFFERING_PERIOD; }
-
     SEIBufferingPeriod()
         : m_cpbDelayOffset(0)
         , m_dpbDelayOffset(0)
         , m_auCpbRemovalDelayDelta(1)
     {
+        m_payloadType = BUFFERING_PERIOD;
+        m_payloadSize = 0;
     }
-
     bool     m_cpbDelayOffset;
     bool     m_dpbDelayOffset;
     uint32_t m_initialCpbRemovalDelay;
@@ -263,9 +216,11 @@
 class SEIPictureTiming : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return PICTURE_TIMING; }
-
+    SEIPictureTiming()
+    {
+        m_payloadType = PICTURE_TIMING;
+        m_payloadSize = 0;
+    }
     uint32_t  m_picStruct;
     uint32_t  m_sourceScanType;
     bool      m_duplicateFlag;
@@ -298,9 +253,6 @@
 class SEIRecoveryPoint : public SEI
 {
 public:
-
-    SEIPayloadType payloadType() const { return RECOVERY_POINT; }
-
     int  m_recoveryPocCnt;
     bool m_exactMatchingFlag;
     bool m_brokenLinkFlag;
@@ -318,38 +270,34 @@
 class SEICreativeIntentMeta : public SEI
 {
 public:
+    SEICreativeIntentMeta()
+    {
+        m_payloadType = USER_DATA_REGISTERED_ITU_T_T35;
+        m_payloadSize = 0;
+    }
+
     uint8_t *cim;
 
-    SEIPayloadType payloadType() const { return USER_DATA_REGISTERED_ITU_T_T35; }
-
     // daniel.vt at samsung.com :: for the Creative Intent Meta Data Encoding ( seongnam.oh at samsung.com )
-    void write(Bitstream& bs, const SPS&)
+    void writeSEI(const SPS&)
     {
         if (!cim)
-        {
             return;
-        }
 
-        m_bitIf = &bs;
-        WRITE_CODE(USER_DATA_REGISTERED_ITU_T_T35, 8, "payload_type");
         int i = 0;
-        int payloadSize = cim[0];
+        int payloadSize = m_payloadSize;
         while (cim[i] == 0xFF)
         {
             i++;
             payloadSize += cim[i];
             WRITE_CODE(0xFF, 8, "payload_size");
         }
-        WRITE_CODE((uint8_t)payloadSize, 8, "payload_size");
+        WRITE_CODE(payloadSize, 8, "payload_size");
         i++;
         payloadSize += i;
         for (; i < payloadSize; ++i)
-        {
             WRITE_CODE(cim[i], 8, "creative_intent_metadata");
-        }
-
     }
 };
-
 }
 #endif // ifndef X265_SEI_H


More information about the x265-devel mailing list