OSDN Git Service

h264_mp4toannexb_bsf: do not fail on annex B extradata
authorAnton Khirnov <anton@khirnov.net>
Tue, 19 Apr 2016 17:37:49 +0000 (19:37 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 24 Apr 2016 08:06:23 +0000 (10:06 +0200)
Just pass through the bitstream as is. This is the same as what is done
for HEVC already.

libavcodec/h264_mp4toannexb_bsf.c

index c1e2a28..c65aaeb 100644 (file)
@@ -131,10 +131,16 @@ static int h264_extradata_to_annexb(AVBSFContext *ctx, const int padding)
 static int h264_mp4toannexb_init(AVBSFContext *ctx)
 {
     H264BSFContext *s = ctx->priv_data;
+    int extra_size = ctx->par_in->extradata_size;
     int ret;
 
     /* retrieve sps and pps NAL units from extradata */
-    if (ctx->par_in->extradata_size >= 6) {
+    if (!extra_size                                               ||
+        (extra_size >= 3 && AV_RB24(ctx->par_in->extradata) == 1) ||
+        (extra_size >= 4 && AV_RB32(ctx->par_in->extradata) == 1)) {
+        av_log(ctx, AV_LOG_VERBOSE,
+               "The input looks like it is Annex B already\n");
+    } else if (extra_size >= 6) {
         ret = h264_extradata_to_annexb(ctx, AV_INPUT_BUFFER_PADDING_SIZE);
         if (ret < 0)
             return ret;
@@ -142,6 +148,9 @@ static int h264_mp4toannexb_init(AVBSFContext *ctx)
         s->length_size      = ret;
         s->first_idr        = 1;
         s->extradata_parsed = 1;
+    } else {
+        av_log(ctx, AV_LOG_ERROR, "Invalid extradata size: %d\n", extra_size);
+        return AVERROR_INVALIDDATA;
     }
 
     return 0;