]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/utils: split side-data in new decode API too
authorwm4 <nfxjfg@googlemail.com>
Thu, 28 Apr 2016 13:34:15 +0000 (15:34 +0200)
committerwm4 <nfxjfg@googlemail.com>
Fri, 29 Apr 2016 08:35:00 +0000 (10:35 +0200)
The deprecated avcodec_decode_video2() and avcodec_decode_audio4()
functions called av_packet_split_side_data() on the input packets. This
is required for packets produced by libavformat with the
AVFMT_FLAG_KEEP_SIDE_DATA flag unset (which is unfortunately the
default).

The new API didn't do this yet, although it didn't matter as no decoder
supports the new API yet. The emulation layer for the old API calls the
old API functions, which took care of the splitting. Add this code to
the new API codec entrypoints too, because we shouldn't send essentially
corrupted data to decoders.

libavcodec/utils.c

index 21ad3cf0490335e24e4157102f1bf792ddcb62cb..ffbabb1061085f66ea750e4878f0de620c3ced87 100644 (file)
@@ -2784,11 +2784,17 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
 
     if (avctx->codec->send_packet) {
         if (avpkt) {
-            ret = apply_param_change(avctx, (AVPacket *)avpkt);
-            if (ret < 0)
-                return ret;
+            AVPacket tmp = *avpkt;
+            int did_split = av_packet_split_side_data(&tmp);
+            ret = apply_param_change(avctx, &tmp);
+            if (ret >= 0)
+                ret = avctx->codec->send_packet(avctx, &tmp);
+            if (did_split)
+                av_packet_free_side_data(&tmp);
+            return ret;
+        } else {
+            return avctx->codec->send_packet(avctx, NULL);
         }
-        return avctx->codec->send_packet(avctx, avpkt);
     }
 
     // Emulation via old API. Assume avpkt is likely not refcounted, while