[FFmpeg-devel] [PATCH] avcodec/hevc_parser: use avpriv_find_start_code in hevc_split()

zhaoxiu.zeng zhaoxiu.zeng at gmail.com
Mon Mar 9 17:57:57 CET 2015


在 2015/3/8 20:14, Michael Niedermayer 写道:
> On Sat, Mar 07, 2015 at 11:47:08PM +0800, zhaoxiu.zeng wrote:
>> From ab12e3081ba987c2e05d819be97cde96952f1c2a Mon Sep 17 00:00:00 2001
>> From: Zeng Zhaoxiu <zhaoxiu.zeng at gmail.com>
>> Date: Sat, 7 Mar 2015 23:29:46 +0800
>> Subject: [PATCH 1/1] avcodec/hevc_parser: use avpriv_find_start_code in
>>  hevc_split()
>>
>> Signed-off-by: Zeng Zhaoxiu <zhaoxiu.zeng at gmail.com>
>> ---
>>  libavcodec/hevc_parser.c | 26 +++++++++++++-------------
>>  1 file changed, 13 insertions(+), 13 deletions(-)
>>
>> diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c
>> index a6fdbb7..91fc0d4 100644
>> --- a/libavcodec/hevc_parser.c
>> +++ b/libavcodec/hevc_parser.c
>> @@ -286,21 +286,21 @@ static int hevc_parse(AVCodecParserContext *s,
>>  // Split after the parameter sets at the beginning of the stream if they exist.
>>  static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
>>  {
>> -    int i;
>> +    const uint8_t *ptr = buf, end = buf + buf_size;
> 
> end is a uint8_t, that will not work
> also please make sure to test the code you change
> 

Sorry for my carelessness. (I tested with "make fate" only)
Thanks!

> [...]
> 
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 

The new patch:

diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c
index a6fdbb7..7076897 100644
--- a/libavcodec/hevc_parser.c
+++ b/libavcodec/hevc_parser.c
@@ -286,21 +286,21 @@ static int hevc_parse(AVCodecParserContext *s,
 // Split after the parameter sets at the beginning of the stream if they exist.
 static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 {
-    int i;
+    const uint8_t *ptr = buf, *end = buf + buf_size;
     uint32_t state = -1;
-    int has_ps = 0;
+    int has_ps = 0, nut;
 
-    for (i = 0; i < buf_size; i++) {
-        state = (state << 8) | buf[i];
-        if (((state >> 8) & 0xFFFFFF) == START_CODE) {
-            int nut = (state >> 1) & 0x3F;
-            if (nut >= NAL_VPS && nut <= NAL_PPS)
-                has_ps = 1;
-            else if (has_ps)
-                return i - 3;
-            else // no parameter set at the beginning of the stream
-                return 0;
-        }
+    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;
     }
     return 0;
 }



More information about the ffmpeg-devel mailing list