avcodec/hevc_parser: fix split function of parser
authorRainer Hochecker <fernetmenta@online.de>
Tue, 1 Sep 2015 14:27:02 +0000 (16:27 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Wed, 2 Sep 2015 00:48:43 +0000 (02:48 +0200)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavcodec/hevc_parser.c

index f970de5..35cace5 100644 (file)
@@ -410,19 +410,30 @@ static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 {
     const uint8_t *ptr = buf, *end = buf + buf_size;
     uint32_t state = -1;
-    int has_ps = 0, nut;
+    int has_vps = 0;
+    int has_sps = 0;
+    int has_pps = 0;
+    int nut;
 
     while (ptr < end) {
         ptr = avpriv_find_start_code(ptr, end, &state);
         if ((state >> 8) != START_CODE)
             break;
         nut = (state >> 1) & 0x3F;
-        if (nut >= NAL_VPS && nut <= NAL_PPS)
-            has_ps = 1;
-        else if (has_ps)
-            return ptr - 4 - buf;
-        else // no parameter set at the beginning of the stream
-            return 0;
+        if (nut == NAL_VPS)
+            has_vps = 1;
+        else if (nut == NAL_SPS)
+            has_sps = 1;
+        else if (nut == NAL_PPS)
+            has_pps = 1;
+        else if ((nut != NAL_SEI_PREFIX || has_pps) &&
+                  nut != NAL_AUD) {
+            if (has_vps && has_sps) {
+                while (ptr - 4 > buf && ptr[-5] == 0)
+                    ptr--;
+                return ptr - 4 - buf;
+            }
+        }
     }
     return 0;
 }