[x265] sei: add user defined SEI

Deepthi Nandakumar deepthi at multicorewareinc.com
Thu Jul 14 11:23:55 CEST 2016


# HG changeset patch
# User Deepthi Nandakumar <deepthi at multicorewareinc.com>
# Date 1452163804 -19800
#      Thu Jan 07 16:20:04 2016 +0530
# Node ID 427fadf8fe2baa1713f468c6bd084d389fb18053
# Parent  70581d6cd0651e763f8c312b3c94eb42fd2c4872
sei: add user defined SEI

diff -r 70581d6cd065 -r 427fadf8fe2b source/CMakeLists.txt
--- a/source/CMakeLists.txt Wed Jul 13 19:24:37 2016 +0530
+++ b/source/CMakeLists.txt Thu Jan 07 16:20:04 2016 +0530
@@ -30,7 +30,7 @@
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)

 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 87)
+set(X265_BUILD 88)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 70581d6cd065 -r 427fadf8fe2b source/common/frame.cpp
--- a/source/common/frame.cpp Wed Jul 13 19:24:37 2016 +0530
+++ b/source/common/frame.cpp Thu Jan 07 16:20:04 2016 +0530
@@ -143,6 +143,13 @@
         delete[] m_quantOffsets;
     }

+    if (m_userSEI.numPayloads)
+    {
+        for (int i = 0; i < m_userSEI.numPayloads; i++)
+            delete[] m_userSEI.payloads[i].payload;
+        delete[] m_userSEI.payloads;
+    }
+
     m_lowres.destroy();
     X265_FREE(m_rcData);
 }
diff -r 70581d6cd065 -r 427fadf8fe2b source/common/frame.h
--- a/source/common/frame.h Wed Jul 13 19:24:37 2016 +0530
+++ b/source/common/frame.h Thu Jan 07 16:20:04 2016 +0530
@@ -85,6 +85,7 @@
     bool                   m_bChromaExtended;    // orig chroma planes
motion extended for weight analysis

     float*                 m_quantOffsets;       // points to quantOffsets
in x265_picture
+    x265_sei               m_userSEI;

     /* Frame Parallelism - notification between FrameEncoders of available
motion reference rows */
     ThreadSafeInteger      m_reconRowCount;      // count of CTU rows
completely reconstructed and extended for motion reference
diff -r 70581d6cd065 -r 427fadf8fe2b source/encoder/api.cpp
--- a/source/encoder/api.cpp Wed Jul 13 19:24:37 2016 +0530
+++ b/source/encoder/api.cpp Thu Jan 07 16:20:04 2016 +0530
@@ -282,6 +282,9 @@
     pic->colorSpace = param->internalCsp;
     pic->forceqp = X265_QP_AUTO;
     pic->quantOffsets = NULL;
+    pic->userSEI.payloads = NULL;
+    pic->userSEI.numPayloads = 0;
+
     if (param->analysisMode)
     {
         uint32_t widthInCU       = (param->sourceWidth  + g_maxCUSize - 1)
>> g_maxLog2CUSize;
diff -r 70581d6cd065 -r 427fadf8fe2b source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Wed Jul 13 19:24:37 2016 +0530
+++ b/source/encoder/encoder.cpp Thu Jan 07 16:20:04 2016 +0530
@@ -589,7 +589,20 @@
         inFrame->m_pts       = pic_in->pts;
         inFrame->m_forceqp   = pic_in->forceqp;
         inFrame->m_param     = m_reconfigure ? m_latestParam : m_param;
-
+
+        if (pic_in->userSEI.numPayloads)
+        {
+            int numPayloads = inFrame->m_userSEI.numPayloads =
pic_in->userSEI.numPayloads;
+            inFrame->m_userSEI.payloads = new
x265_sei_payload[numPayloads];
+            for (int i = 0; i < numPayloads; i++)
+            {
+                int size = inFrame->m_userSEI.payloads[i].payloadSize =
pic_in->userSEI.payloads[i].payloadSize;
+                inFrame->m_userSEI.payloads[i].payloadType =
pic_in->userSEI.payloads[i].payloadType;
+                inFrame->m_userSEI.payloads[i].payload = new uint8_t[size];
+                memcpy(inFrame->m_userSEI.payloads[i].payload,
pic_in->userSEI.payloads[i].payload, size);
+            }
+        }
+
         if (pic_in->quantOffsets != NULL)
         {
             int cuCount = inFrame->m_lowres.maxBlocksInRow *
inFrame->m_lowres.maxBlocksInCol;
diff -r 70581d6cd065 -r 427fadf8fe2b source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Wed Jul 13 19:24:37 2016 +0530
+++ b/source/encoder/frameencoder.cpp Thu Jan 07 16:20:04 2016 +0530
@@ -523,6 +523,22 @@
         m_nalList.serialize(NAL_UNIT_PREFIX_SEI, m_bs);
     }

+    /* Write user SEI */
+    for (int i = 0; i < m_frame->m_userSEI.numPayloads; i++)
+    {
+        x265_sei_payload *payload = &m_frame->m_userSEI.payloads[i];
+        SEIuserDataUnregistered sei;
+
+        sei.m_payloadType = payload->payloadType;
+        sei.m_userDataLength = payload->payloadSize;
+        sei.m_userData = payload->payload;
+
+        m_bs.resetBits();
+        sei.write(m_bs, *slice->m_sps);
+        m_bs.writeByteAlignment();
+        m_nalList.serialize(NAL_UNIT_PREFIX_SEI, m_bs);
+    }
+
     /* CQP and CRF (without capped VBV) doesn't use mid-frame statistics
to
      * tune RateControl parameters for other frames.
      * Hence, for these modes, update m_startEndOrder and unlock RC for
previous threads waiting in
diff -r 70581d6cd065 -r 427fadf8fe2b source/encoder/sei.h
--- a/source/encoder/sei.h Wed Jul 13 19:24:37 2016 +0530
+++ b/source/encoder/sei.h Thu Jan 07 16:20:04 2016 +0530
@@ -46,36 +46,7 @@

 protected:

-    enum PayloadType
-    {
-        BUFFERING_PERIOD                     = 0,
-        PICTURE_TIMING                       = 1,
-        PAN_SCAN_RECT                        = 2,
-        FILLER_PAYLOAD                       = 3,
-        USER_DATA_REGISTERED_ITU_T_T35       = 4,
-        USER_DATA_UNREGISTERED               = 5,
-        RECOVERY_POINT                       = 6,
-        SCENE_INFO                           = 9,
-        FULL_FRAME_SNAPSHOT                  = 15,
-        PROGRESSIVE_REFINEMENT_SEGMENT_START = 16,
-        PROGRESSIVE_REFINEMENT_SEGMENT_END   = 17,
-        FILM_GRAIN_CHARACTERISTICS           = 19,
-        POST_FILTER_HINT                     = 22,
-        TONE_MAPPING_INFO                    = 23,
-        FRAME_PACKING                        = 45,
-        DISPLAY_ORIENTATION                  = 47,
-        SOP_DESCRIPTION                      = 128,
-        ACTIVE_PARAMETER_SETS                = 129,
-        DECODING_UNIT_INFO                   = 130,
-        TEMPORAL_LEVEL0_INDEX                = 131,
-        DECODED_PICTURE_HASH                 = 132,
-        SCALABLE_NESTING                     = 133,
-        REGION_REFRESH_INFO                  = 134,
-        MASTERING_DISPLAY_INFO               = 137,
-        CONTENT_LIGHT_LEVEL_INFO             = 144,
-    };
-
-    virtual PayloadType payloadType() const = 0;
+    virtual SEIPayloadType payloadType() const = 0;

     virtual void writeSEI(const SPS&) { X265_CHECK(0, "empty writeSEI
method called\n");  }

@@ -86,11 +57,12 @@
 {
 public:

-    PayloadType payloadType() const { return USER_DATA_UNREGISTERED; }
+    SEIPayloadType payloadType() const { return m_payloadType; }

     SEIuserDataUnregistered() : m_userData(NULL) {}

     static const uint8_t m_uuid_iso_iec_11578[16];
+    SEIPayloadType m_payloadType;
     uint32_t m_userDataLength;
     uint8_t *m_userData;

@@ -98,7 +70,7 @@
     {
         m_bitIf = &bs;

-        WRITE_CODE(USER_DATA_UNREGISTERED, 8, "payload_type");
+        WRITE_CODE(m_payloadType, 8, "payload_type");

         uint32_t payloadSize = 16 + m_userDataLength;
         for (; payloadSize >= 0xff; payloadSize -= 0xff)
@@ -123,7 +95,7 @@
     uint32_t maxDisplayMasteringLuminance;
     uint32_t minDisplayMasteringLuminance;

-    PayloadType payloadType() const { return MASTERING_DISPLAY_INFO; }
+    SEIPayloadType payloadType() const { return MASTERING_DISPLAY_INFO; }

     bool parse(const char* value)
     {
@@ -161,7 +133,7 @@
     uint16_t max_content_light_level;
     uint16_t max_pic_average_light_level;

-    PayloadType payloadType() const { return CONTENT_LIGHT_LEVEL_INFO; }
+    SEIPayloadType payloadType() const { return CONTENT_LIGHT_LEVEL_INFO; }

     void write(Bitstream& bs, const SPS&)
     {
@@ -178,7 +150,7 @@
 {
 public:

-    PayloadType payloadType() const { return DECODED_PICTURE_HASH; }
+    SEIPayloadType payloadType() const { return DECODED_PICTURE_HASH; }

     enum Method
     {
@@ -238,7 +210,7 @@
 {
 public:

-    PayloadType payloadType() const { return ACTIVE_PARAMETER_SETS; }
+    SEIPayloadType payloadType() const { return ACTIVE_PARAMETER_SETS; }

     bool m_selfContainedCvsFlag;
     bool m_noParamSetUpdateFlag;
@@ -258,7 +230,7 @@
 {
 public:

-    PayloadType payloadType() const { return BUFFERING_PERIOD; }
+    SEIPayloadType payloadType() const { return BUFFERING_PERIOD; }

     SEIBufferingPeriod()
         : m_cpbDelayOffset(0)
@@ -292,7 +264,7 @@
 {
 public:

-    PayloadType payloadType() const { return PICTURE_TIMING; }
+    SEIPayloadType payloadType() const { return PICTURE_TIMING; }

     uint32_t  m_picStruct;
     uint32_t  m_sourceScanType;
@@ -327,7 +299,7 @@
 {
 public:

-    PayloadType payloadType() const { return RECOVERY_POINT; }
+    SEIPayloadType payloadType() const { return RECOVERY_POINT; }

     int  m_recoveryPocCnt;
     bool m_exactMatchingFlag;
diff -r 70581d6cd065 -r 427fadf8fe2b source/x265.h
--- a/source/x265.h Wed Jul 13 19:24:37 2016 +0530
+++ b/source/x265.h Thu Jan 07 16:20:04 2016 +0530
@@ -150,6 +150,55 @@
     x265_cu_stats    cuStats;
 } x265_frame_stats;

+/* Arbitrary User SEI
+ * Payload size is in bytes and the payload pointer must be non-NULL.
+ * Payload types and syntax can be found in Annex D of the H.265
Specification.
+ * SEI Payload Alignment bits as described in Annex D must be included at
the
+ * end of the payload if needed. The payload should not be
NAL-encapsulated.
+ * Payloads are written in the order of input */
+
+typedef enum
+{
+    BUFFERING_PERIOD                     = 0,
+    PICTURE_TIMING                       = 1,
+    PAN_SCAN_RECT                        = 2,
+    FILLER_PAYLOAD                       = 3,
+    USER_DATA_REGISTERED_ITU_T_T35       = 4,
+    USER_DATA_UNREGISTERED               = 5,
+    RECOVERY_POINT                       = 6,
+    SCENE_INFO                           = 9,
+    FULL_FRAME_SNAPSHOT                  = 15,
+    PROGRESSIVE_REFINEMENT_SEGMENT_START = 16,
+    PROGRESSIVE_REFINEMENT_SEGMENT_END   = 17,
+    FILM_GRAIN_CHARACTERISTICS           = 19,
+    POST_FILTER_HINT                     = 22,
+    TONE_MAPPING_INFO                    = 23,
+    FRAME_PACKING                        = 45,
+    DISPLAY_ORIENTATION                  = 47,
+    SOP_DESCRIPTION                      = 128,
+    ACTIVE_PARAMETER_SETS                = 129,
+    DECODING_UNIT_INFO                   = 130,
+    TEMPORAL_LEVEL0_INDEX                = 131,
+    DECODED_PICTURE_HASH                 = 132,
+    SCALABLE_NESTING                     = 133,
+    REGION_REFRESH_INFO                  = 134,
+    MASTERING_DISPLAY_INFO               = 137,
+    CONTENT_LIGHT_LEVEL_INFO             = 144,
+} SEIPayloadType;
+
+typedef struct x265_sei_payload
+{
+    int payloadSize;
+    SEIPayloadType payloadType;
+    uint8_t* payload;
+} x265_sei_payload;
+
+typedef struct x265_sei
+{
+    int numPayloads;
+    x265_sei_payload *payloads;
+} x265_sei;
+
 /* Used to pass pictures into the encoder, and to get picture data back
out of
  * the encoder.  The input and output semantics are different */
 typedef struct x265_picture
@@ -221,6 +270,9 @@
     /* Frame level statistics */
     x265_frame_stats frameData;

+    /* User defined SEI */
+    x265_sei         userSEI;
+
     /* Ratecontrol statistics for collecting the ratecontrol information.
      * It is not used for collecting the last pass ratecontrol data in
      * multi pass ratecontrol mode. */


-- 
Deepthi Nandakumar
Engineering Manager, x265
Multicoreware, Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20160714/b9938cd0/attachment-0001.html>


More information about the x265-devel mailing list