<div dir="ltr">From 167bb877747d48f7ff6d8fdda7e2990f955073d0 Mon Sep 17 00:00:00 2001<br>From: AnusuyaKumarasamy <<a href="mailto:anusuya.kumarasamy@multicorewareinc.com" target="_blank">anusuya.kumarasamy@multicorewareinc.com</a>><br>Date: Fri, 12 Jul 2024 17:38:41 +0530<br>Subject: [PATCH] Add MV sei's<br><br>---<br> source/encoder/encoder.cpp |  18 ++++<br> source/encoder/sei.h       | 187 +++++++++++++++++++++++++++++++++++++<br> source/x265.h              |   4 +<br> 3 files changed, 209 insertions(+)<br><br>diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp<br>index 8a1ed9d88..7f4e4b3eb 100644<br>--- a/source/encoder/encoder.cpp<br>+++ b/source/encoder/encoder.cpp<br>@@ -3373,6 +3373,24 @@ void Encoder::getStreamHeaders(NALList& list, Entropy& sbacCoder, Bitstream& bs)<br>     }<br> #endif<br> <br>+<br>+#if ENABLE_MULTIVIEW<br>+    if (m_param->numViews > 1)<br>+    {<br>+        SEIThreeDimensionalReferenceDisplaysInfo m_multiview_1;<br>+        m_multiview_1.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal, 0);<br>+<br>+        SEIMultiviewSceneInfo m_multiview_2;<br>+        m_multiview_2.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal, 0);<br>+<br>+        SEIMultiviewAcquisitionInfo m_multiview_3;<br>+        m_multiview_3.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal, 0);<br>+<br>+        SEIMultiviewViewPosition m_multiview_4;<br>+        m_multiview_4.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal, 0);<br>+    }<br>+#endif<br>+<br>     if (m_param->bSingleSeiNal)<br>         bs.resetBits();<br> <br>diff --git a/source/encoder/sei.h b/source/encoder/sei.h<br>index d54e85a00..e357a1bf5 100644<br>--- a/source/encoder/sei.h<br>+++ b/source/encoder/sei.h<br>@@ -224,6 +224,193 @@ public:<br> };<br> #endif<br> <br>+#if ENABLE_MULTIVIEW<br>+class SEIThreeDimensionalReferenceDisplaysInfo : public SEI<br>+{<br>+public:<br>+    SEIThreeDimensionalReferenceDisplaysInfo()<br>+    {<br>+        m_payloadType = THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO;<br>+        m_payloadSize = 0;<br>+    }<br>+<br>+    int  m_numRefDisplaysMinus1 = 0;<br>+    bool m_refViewingDistanceFlag = false;<br>+    bool m_additionalShiftPresentFlag = false;<br>+    void writeSEI(const SPS&)<br>+    {<br>+        WRITE_UVLC(31, "prec_ref_display_width");<br>+        WRITE_FLAG(m_refViewingDistanceFlag, "ref_viewing_distance_flag");<br>+        if (m_refViewingDistanceFlag)<br>+        {<br>+            WRITE_UVLC(0, "prec_ref_viewing_dist");<br>+        }<br>+        WRITE_UVLC(0, "num_ref_displays_minus1");<br>+        for (int i = 0; i <= m_numRefDisplaysMinus1; i++)<br>+        {<br>+            WRITE_UVLC(0, "left_view_id");<br>+            WRITE_UVLC(1, "right_view_id");<br>+            WRITE_CODE(0, 6, "exponent_ref_display_width");<br>+            WRITE_CODE(0, 2, "mantissa_ref_display_width");<br>+            if (m_refViewingDistanceFlag)<br>+            {<br>+                WRITE_CODE(0, 6, "exponent_ref_viewing_distance");<br>+                WRITE_CODE(0, 1, "mantissa_ref_viewing_distance");<br>+            }<br>+            WRITE_FLAG(m_additionalShiftPresentFlag, "additional_shift_present_flag");<br>+            if (m_additionalShiftPresentFlag)<br>+            {<br>+                WRITE_CODE(0, 10, "num_sample_shift_plus512");<br>+            }<br>+        }<br>+        WRITE_FLAG(0, "three_dimensional_reference_displays_extension_flag");<br>+<br>+        if (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+        {<br>+            WRITE_FLAG(1, "payload_bit_equal_to_one");<br>+            while (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+            {<br>+                WRITE_FLAG(0, "payload_bit_equal_to_zero");<br>+            }<br>+        }<br>+    }<br>+<br>+};<br>+<br>+class SEIMultiviewSceneInfo : public SEI<br>+{<br>+public:<br>+    SEIMultiviewSceneInfo()<br>+    {<br>+        m_payloadType = MULTIVIEW_SCENE_INFO;<br>+        m_payloadSize = 0;<br>+    }<br>+    void writeSEI(const SPS&)<br>+    {<br>+        WRITE_SVLC(-333, "min_disparity");<br>+        WRITE_UVLC(2047, "max_disparity_range");<br>+<br>+        if (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+        {<br>+            WRITE_FLAG(1, "payload_bit_equal_to_one");<br>+            while (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+            {<br>+                WRITE_FLAG(0, "payload_bit_equal_to_zero");<br>+            }<br>+        }<br>+    }<br>+};<br>+<br>+class SEIMultiviewAcquisitionInfo : public SEI<br>+{<br>+public:<br>+    SEIMultiviewAcquisitionInfo()<br>+    {<br>+        m_payloadType = MULTIVIEW_ACQUISITION_INFO;<br>+        m_payloadSize = 0;<br>+    }<br>+<br>+    int sign_r[3][3] = { {0,1,0},{1,0,0},{0,1,1} };<br>+    int exponent_r[3][3] = { {10,20,11},{10,5,11},{2,20,11} };<br>+    int mantissa_r[3][3] = { {4,9,1},{0,3,4},{3,3,7} };<br>+    int sign_t[1][3] = { 0,1,0 };<br>+    int exponent_t[1][3] = { 0,10,5 };<br>+    int mantissa_t[1][3] = { 1,8,9 };<br>+    int lenght_mantissa_r[3][3] = { {10,20,11},{10,5,11},{2,20,11} };<br>+    int length_mantissa_t[1][3] = { 1,10,5 };<br>+    bool m_intrinsicParamFlag = true;<br>+    bool m_extrinsicParamFlag = true;<br>+    bool m_intrinsicParamsEqualFlag = true;<br>+    void writeSEI(const SPS& sps)<br>+    {<br>+        WRITE_FLAG(m_intrinsicParamFlag, "intrinsic_param_flag");<br>+        WRITE_FLAG(m_extrinsicParamFlag, "extrinsic_param_flag");<br>+        if (m_intrinsicParamFlag)<br>+        {<br>+            WRITE_FLAG(m_intrinsicParamsEqualFlag, "intrinsic_params_equal_flag");<br>+            WRITE_UVLC(31, "prec_focal_length");<br>+            WRITE_UVLC(31, "prec_principal_point");<br>+            WRITE_UVLC(31, "prec_skew_factor");<br>+<br>+            for (int i = 0; i <= (m_intrinsicParamsEqualFlag ? 0 : sps.maxViews - 1); i++)<br>+            {<br>+                WRITE_FLAG(0, "sign_focal_length_x");<br>+                WRITE_CODE(0, 6, "exponent_focal_length_x");<br>+                WRITE_CODE(0, 1, "mantissa_focal_length_x");<br>+                WRITE_FLAG(0, "sign_focal_length_y");<br>+                WRITE_CODE(0, 6, "exponent_focal_length_y");<br>+                WRITE_CODE(0, 1, "mantissa_focal_length_y");<br>+                WRITE_FLAG(0, "sign_principal_point_x");<br>+                WRITE_CODE(0, 6, "exponent_principal_point_x");<br>+                WRITE_CODE(0, 1, "mantissa_principal_point_x");<br>+                WRITE_FLAG(0, "sign_principal_point_y");<br>+                WRITE_CODE(0, 6, "exponent_principal_point_y");<br>+                WRITE_CODE(0, 1, "mantissa_principal_point_y");<br>+                WRITE_FLAG(0, "sign_skew_factor");<br>+                WRITE_CODE(0, 6, "exponent_skew_factor");<br>+                WRITE_CODE(0, 1, "mantissa_skew_factor");<br>+            }<br>+        }<br>+<br>+        if (m_extrinsicParamFlag)<br>+        {<br>+            WRITE_UVLC(31, "prec_rotation_param");<br>+            WRITE_UVLC(31, "prec_translation_param");<br>+            for (int i = 0; i <= 0; i++)<br>+            {<br>+                for (int j = 0; j <= 2; j++)  /* row */<br>+                {<br>+                    for (int k = 0; k <= 2; k++)  /* column */<br>+                    {<br>+                        WRITE_FLAG(sign_r[j][k], "sign_r");<br>+                        WRITE_CODE(exponent_r[j][k], 6, "exponent_r");<br>+                        WRITE_CODE(mantissa_r[j][k], lenght_mantissa_r[j][k], "mantissa_r");<br>+                    }<br>+                    WRITE_FLAG(sign_t[i][j], "sign_t");<br>+                    WRITE_CODE(exponent_t[i][j], 6, "exponent_t");<br>+                    WRITE_CODE(mantissa_t[i][j], length_mantissa_t[i][j], "mantissa_t");<br>+                }<br>+            }<br>+        }<br>+        if (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+        {<br>+            WRITE_FLAG(1, "payload_bit_equal_to_one");<br>+            while (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+            {<br>+                WRITE_FLAG(0, "payload_bit_equal_to_zero");<br>+            }<br>+        }<br>+    }<br>+};<br>+<br>+class SEIMultiviewViewPosition : public SEI<br>+{<br>+public:<br>+    SEIMultiviewViewPosition()<br>+    {<br>+        m_payloadType = MULTIVIEW_VIEW_POSITION;<br>+        m_payloadSize = 0;<br>+    }<br>+    void writeSEI(const SPS& sps)<br>+    {<br>+        WRITE_UVLC(sps.maxViews - 1, "num_views_minus1");<br>+        for (int i = 0; i <= sps.maxViews - 1; i++)<br>+        {<br>+            WRITE_UVLC(!i, "view_position");<br>+        }<br>+<br>+        if (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+        {<br>+            WRITE_FLAG(1, "payload_bit_equal_to_one");<br>+            while (m_bitIf->getNumberOfWrittenBits() % X265_BYTE != 0)<br>+            {<br>+                WRITE_FLAG(0, "payload_bit_equal_to_zero");<br>+            }<br>+        }<br>+    }<br>+};<br>+#endif<br>+<br> class SEIMasteringDisplayColorVolume : public SEI<br> {<br> public:<br>diff --git a/source/x265.h b/source/x265.h<br>index 49880d0f3..1b685e3c1 100644<br>--- a/source/x265.h<br>+++ b/source/x265.h<br>@@ -372,6 +372,10 @@ typedef enum<br>     CONTENT_LIGHT_LEVEL_INFO             = 144,<br>     ALTERNATIVE_TRANSFER_CHARACTERISTICS = 147,<br>     ALPHA_CHANNEL_INFO                   = 165,<br>+    THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO = 176,<br>+    MULTIVIEW_SCENE_INFO                 = 178,<br>+    MULTIVIEW_ACQUISITION_INFO           = 179,<br>+    MULTIVIEW_VIEW_POSITION              = 180<br> } SEIPayloadType;<br> <br> typedef struct x265_sei_payload<br>-- <br>2.36.0.windows.1<br><br></div>