vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Fri Jan 12 
13:57:26 2018 +0100| [0f4ff78ab5751acf5ee5b326dd667c89acd79c07] | committer: 
Thomas Guillem

codec: videotoolbox: store multiple sei for slice parsing

Signed-off-by: Thomas Guillem <tho...@gllm.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0f4ff78ab5751acf5ee5b326dd667c89acd79c07
---

 modules/codec/videotoolbox.m | 40 ++++++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 370cb787ce..7af8a1c860 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -140,6 +140,7 @@ struct frame_info_t
 #pragma mark - decoder structure
 
 #define H264_MAX_DPB 16
+#define VT_MAX_SEI_COUNT 16
 
 struct decoder_sys_t
 {
@@ -250,7 +251,12 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const 
block_t *p_block,
                        p_sys->hh.i_nal_length_size);
 
     const uint8_t *p_nal; size_t i_nal;
-    const uint8_t *p_sei_nal = NULL; size_t i_sei_nal = 0;
+    struct
+    {
+        const uint8_t *p_nal;
+        size_t i_nal;
+    } sei_array[VT_MAX_SEI_COUNT];
+    size_t i_sei_count = 0;
     while(hxxx_iterate_next(&itctx, &p_nal, &i_nal))
     {
         if(i_nal < 2)
@@ -293,8 +299,9 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const 
block_t *p_block,
                 sei.p_sps = p_sps;
                 sei.i_pic_struct = UINT8_MAX;
 
-                if(p_sei_nal)
-                    HxxxParseSEI(p_sei_nal, i_sei_nal, 1, ParseH264SEI, &sei);
+                for(size_t i=0; i<i_sei_count; i++)
+                    HxxxParseSEI(sei_array[i].p_nal, sei_array[i].i_nal, 1,
+                                 ParseH264SEI, &sei);
 
                 p_info->i_num_ts = h264_get_num_ts(p_sps, &slice, 
sei.i_pic_struct,
                                                    p_info->i_foc, bFOC);
@@ -316,8 +323,11 @@ static bool FillReorderInfoH264(decoder_t *p_dec, const 
block_t *p_block,
         }
         else if(i_nal_type == H264_NAL_SEI)
         {
-            p_sei_nal = p_nal;
-            i_sei_nal = i_nal;
+            if(i_sei_count < VT_MAX_SEI_COUNT)
+            {
+                sei_array[i_sei_count].p_nal = p_nal;
+                sei_array[i_sei_count++].i_nal = i_nal;
+            }
         }
     }
 
@@ -584,7 +594,13 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const 
block_t *p_block,
                        p_sys->hh.i_nal_length_size);
 
     const uint8_t *p_nal; size_t i_nal;
-    const uint8_t *p_sei_nal = NULL; size_t i_sei_nal = 0;
+    struct
+    {
+        const uint8_t *p_nal;
+        size_t i_nal;
+    } sei_array[VT_MAX_SEI_COUNT];
+    size_t i_sei_count = 0;
+
     while(hxxx_iterate_next(&itctx, &p_nal, &i_nal))
     {
         if(i_nal < 2 || hevc_getNALLayer(p_nal) > 0)
@@ -620,8 +636,9 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const 
block_t *p_block,
                 const int POC = hevc_compute_picture_order_count(p_sps, p_sli,
                                                                  
&p_sys->hevc_pocctx);
 
-                if(p_sei_nal)
-                    HxxxParseSEI(p_sei_nal, i_sei_nal, 1, ParseHEVCSEI, &sei);
+                for(size_t i=0; i<i_sei_count; i++)
+                    HxxxParseSEI(sei_array[i].p_nal, sei_array[i].i_nal,
+                                 1, ParseHEVCSEI, &sei);
 
                 p_info->i_poc = POC;
                 p_info->i_foc = POC; /* clearly looks wrong :/ */
@@ -648,8 +665,11 @@ static bool FillReorderInfoHEVC(decoder_t *p_dec, const 
block_t *p_block,
         }
         else if(i_nal_type == HEVC_NAL_PREF_SEI)
         {
-            p_sei_nal = p_nal;
-            i_sei_nal = i_nal;
+            if(i_sei_count < VT_MAX_SEI_COUNT)
+            {
+                sei_array[i_sei_count].p_nal = p_nal;
+                sei_array[i_sei_count++].i_nal = i_nal;
+            }
         }
     }
 

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to