From 7a00bbad2100367481240e62876b941b5c4befdc Mon Sep 17 00:00:00 2001
From: Thilo Borgmann <thilo.borgmann@googlemail.com>
Date: Tue, 7 Apr 2009 15:59:50 +0000
Subject: [PATCH] Implement avcodec_decode_video2(), _audio3() and _subtitle2()
 which takes an AVPacket argument rather than a const uint8_t *buf + int
 buf_size. This allows passing of packet-specific flags from demuxer to
 decoder, such as the keyframe flag, which appears necessary to playback
 corePNG P-frames.

Patch by Thilo Borgmann thilo.borgmann googlemail com, see also the thread
"Google Summer of Code participation" on the mailinglist.

Originally committed as revision 18351 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavcodec/4xm.c                |  4 +-
 libavcodec/8bps.c               |  4 +-
 libavcodec/8svx.c               |  4 +-
 libavcodec/aac.c                |  4 +-
 libavcodec/aasc.c               |  4 +-
 libavcodec/ac3dec.c             |  4 +-
 libavcodec/adpcm.c              |  4 +-
 libavcodec/adxdec.c             |  4 +-
 libavcodec/alac.c               |  4 +-
 libavcodec/apedec.c             |  4 +-
 libavcodec/asv1.c               |  4 +-
 libavcodec/atrac3.c             |  4 +-
 libavcodec/avcodec.h            | 92 ++++++++++++++++++++++++++-------
 libavcodec/avs.c                |  4 +-
 libavcodec/bethsoftvideo.c      |  4 +-
 libavcodec/bfi.c                |  5 +-
 libavcodec/bmp.c                |  4 +-
 libavcodec/c93.c                |  4 +-
 libavcodec/cavsdec.c            |  4 +-
 libavcodec/cinepak.c            |  4 +-
 libavcodec/cljr.c               |  4 +-
 libavcodec/cook.c               |  4 +-
 libavcodec/cscd.c               |  4 +-
 libavcodec/cyuv.c               |  4 +-
 libavcodec/dca.c                |  4 +-
 libavcodec/dnxhddec.c           |  4 +-
 libavcodec/dpcm.c               |  4 +-
 libavcodec/dsicinav.c           |  8 ++-
 libavcodec/dv.c                 |  4 +-
 libavcodec/dvbsubdec.c          |  4 +-
 libavcodec/dvdsubdec.c          |  4 +-
 libavcodec/dxa.c                |  4 +-
 libavcodec/eacmv.c              |  4 +-
 libavcodec/eatgq.c              |  4 +-
 libavcodec/eatgv.c              |  4 +-
 libavcodec/eatqi.c              |  4 +-
 libavcodec/escape124.c          |  4 +-
 libavcodec/ffv1.c               |  4 +-
 libavcodec/flacdec.c            |  4 +-
 libavcodec/flashsv.c            |  4 +-
 libavcodec/flicvideo.c          |  4 +-
 libavcodec/fraps.c              |  4 +-
 libavcodec/g726.c               |  4 +-
 libavcodec/gifdec.c             |  4 +-
 libavcodec/h261dec.c            |  4 +-
 libavcodec/h263dec.c            |  4 +-
 libavcodec/h264.c               |  4 +-
 libavcodec/huffyuv.c            |  4 +-
 libavcodec/idcinvideo.c         |  4 +-
 libavcodec/imc.c                |  4 +-
 libavcodec/indeo2.c             |  4 +-
 libavcodec/indeo3.c             |  4 +-
 libavcodec/interplayvideo.c     |  4 +-
 libavcodec/kmvc.c               |  5 +-
 libavcodec/lcldec.c             |  4 +-
 libavcodec/libamr.c             |  8 ++-
 libavcodec/libdiracdec.c        |  4 +-
 libavcodec/libfaad.c            |  4 +-
 libavcodec/libgsm.c             |  4 +-
 libavcodec/libopenjpeg.c        |  4 +-
 libavcodec/libschroedingerdec.c |  4 +-
 libavcodec/libspeexdec.c        |  4 +-
 libavcodec/loco.c               |  4 +-
 libavcodec/mace.c               |  4 +-
 libavcodec/mdec.c               |  4 +-
 libavcodec/mimic.c              |  4 +-
 libavcodec/mjpegbdec.c          |  4 +-
 libavcodec/mjpegdec.c           |  4 +-
 libavcodec/mjpegdec.h           |  2 +-
 libavcodec/mlpdec.c             |  4 +-
 libavcodec/mmvideo.c            |  4 +-
 libavcodec/motionpixels.c       |  4 +-
 libavcodec/mpc7.c               |  4 +-
 libavcodec/mpc8.c               |  4 +-
 libavcodec/mpeg12.c             |  4 +-
 libavcodec/mpegaudiodec.c       | 12 +++--
 libavcodec/mpegvideo.h          |  2 +-
 libavcodec/msrle.c              |  4 +-
 libavcodec/msvideo1.c           |  4 +-
 libavcodec/nellymoserdec.c      |  4 +-
 libavcodec/nuv.c                |  4 +-
 libavcodec/pcm.c                |  4 +-
 libavcodec/pcx.c                |  4 +-
 libavcodec/pngdec.c             |  4 +-
 libavcodec/pnmenc.c             |  4 +-
 libavcodec/ptx.c                |  4 +-
 libavcodec/qcelpdec.c           |  4 +-
 libavcodec/qdm2.c               |  4 +-
 libavcodec/qdrw.c               |  4 +-
 libavcodec/qpeg.c               |  4 +-
 libavcodec/qtrle.c              |  4 +-
 libavcodec/ra144.c              |  4 +-
 libavcodec/ra288.c              |  5 +-
 libavcodec/rawdec.c             |  4 +-
 libavcodec/rl2.c                |  4 +-
 libavcodec/roqvideodec.c        |  4 +-
 libavcodec/rpza.c               |  4 +-
 libavcodec/rv10.c               |  4 +-
 libavcodec/rv34.c               |  4 +-
 libavcodec/rv34.h               |  2 +-
 libavcodec/sgidec.c             |  4 +-
 libavcodec/shorten.c            |  4 +-
 libavcodec/smacker.c            |  8 ++-
 libavcodec/smc.c                |  4 +-
 libavcodec/snow.c               |  4 +-
 libavcodec/sonic.c              |  4 +-
 libavcodec/sp5xdec.c            | 10 +++-
 libavcodec/sunrast.c            |  4 +-
 libavcodec/svq1dec.c            |  4 +-
 libavcodec/svq3.c               |  4 +-
 libavcodec/targa.c              |  4 +-
 libavcodec/tiertexseqv.c        |  4 +-
 libavcodec/tiff.c               |  4 +-
 libavcodec/truemotion1.c        |  4 +-
 libavcodec/truemotion2.c        |  4 +-
 libavcodec/truespeech.c         |  4 +-
 libavcodec/tscc.c               |  4 +-
 libavcodec/tta.c                |  4 +-
 libavcodec/txd.c                |  4 +-
 libavcodec/ulti.c               |  4 +-
 libavcodec/utils.c              | 54 ++++++++++++++++---
 libavcodec/vb.c                 |  4 +-
 libavcodec/vc1.c                |  4 +-
 libavcodec/vcr1.c               |  4 +-
 libavcodec/vmdav.c              |  8 ++-
 libavcodec/vmnc.c               |  4 +-
 libavcodec/vorbis_dec.c         |  4 +-
 libavcodec/vp3.c                |  4 +-
 libavcodec/vqavideo.c           |  4 +-
 libavcodec/wavpack.c            |  4 +-
 libavcodec/wmadec.c             |  4 +-
 libavcodec/wnv1.c               |  4 +-
 libavcodec/ws-snd1.c            |  4 +-
 libavcodec/xan.c                |  4 +-
 libavcodec/xl.c                 |  4 +-
 libavcodec/xsubdec.c            |  4 +-
 libavcodec/zmbv.c               |  4 +-
 137 files changed, 541 insertions(+), 172 deletions(-)

diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c
index 5c96baaf3f2..dd7daa5addd 100644
--- a/libavcodec/4xm.c
+++ b/libavcodec/4xm.c
@@ -677,8 +677,10 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FourXContext * const f = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame *p, temp;
diff --git a/libavcodec/8bps.c b/libavcodec/8bps.c
index 03b7ffd4199..47c90c9fe28 100644
--- a/libavcodec/8bps.c
+++ b/libavcodec/8bps.c
@@ -58,8 +58,10 @@ typedef struct EightBpsContext {
  * Decode a frame
  *
  */
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+        const uint8_t *buf = avpkt->data;
+        int buf_size = avpkt->size;
         EightBpsContext * const c = avctx->priv_data;
         const unsigned char *encoded = buf;
         unsigned char *pixptr, *pixptr_end;
diff --git a/libavcodec/8svx.c b/libavcodec/8svx.c
index 3a69f3d7473..c139e5d40b3 100644
--- a/libavcodec/8svx.c
+++ b/libavcodec/8svx.c
@@ -42,8 +42,10 @@ static const int16_t exponential[16] = { -128<<8, -64<<8, -32<<8, -16<<8, -8<<8,
 
 /** decode a frame */
 static int eightsvx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     EightSvxContext *esc = avctx->priv_data;
     int16_t *out_data = data;
     int consumed = buf_size;
diff --git a/libavcodec/aac.c b/libavcodec/aac.c
index dcd560d0ccc..7ba3d946fc8 100644
--- a/libavcodec/aac.c
+++ b/libavcodec/aac.c
@@ -1604,7 +1604,9 @@ static int parse_adts_frame_header(AACContext * ac, GetBitContext * gb) {
     return size;
 }
 
-static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data_size, const uint8_t * buf, int buf_size) {
+static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data_size, AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AACContext * ac = avccontext->priv_data;
     ChannelElement * che = NULL;
     GetBitContext gb;
diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c
index 1f667801543..daabb2cd306 100644
--- a/libavcodec/aasc.c
+++ b/libavcodec/aasc.c
@@ -59,8 +59,10 @@ static av_cold int aasc_decode_init(AVCodecContext *avctx)
 
 static int aasc_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AascContext *s = avctx->priv_data;
     int compr, i, stride;
 
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 766b262e492..854a38f32b2 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -1226,8 +1226,10 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
  * Decode a single AC-3 frame.
  */
 static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AC3DecodeContext *s = avctx->priv_data;
     int16_t *out_samples = (int16_t *)data;
     int blk, ch, err;
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 994c0c68650..7ddd72375a9 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -877,8 +877,10 @@ static void xa_decode(short *out, const unsigned char *in,
 
 static int adpcm_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     ADPCMContext *c = avctx->priv_data;
     ADPCMChannelStatus *cs;
     int n, m, channel, i;
diff --git a/libavcodec/adxdec.c b/libavcodec/adxdec.c
index 0af26013bbd..94ee793cfa8 100644
--- a/libavcodec/adxdec.c
+++ b/libavcodec/adxdec.c
@@ -104,8 +104,10 @@ static int adx_decode_header(AVCodecContext *avctx,const unsigned char *buf,size
 
 static int adx_decode_frame(AVCodecContext *avctx,
                 void *data, int *data_size,
-                const uint8_t *buf0, int buf_size)
+                AVPacket *avpkt)
 {
+    const uint8_t *buf0 = avpkt->data;
+    int buf_size = avpkt->size;
     ADXContext *c = avctx->priv_data;
     short *samples = data;
     const uint8_t *buf = buf0;
diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index 436329f5608..b9715eef850 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -400,8 +400,10 @@ static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS],
 
 static int alac_decode_frame(AVCodecContext *avctx,
                              void *outbuffer, int *outputsize,
-                             const uint8_t *inbuffer, int input_buffer_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *inbuffer = avpkt->data;
+    int input_buffer_size = avpkt->size;
     ALACContext *alac = avctx->priv_data;
 
     int channels;
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index 59be99694e4..0305d7b4ecf 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -806,8 +806,10 @@ static void ape_unpack_stereo(APEContext * ctx, int count)
 
 static int ape_decode_frame(AVCodecContext * avctx,
                             void *data, int *data_size,
-                            const uint8_t * buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     APEContext *s = avctx->priv_data;
     int16_t *samples = data;
     int nblocks;
diff --git a/libavcodec/asv1.c b/libavcodec/asv1.c
index 76268731331..81dc18daccf 100644
--- a/libavcodec/asv1.c
+++ b/libavcodec/asv1.c
@@ -387,8 +387,10 @@ static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     ASV1Context * const a = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&a->picture;
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
index bdb8a8a8d4d..811dc4fe0c4 100644
--- a/libavcodec/atrac3.c
+++ b/libavcodec/atrac3.c
@@ -878,7 +878,9 @@ static int decodeFrame(ATRAC3Context *q, const uint8_t* databuf)
 
 static int atrac3_decode_frame(AVCodecContext *avctx,
             void *data, int *data_size,
-            const uint8_t *buf, int buf_size) {
+            AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     ATRAC3Context *q = avctx->priv_data;
     int result = 0, i;
     const uint8_t* databuf;
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 1414c945b12..1d1b9310f60 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2429,8 +2429,7 @@ typedef struct AVCodec {
     int (*init)(AVCodecContext *);
     int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
     int (*close)(AVCodecContext *);
-    int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,
-                  const uint8_t *buf, int buf_size);
+    int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
     /**
      * Codec capabilities.
      * see CODEC_CAP_*
@@ -3020,26 +3019,45 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v
  */
 int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 /**
  * Decodes an audio frame from \p buf into \p samples.
- * The avcodec_decode_audio2() function decodes an audio frame from the input
- * buffer \p buf of size \p buf_size. To decode it, it makes use of the
+ * Wrapper function which calls avcodec_decode_audio3.
+ *
+ * @deprecated Use avcodec_decode_audio3 instead.
+ * @param avctx the codec context
+ * @param[out] samples the output buffer
+ * @param[in,out] frame_size_ptr the output buffer size in bytes
+ * @param[in] buf the input buffer
+ * @param[in] buf_size the input buffer size in bytes
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+attribute_deprecated int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
+                         int *frame_size_ptr,
+                         const uint8_t *buf, int buf_size);
+#endif
+
+/**
+ * Decodes an audio frame from \p avpkt->data into \p samples.
+ * The avcodec_decode_audio3() function decodes an audio frame from the input
+ * buffer \p avpkt->data of size \p avpkt->size. To decode it, it makes use of the
  * audio codec which was coupled with \p avctx using avcodec_open(). The
  * resulting decoded frame is stored in output buffer \p samples.  If no frame
  * could be decompressed, \p frame_size_ptr is zero. Otherwise, it is the
  * decompressed frame size in \e bytes.
  *
  * @warning You \e must set \p frame_size_ptr to the allocated size of the
- * output buffer before calling avcodec_decode_audio2().
+ * output buffer before calling avcodec_decode_audio3().
  *
  * @warning The input buffer must be \c FF_INPUT_BUFFER_PADDING_SIZE larger than
  * the actual read bytes because some optimized bitstream readers read 32 or 64
  * bits at once and could read over the end.
  *
- * @warning The end of the input buffer \p buf should be set to 0 to ensure that
+ * @warning The end of the input buffer \p avpkt->data should be set to 0 to ensure that
  * no overreading happens for damaged MPEG streams.
  *
- * @note You might have to align the input buffer \p buf and output buffer \p
+ * @note You might have to align the input buffer \p avpkt->data and output buffer \p
  * samples. The alignment requirements depend on the CPU: On some CPUs it isn't
  * necessary at all, on others it won't work at all if not aligned and on others
  * it will work but it will have an impact on performance. In practice, the
@@ -3051,19 +3069,37 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
  * @param avctx the codec context
  * @param[out] samples the output buffer
  * @param[in,out] frame_size_ptr the output buffer size in bytes
- * @param[in] buf the input buffer
- * @param[in] buf_size the input buffer size in bytes
+ * @param[in] avpkt The input AVPacket containing the input buffer.
  * @return On error a negative value is returned, otherwise the number of bytes
  * used or zero if no frame could be decompressed.
  */
-int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
+int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
                          int *frame_size_ptr,
-                         const uint8_t *buf, int buf_size);
+                         AVPacket *avpkt);
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 /**
  * Decodes a video frame from \p buf into \p picture.
- * The avcodec_decode_video() function decodes a video frame from the input
- * buffer \p buf of size \p buf_size. To decode it, it makes use of the
+ * Wrapper function which calls avcodec_decode_video2.
+ *
+ * @deprecated Use avcodec_decode_video2 instead.
+ * @param avctx the codec context
+ * @param[out] picture The AVFrame in which the decoded video frame will be stored.
+ * @param[in] buf the input buffer
+ * @param[in] buf_size the size of the input buffer in bytes
+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+attribute_deprecated int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
+                         int *got_picture_ptr,
+                         const uint8_t *buf, int buf_size);
+#endif
+
+/**
+ * Decodes a video frame from \p avpkt->data into \p picture.
+ * The avcodec_decode_video2() function decodes a video frame from the input
+ * buffer \p avpkt->data of size \p avpkt->size. To decode it, it makes use of the
  * video codec which was coupled with \p avctx using avcodec_open(). The
  * resulting decoded frame is stored in \p picture.
  *
@@ -3074,7 +3110,7 @@ int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
  * @warning The end of the input buffer \p buf should be set to 0 to ensure that
  * no overreading happens for damaged MPEG streams.
  *
- * @note You might have to align the input buffer \p buf and output buffer \p
+ * @note You might have to align the input buffer \p avpkt->data and output buffer \p
  * samples. The alignment requirements depend on the CPU: on some CPUs it isn't
  * necessary at all, on others it won't work at all if not aligned and on others
  * it will work but it will have an impact on performance. In practice, the
@@ -3084,26 +3120,42 @@ int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
  * start of the buffer to 16.
  *
  * @note Some codecs have a delay between input and output, these need to be
- * feeded with buf=NULL, buf_size=0 at the end to return the remaining frames.
+ * feeded with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames.
  *
  * @param avctx the codec context
  * @param[out] picture The AVFrame in which the decoded video frame will be stored.
- * @param[in] buf the input buffer
- * @param[in] buf_size the size of the input buffer in bytes
+ * @param[in] avpkt The input AVpacket containing the input buffer.
  * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
  * @return On error a negative value is returned, otherwise the number of bytes
  * used or zero if no frame could be decompressed.
  */
-int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                          int *got_picture_ptr,
-                         const uint8_t *buf, int buf_size);
+                         AVPacket *avpkt);
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 /* Decode a subtitle message. Return -1 if error, otherwise return the
  * number of bytes used. If no subtitle could be decompressed,
  * got_sub_ptr is zero. Otherwise, the subtitle is stored in *sub. */
-int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
+attribute_deprecated int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
                             int *got_sub_ptr,
                             const uint8_t *buf, int buf_size);
+#endif
+
+/**
+ * Decodes a subtitle message.
+ * Returns -1 if error, otherwise returns the number of bytes used.
+ * If no subtitle could be decompressed, \p got_sub_ptr is zero.
+ * Otherwise, the subtitle is stored in \p *sub.
+ *
+ * @param avctx the codec context
+ * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored.
+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+                            int *got_sub_ptr,
+                            AVPacket *avpkt);
 int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata,
                         int *data_size_ptr,
                         uint8_t *buf, int buf_size);
diff --git a/libavcodec/avs.c b/libavcodec/avs.c
index 3b29c853b4b..c00ff5eaf57 100644
--- a/libavcodec/avs.c
+++ b/libavcodec/avs.c
@@ -44,8 +44,10 @@ typedef enum {
 
 static int
 avs_decode_frame(AVCodecContext * avctx,
-                 void *data, int *data_size, const uint8_t * buf, int buf_size)
+                 void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AvsContext *const avs = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame *const p = (AVFrame *) & avs->picture;
diff --git a/libavcodec/bethsoftvideo.c b/libavcodec/bethsoftvideo.c
index 54bc46c555f..92de25777aa 100644
--- a/libavcodec/bethsoftvideo.c
+++ b/libavcodec/bethsoftvideo.c
@@ -58,8 +58,10 @@ static void set_palette(AVFrame * frame, const uint8_t * palette_buffer)
 
 static int bethsoftvid_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     BethsoftvidContext * vid = avctx->priv_data;
     char block_type;
     uint8_t * dst;
diff --git a/libavcodec/bfi.c b/libavcodec/bfi.c
index d611144df3b..aaadb2f41e4 100644
--- a/libavcodec/bfi.c
+++ b/libavcodec/bfi.c
@@ -45,9 +45,10 @@ static av_cold int bfi_decode_init(AVCodecContext * avctx)
 }
 
 static int bfi_decode_frame(AVCodecContext * avctx, void *data,
-                            int *data_size, const uint8_t * buf,
-                            int buf_size)
+                            int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     BFIContext *bfi = avctx->priv_data;
     uint8_t *dst = bfi->dst;
     uint8_t *src, *dst_offset, colour1, colour2;
diff --git a/libavcodec/bmp.c b/libavcodec/bmp.c
index 5de1c46b135..735c085273f 100644
--- a/libavcodec/bmp.c
+++ b/libavcodec/bmp.c
@@ -35,8 +35,10 @@ static av_cold int bmp_decode_init(AVCodecContext *avctx){
 
 static int bmp_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     BMPContext *s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame *p = &s->picture;
diff --git a/libavcodec/c93.c b/libavcodec/c93.c
index 18ed7afcb4f..0e362cad981 100644
--- a/libavcodec/c93.c
+++ b/libavcodec/c93.c
@@ -113,8 +113,10 @@ static inline void draw_n_color(uint8_t *out, int stride, int width,
 }
 
 static int decode_frame(AVCodecContext *avctx, void *data,
-                            int *data_size, const uint8_t * buf, int buf_size)
+                            int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     C93DecoderContext * const c93 = avctx->priv_data;
     AVFrame * const newpic = &c93->pictures[c93->currentpic];
     AVFrame * const oldpic = &c93->pictures[c93->currentpic^1];
diff --git a/libavcodec/cavsdec.c b/libavcodec/cavsdec.c
index a1895bcb881..c04cc399829 100644
--- a/libavcodec/cavsdec.c
+++ b/libavcodec/cavsdec.c
@@ -625,7 +625,9 @@ static void cavs_flush(AVCodecContext * avctx) {
 }
 
 static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size,
-                             const uint8_t * buf, int buf_size) {
+                             AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AVSContext *h = avctx->priv_data;
     MpegEncContext *s = &h->s;
     int input_size;
diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c
index d0f5adb7fc3..5030165bd02 100644
--- a/libavcodec/cinepak.c
+++ b/libavcodec/cinepak.c
@@ -411,8 +411,10 @@ static av_cold int cinepak_decode_init(AVCodecContext *avctx)
 
 static int cinepak_decode_frame(AVCodecContext *avctx,
                                 void *data, int *data_size,
-                                const uint8_t *buf, int buf_size)
+                                AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CinepakContext *s = avctx->priv_data;
 
     s->data = buf;
diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c
index 9f7ab61efdc..9157b001371 100644
--- a/libavcodec/cljr.c
+++ b/libavcodec/cljr.c
@@ -42,8 +42,10 @@ typedef struct CLJRContext{
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CLJRContext * const a = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&a->picture;
diff --git a/libavcodec/cook.c b/libavcodec/cook.c
index cee69fe14ab..9dd13bfef8f 100644
--- a/libavcodec/cook.c
+++ b/libavcodec/cook.c
@@ -979,7 +979,9 @@ static int decode_subpacket(COOKContext *q, const uint8_t *inbuffer,
 
 static int cook_decode_frame(AVCodecContext *avctx,
             void *data, int *data_size,
-            const uint8_t *buf, int buf_size) {
+            AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     COOKContext *q = avctx->priv_data;
 
     if (buf_size < avctx->block_align)
diff --git a/libavcodec/cscd.c b/libavcodec/cscd.c
index 9379b2c7f3f..5fe097712d2 100644
--- a/libavcodec/cscd.c
+++ b/libavcodec/cscd.c
@@ -135,7 +135,9 @@ static void add_frame_32(AVFrame *f, const uint8_t *src,
 #endif
 
 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                        const uint8_t *buf, int buf_size) {
+                        AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CamStudioContext *c = avctx->priv_data;
     AVFrame *picture = data;
 
diff --git a/libavcodec/cyuv.c b/libavcodec/cyuv.c
index 2b15814b31c..944d778198a 100644
--- a/libavcodec/cyuv.c
+++ b/libavcodec/cyuv.c
@@ -60,8 +60,10 @@ static av_cold int cyuv_decode_init(AVCodecContext *avctx)
 
 static int cyuv_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CyuvDecodeContext *s=avctx->priv_data;
 
     unsigned char *y_plane;
diff --git a/libavcodec/dca.c b/libavcodec/dca.c
index 3bc895bc16a..8dfec8e9a91 100644
--- a/libavcodec/dca.c
+++ b/libavcodec/dca.c
@@ -1209,8 +1209,10 @@ static int dca_convert_bitstream(const uint8_t * src, int src_size, uint8_t * ds
  */
 static int dca_decode_frame(AVCodecContext * avctx,
                             void *data, int *data_size,
-                            const uint8_t * buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 
     int i;
     int16_t *samples = data;
diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index 861a0301de0..2d3762b3963 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -278,8 +278,10 @@ static int dnxhd_decode_macroblocks(DNXHDContext *ctx, const uint8_t *buf, int b
 }
 
 static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     DNXHDContext *ctx = avctx->priv_data;
     AVFrame *picture = data;
     int first_field = 1;
diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c
index daa21cd09ef..69c7002ad73 100644
--- a/libavcodec/dpcm.c
+++ b/libavcodec/dpcm.c
@@ -161,8 +161,10 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx)
 
 static int dpcm_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     DPCMContext *s = avctx->priv_data;
     int in, out = 0;
     int predictor[2];
diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c
index f8093fccf22..6e5ff124460 100644
--- a/libavcodec/dsicinav.c
+++ b/libavcodec/dsicinav.c
@@ -195,8 +195,10 @@ static void cin_decode_rle(const unsigned char *src, int src_size, unsigned char
 
 static int cinvideo_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CinVideoContext *cin = avctx->priv_data;
     int i, y, palette_type, palette_colors_count, bitmap_frame_type, bitmap_frame_size;
 
@@ -312,8 +314,10 @@ static av_cold int cinaudio_decode_init(AVCodecContext *avctx)
 
 static int cinaudio_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CinAudioContext *cin = avctx->priv_data;
     const uint8_t *src = buf;
     int16_t *samples = (int16_t *)data;
diff --git a/libavcodec/dv.c b/libavcodec/dv.c
index 59ebb088e66..31325f68096 100644
--- a/libavcodec/dv.c
+++ b/libavcodec/dv.c
@@ -1111,8 +1111,10 @@ static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
    144000 bytes for PAL - or twice those for 50Mbps) */
 static int dvvideo_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     DVVideoContext *s = avctx->priv_data;
 
     s->sys = dv_frame_profile(buf);
diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c
index 2a05390d390..a10f97bb2fe 100644
--- a/libavcodec/dvbsubdec.c
+++ b/libavcodec/dvbsubdec.c
@@ -1345,8 +1345,10 @@ static int dvbsub_display_end_segment(AVCodecContext *avctx, const uint8_t *buf,
 
 static int dvbsub_decode(AVCodecContext *avctx,
                          void *data, int *data_size,
-                         const uint8_t *buf, int buf_size)
+                         AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data;
     AVSubtitle *sub = (AVSubtitle*) data;
     const uint8_t *p, *p_end;
diff --git a/libavcodec/dvdsubdec.c b/libavcodec/dvdsubdec.c
index 9691e384f43..ba1738089db 100644
--- a/libavcodec/dvdsubdec.c
+++ b/libavcodec/dvdsubdec.c
@@ -475,8 +475,10 @@ static void ppm_save(const char *filename, uint8_t *bitmap, int w, int h,
 
 static int dvdsub_decode(AVCodecContext *avctx,
                          void *data, int *data_size,
-                         const uint8_t *buf, int buf_size)
+                         AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AVSubtitle *sub = (void *)data;
     int is_menu;
 
diff --git a/libavcodec/dxa.c b/libavcodec/dxa.c
index e415da7187d..5339580c02c 100644
--- a/libavcodec/dxa.c
+++ b/libavcodec/dxa.c
@@ -188,8 +188,10 @@ static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, uint
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     DxaDecContext * const c = avctx->priv_data;
     uint8_t *outptr, *srcptr, *tmpptr;
     unsigned long dsize;
diff --git a/libavcodec/eacmv.c b/libavcodec/eacmv.c
index 18321aada5f..3de08cc1a09 100644
--- a/libavcodec/eacmv.c
+++ b/libavcodec/eacmv.c
@@ -144,8 +144,10 @@ static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t
 
 static int cmv_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CmvContext *s = avctx->priv_data;
     const uint8_t *buf_end = buf + buf_size;
 
diff --git a/libavcodec/eatgq.c b/libavcodec/eatgq.c
index dd833f52c95..05f03e7b057 100644
--- a/libavcodec/eatgq.c
+++ b/libavcodec/eatgq.c
@@ -190,7 +190,9 @@ static void tgq_calculate_qtable(TgqContext *s, int quant){
 
 static int tgq_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size){
+                            AVPacket *avpkt){
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     const uint8_t *buf_start = buf;
     const uint8_t *buf_end = buf + buf_size;
     TgqContext *s = avctx->priv_data;
diff --git a/libavcodec/eatgv.c b/libavcodec/eatgv.c
index 90e3ebf4891..93a722ff256 100644
--- a/libavcodec/eatgv.c
+++ b/libavcodec/eatgv.c
@@ -237,8 +237,10 @@ static void cond_release_buffer(AVFrame *pic)
 
 static int tgv_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TgvContext *s = avctx->priv_data;
     const uint8_t *buf_end = buf + buf_size;
     int chunk_type;
diff --git a/libavcodec/eatqi.c b/libavcodec/eatqi.c
index 66123a2aae7..3b6b8ebf9d9 100644
--- a/libavcodec/eatqi.c
+++ b/libavcodec/eatqi.c
@@ -101,8 +101,10 @@ static void tqi_calculate_qtable(MpegEncContext *s, int quant)
 
 static int tqi_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     const uint8_t *buf_end = buf+buf_size;
     TqiContext *t = avctx->priv_data;
     MpegEncContext *s = &t->s;
diff --git a/libavcodec/escape124.c b/libavcodec/escape124.c
index 90ba4795ebc..7f22b84c67a 100644
--- a/libavcodec/escape124.c
+++ b/libavcodec/escape124.c
@@ -206,8 +206,10 @@ static const uint16_t mask_matrix[] = {0x1,   0x2,   0x10,   0x20,
  */
 static int escape124_decode_frame(AVCodecContext *avctx,
                                   void *data, int *data_size,
-                                  const uint8_t *buf, int buf_size)
+                                  AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Escape124Context *s = avctx->priv_data;
 
     GetBitContext gb;
diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index 72c5fbd881e..570999a32ff 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -936,7 +936,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size){
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FFV1Context *f = avctx->priv_data;
     RangeCoder * const c= &f->c;
     const int width= f->width;
diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c
index 04e81c6faad..e6b52c7d1b7 100644
--- a/libavcodec/flacdec.c
+++ b/libavcodec/flacdec.c
@@ -636,8 +636,10 @@ static int decode_frame(FLACContext *s)
 
 static int flac_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FLACContext *s = avctx->priv_data;
     int i, j = 0, input_buf_size = 0, bytes_read = 0;
     int16_t *samples_16 = data;
diff --git a/libavcodec/flashsv.c b/libavcodec/flashsv.c
index 7937efce258..91c04996eb5 100644
--- a/libavcodec/flashsv.c
+++ b/libavcodec/flashsv.c
@@ -102,8 +102,10 @@ static av_cold int flashsv_decode_init(AVCodecContext *avctx)
 
 static int flashsv_decode_frame(AVCodecContext *avctx,
                                     void *data, int *data_size,
-                                    const uint8_t *buf, int buf_size)
+                                    AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FlashSVContext *s = avctx->priv_data;
     int h_blocks, v_blocks, h_part, v_part, i, j;
     GetBitContext gb;
diff --git a/libavcodec/flicvideo.c b/libavcodec/flicvideo.c
index 2261c40524a..37bed0a0de9 100644
--- a/libavcodec/flicvideo.c
+++ b/libavcodec/flicvideo.c
@@ -701,8 +701,10 @@ static int flic_decode_frame_24BPP(AVCodecContext *avctx,
 
 static int flic_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     if (avctx->pix_fmt == PIX_FMT_PAL8) {
       return flic_decode_frame_8BPP(avctx, data, data_size,
                                     buf, buf_size);
diff --git a/libavcodec/fraps.c b/libavcodec/fraps.c
index 14da1a0b616..6fac1680a73 100644
--- a/libavcodec/fraps.c
+++ b/libavcodec/fraps.c
@@ -130,8 +130,10 @@ static int fraps2_decode_plane(FrapsContext *s, uint8_t *dst, int stride, int w,
  */
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FrapsContext * const s = avctx->priv_data;
     AVFrame *frame = data;
     AVFrame * const f = (AVFrame*)&s->frame;
diff --git a/libavcodec/g726.c b/libavcodec/g726.c
index fe1cc3d6f2e..ea72d398851 100644
--- a/libavcodec/g726.c
+++ b/libavcodec/g726.c
@@ -363,8 +363,10 @@ static int g726_encode_frame(AVCodecContext *avctx,
 
 static int g726_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     G726Context *c = avctx->priv_data;
     short *samples = data;
     GetBitContext gb;
diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c
index d24550c8461..137e7b2c233 100644
--- a/libavcodec/gifdec.c
+++ b/libavcodec/gifdec.c
@@ -282,8 +282,10 @@ static av_cold int gif_decode_init(AVCodecContext *avctx)
     return 0;
 }
 
-static int gif_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int gif_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     GifState *s = avctx->priv_data;
     AVFrame *picture = data;
     int ret;
diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c
index 70542869c5f..3509e9f1715 100644
--- a/libavcodec/h261dec.c
+++ b/libavcodec/h261dec.c
@@ -543,8 +543,10 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){
 
 static int h261_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     H261Context *h= avctx->priv_data;
     MpegEncContext *s = &h->s;
     int ret;
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 4d032238567..2f57573394d 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -331,8 +331,10 @@ static int decode_slice(MpegEncContext *s){
 
 int ff_h263_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MpegEncContext *s = avctx->priv_data;
     int ret;
     AVFrame *pict = data;
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 8ae32561085..1b5aeb2ceb4 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -7618,8 +7618,10 @@ static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
 
 static int decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     H264Context *h = avctx->priv_data;
     MpegEncContext *s = &h->s;
     AVFrame *pict = data;
diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c
index 237b05fa94c..e02bea2be8e 100644
--- a/libavcodec/huffyuv.c
+++ b/libavcodec/huffyuv.c
@@ -942,7 +942,9 @@ static void draw_slice(HYuvContext *s, int y){
     s->last_slice_end= y + h;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size){
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     HYuvContext *s = avctx->priv_data;
     const int width= s->width;
     const int width2= s->width>>1;
diff --git a/libavcodec/idcinvideo.c b/libavcodec/idcinvideo.c
index 63123663c0b..05a3088852e 100644
--- a/libavcodec/idcinvideo.c
+++ b/libavcodec/idcinvideo.c
@@ -209,8 +209,10 @@ static void idcin_decode_vlcs(IdcinContext *s)
 
 static int idcin_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     IdcinContext *s = avctx->priv_data;
     AVPaletteControl *palette_control = avctx->palctrl;
 
diff --git a/libavcodec/imc.c b/libavcodec/imc.c
index e8d43e6b087..ff50d4b59b5 100644
--- a/libavcodec/imc.c
+++ b/libavcodec/imc.c
@@ -639,8 +639,10 @@ static int imc_get_coeffs (IMCContext* q) {
 
 static int imc_decode_frame(AVCodecContext * avctx,
                             void *data, int *data_size,
-                            const uint8_t * buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 
     IMCContext *q = avctx->priv_data;
 
diff --git a/libavcodec/indeo2.c b/libavcodec/indeo2.c
index 40c561a559d..75b9ee98366 100644
--- a/libavcodec/indeo2.c
+++ b/libavcodec/indeo2.c
@@ -136,8 +136,10 @@ static int ir2_decode_plane_inter(Ir2Context *ctx, int width, int height, uint8_
 
 static int ir2_decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Ir2Context * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&s->picture;
diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c
index 915bceed656..b5a9a4dba78 100644
--- a/libavcodec/indeo3.c
+++ b/libavcodec/indeo3.c
@@ -1062,8 +1062,10 @@ static int iv_decode_frame(Indeo3DecodeContext *s,
 
 static int indeo3_decode_frame(AVCodecContext *avctx,
                                void *data, int *data_size,
-                               const uint8_t *buf, int buf_size)
+                               AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Indeo3DecodeContext *s=avctx->priv_data;
     uint8_t *src, *dest;
     int y;
diff --git a/libavcodec/interplayvideo.c b/libavcodec/interplayvideo.c
index 50db2e95da3..51ee759ead0 100644
--- a/libavcodec/interplayvideo.c
+++ b/libavcodec/interplayvideo.c
@@ -639,8 +639,10 @@ static av_cold int ipvideo_decode_init(AVCodecContext *avctx)
 
 static int ipvideo_decode_frame(AVCodecContext *avctx,
                                 void *data, int *data_size,
-                                const uint8_t *buf, int buf_size)
+                                AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     IpvideoContext *s = avctx->priv_data;
     AVPaletteControl *palette_control = avctx->palctrl;
 
diff --git a/libavcodec/kmvc.c b/libavcodec/kmvc.c
index 30939ab411e..a3389da1add 100644
--- a/libavcodec/kmvc.c
+++ b/libavcodec/kmvc.c
@@ -224,9 +224,10 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
         }
 }
 
-static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, const uint8_t * buf,
-                        int buf_size)
+static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     KmvcContext *const ctx = avctx->priv_data;
     uint8_t *out, *src;
     int i;
diff --git a/libavcodec/lcldec.c b/libavcodec/lcldec.c
index 026be4f0b0b..9c0d8d75d66 100644
--- a/libavcodec/lcldec.c
+++ b/libavcodec/lcldec.c
@@ -161,8 +161,10 @@ static unsigned int mszh_decomp(unsigned char * srcptr, int srclen, unsigned cha
  * Decode a frame
  *
  */
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     LclDecContext * const c = avctx->priv_data;
     unsigned char *encoded = (unsigned char *)buf;
     unsigned int pixel_ptr;
diff --git a/libavcodec/libamr.c b/libavcodec/libamr.c
index 6a9de50fdc5..29325c91408 100644
--- a/libavcodec/libamr.c
+++ b/libavcodec/libamr.c
@@ -245,8 +245,10 @@ static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
 
 static int amr_nb_decode_frame(AVCodecContext * avctx,
             void *data, int *data_size,
-            const uint8_t * buf, int buf_size)
+            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AMRContext *s = avctx->priv_data;
     const uint8_t*amrData=buf;
     int offset=0;
@@ -654,8 +656,10 @@ static int amr_wb_decode_init(AVCodecContext * avctx)
 
 static int amr_wb_decode_frame(AVCodecContext * avctx,
             void *data, int *data_size,
-            const uint8_t * buf, int buf_size)
+            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AMRWBContext *s = avctx->priv_data;
     const uint8_t*amrData=buf;
     int mode;
diff --git a/libavcodec/libdiracdec.c b/libavcodec/libdiracdec.c
index 2c484a410c7..9050f8829ca 100644
--- a/libavcodec/libdiracdec.c
+++ b/libavcodec/libdiracdec.c
@@ -77,8 +77,10 @@ static av_cold int libdirac_decode_init(AVCodecContext *avccontext)
 
 static int libdirac_decode_frame(AVCodecContext *avccontext,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 
     FfmpegDiracDecoderParams *p_dirac_params = avccontext->priv_data;
     AVPicture *picture = data;
diff --git a/libavcodec/libfaad.c b/libavcodec/libfaad.c
index 37468862377..953c2a1ed22 100644
--- a/libavcodec/libfaad.c
+++ b/libavcodec/libfaad.c
@@ -149,8 +149,10 @@ static av_cold int faac_init_mp4(AVCodecContext *avctx)
 
 static int faac_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     FAACContext *s = avctx->priv_data;
 #ifndef FAAD2_VERSION
     unsigned long bytesconsumed;
diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c
index e036afd3c45..7dc2af84059 100644
--- a/libavcodec/libgsm.c
+++ b/libavcodec/libgsm.c
@@ -138,7 +138,9 @@ AVCodec libgsm_ms_encoder = {
 
 static int libgsm_decode_frame(AVCodecContext *avctx,
                                void *data, int *data_size,
-                               uint8_t *buf, int buf_size) {
+                               AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     *data_size = 0; /* In case of error */
     if(buf_size < avctx->block_align) return -1;
     switch(avctx->codec_id) {
diff --git a/libavcodec/libopenjpeg.c b/libavcodec/libopenjpeg.c
index 70581ee73c1..a3035fd290d 100644
--- a/libavcodec/libopenjpeg.c
+++ b/libavcodec/libopenjpeg.c
@@ -58,8 +58,10 @@ static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx)
 
 static int libopenjpeg_decode_frame(AVCodecContext *avctx,
                                     void *data, int *data_size,
-                                    const uint8_t *buf, int buf_size)
+                                    AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     LibOpenJPEGContext *ctx = avctx->priv_data;
     AVFrame *picture = &ctx->image, *output = data;
     opj_dinfo_t *dec;
diff --git a/libavcodec/libschroedingerdec.c b/libavcodec/libschroedingerdec.c
index 1512ec79fc7..3985a1ca2de 100644
--- a/libavcodec/libschroedingerdec.c
+++ b/libavcodec/libschroedingerdec.c
@@ -207,8 +207,10 @@ static void libschroedinger_handle_first_access_unit(AVCodecContext *avccontext)
 
 static int libschroedinger_decode_frame(AVCodecContext *avccontext,
                                         void *data, int *data_size,
-                                        const uint8_t *buf, int buf_size)
+                                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 
     FfmpegSchroDecoderParams *p_schro_params = avccontext->priv_data;
     SchroDecoder *decoder = p_schro_params->decoder;
diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c
index d44466b841f..8c3dc293dfd 100644
--- a/libavcodec/libspeexdec.c
+++ b/libavcodec/libspeexdec.c
@@ -90,8 +90,10 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx)
 
 static int libspeex_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     LibSpeexContext *s = avctx->priv_data;
     int16_t *output = data, *end;
     int i, num_samples;
diff --git a/libavcodec/loco.c b/libavcodec/loco.c
index 64b718fb81e..fc7b44075f4 100644
--- a/libavcodec/loco.c
+++ b/libavcodec/loco.c
@@ -158,8 +158,10 @@ static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int heigh
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     LOCOContext * const l = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&l->pic;
     int decoded;
diff --git a/libavcodec/mace.c b/libavcodec/mace.c
index d26164706aa..ae7b4dc8332 100644
--- a/libavcodec/mace.c
+++ b/libavcodec/mace.c
@@ -236,8 +236,10 @@ static av_cold int mace_decode_init(AVCodecContext * avctx)
 
 static int mace_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     int16_t *samples = data;
     MACEContext *ctx = avctx->priv_data;
     int i, j, k, l;
diff --git a/libavcodec/mdec.c b/libavcodec/mdec.c
index ccde88df7d3..ad998649ed7 100644
--- a/libavcodec/mdec.c
+++ b/libavcodec/mdec.c
@@ -154,8 +154,10 @@ static inline void idct_put(MDECContext *a, int mb_x, int mb_y){
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MDECContext * const a = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= &a->picture;
diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c
index a6ab090e2db..da5bba3c2eb 100644
--- a/libavcodec/mimic.c
+++ b/libavcodec/mimic.c
@@ -274,8 +274,10 @@ static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVPicture *src)
 }
 
 static int mimic_decode_frame(AVCodecContext *avctx, void *data,
-                              int *data_size, const uint8_t *buf, int buf_size)
+                              int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MimicContext *ctx = avctx->priv_data;
     int is_pframe;
     int width, height;
diff --git a/libavcodec/mjpegbdec.c b/libavcodec/mjpegbdec.c
index 62b29e06238..04ad6c106c6 100644
--- a/libavcodec/mjpegbdec.c
+++ b/libavcodec/mjpegbdec.c
@@ -31,8 +31,10 @@
 
 static int mjpegb_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MJpegDecodeContext *s = avctx->priv_data;
     const uint8_t *buf_end, *buf_ptr;
     AVFrame *picture = data;
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 145719c16e9..1463d115d32 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -1258,8 +1258,10 @@ found:
 
 int ff_mjpeg_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MJpegDecodeContext *s = avctx->priv_data;
     const uint8_t *buf_end, *buf_ptr;
     int start_code;
diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h
index ab034d79ba4..a0974201d2f 100644
--- a/libavcodec/mjpegdec.h
+++ b/libavcodec/mjpegdec.h
@@ -106,7 +106,7 @@ int ff_mjpeg_decode_init(AVCodecContext *avctx);
 int ff_mjpeg_decode_end(AVCodecContext *avctx);
 int ff_mjpeg_decode_frame(AVCodecContext *avctx,
                           void *data, int *data_size,
-                          const uint8_t *buf, int buf_size);
+                          AVPacket *avpkt);
 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s);
 int ff_mjpeg_decode_dht(MJpegDecodeContext *s);
 int ff_mjpeg_decode_sof(MJpegDecodeContext *s);
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c
index 9642104a5f4..ba374c9dfa4 100644
--- a/libavcodec/mlpdec.c
+++ b/libavcodec/mlpdec.c
@@ -904,8 +904,10 @@ static int output_data(MLPDecodeContext *m, unsigned int substr,
  *  otherwise returns the number of bytes consumed. */
 
 static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MLPDecodeContext *m = avctx->priv_data;
     GetBitContext gb;
     unsigned int length, substr;
diff --git a/libavcodec/mmvideo.c b/libavcodec/mmvideo.c
index 238b991a8d7..6dc95589c6d 100644
--- a/libavcodec/mmvideo.c
+++ b/libavcodec/mmvideo.c
@@ -159,8 +159,10 @@ static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const
 
 static int mm_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MmContext *s = avctx->priv_data;
     const uint8_t *buf_end = buf+buf_size;
     int type;
diff --git a/libavcodec/motionpixels.c b/libavcodec/motionpixels.c
index f69dcf95fe9..02ea04986a2 100644
--- a/libavcodec/motionpixels.c
+++ b/libavcodec/motionpixels.c
@@ -281,8 +281,10 @@ static void mp_decode_frame_helper(MotionPixelsContext *mp, GetBitContext *gb)
 
 static int mp_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MotionPixelsContext *mp = avctx->priv_data;
     GetBitContext gb;
     int i, count1, count2, sz;
diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
index 7362a19192f..8bc05d53755 100644
--- a/libavcodec/mpc7.c
+++ b/libavcodec/mpc7.c
@@ -156,8 +156,10 @@ static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *
 
 static int mpc7_decode_frame(AVCodecContext * avctx,
                             void *data, int *data_size,
-                            const uint8_t * buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MPCContext *c = avctx->priv_data;
     GetBitContext gb;
     uint8_t *bits;
diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c
index ff7d5e5805c..d72e36f306c 100644
--- a/libavcodec/mpc8.c
+++ b/libavcodec/mpc8.c
@@ -180,8 +180,10 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
 
 static int mpc8_decode_frame(AVCodecContext * avctx,
                             void *data, int *data_size,
-                            const uint8_t * buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MPCContext *c = avctx->priv_data;
     GetBitContext gb2, *gb = &gb2;
     int i, j, k, ch, cnt, res, t;
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index b353b88f4c6..f4e4958bfac 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -2260,8 +2260,10 @@ static int decode_chunks(AVCodecContext *avctx,
 /* handle buffering and image synchronisation */
 static int mpeg_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Mpeg1Context *s = avctx->priv_data;
     AVFrame *picture = data;
     MpegEncContext *s2 = &s->mpeg_enc_ctx;
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index ce0066bbf7b..8c052a4d5d9 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -2258,8 +2258,10 @@ static int mp_decode_frame(MPADecodeContext *s,
 
 static int decode_frame(AVCodecContext * avctx,
                         void *data, int *data_size,
-                        const uint8_t * buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MPADecodeContext *s = avctx->priv_data;
     uint32_t header;
     int out_size;
@@ -2315,8 +2317,10 @@ static void flush(AVCodecContext *avctx){
 #if CONFIG_MP3ADU_DECODER
 static int decode_frame_adu(AVCodecContext * avctx,
                         void *data, int *data_size,
-                        const uint8_t * buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MPADecodeContext *s = avctx->priv_data;
     uint32_t header;
     int len, out_size;
@@ -2459,8 +2463,10 @@ static av_cold int decode_close_mp3on4(AVCodecContext * avctx)
 
 static int decode_frame_mp3on4(AVCodecContext * avctx,
                         void *data, int *data_size,
-                        const uint8_t * buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MP3On4DecodeContext *s = avctx->priv_data;
     MPADecodeContext *m;
     int fsize, len = buf_size, out_size = 0;
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 615c0faf225..10dd48ca1ec 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -795,7 +795,7 @@ int ff_h261_get_picture_format(int width, int height);
 int ff_h263_decode_init(AVCodecContext *avctx);
 int ff_h263_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size);
+                             AVPacket *avpkt);
 int ff_h263_decode_end(AVCodecContext *avctx);
 void h263_encode_mb(MpegEncContext *s,
                     DCTELEM block[6][64],
diff --git a/libavcodec/msrle.c b/libavcodec/msrle.c
index 2b477d9427e..0d77e30c5ef 100644
--- a/libavcodec/msrle.c
+++ b/libavcodec/msrle.c
@@ -63,8 +63,10 @@ static av_cold int msrle_decode_init(AVCodecContext *avctx)
 
 static int msrle_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MsrleContext *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/msvideo1.c b/libavcodec/msvideo1.c
index 4b27b42ed1f..78d358ed328 100644
--- a/libavcodec/msvideo1.c
+++ b/libavcodec/msvideo1.c
@@ -294,8 +294,10 @@ static void msvideo1_decode_16bit(Msvideo1Context *s)
 
 static int msvideo1_decode_frame(AVCodecContext *avctx,
                                 void *data, int *data_size,
-                                const uint8_t *buf, int buf_size)
+                                AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Msvideo1Context *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/nellymoserdec.c b/libavcodec/nellymoserdec.c
index ff708548004..5ea2547a762 100644
--- a/libavcodec/nellymoserdec.c
+++ b/libavcodec/nellymoserdec.c
@@ -153,7 +153,9 @@ static av_cold int decode_init(AVCodecContext * avctx) {
 
 static int decode_tag(AVCodecContext * avctx,
                       void *data, int *data_size,
-                      const uint8_t * buf, int buf_size) {
+                      AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     NellyMoserDecodeContext *s = avctx->priv_data;
     int blocks, i;
     int16_t* samples;
diff --git a/libavcodec/nuv.c b/libavcodec/nuv.c
index a89953c29c1..4f049baf901 100644
--- a/libavcodec/nuv.c
+++ b/libavcodec/nuv.c
@@ -128,7 +128,9 @@ static int codec_reinit(AVCodecContext *avctx, int width, int height, int qualit
 }
 
 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                        const uint8_t *buf, int buf_size) {
+                        AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     NuvContext *c = avctx->priv_data;
     AVFrame *picture = data;
     int orig_size = buf_size;
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index e8d6a798344..b30e2fe70bc 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcm.c
@@ -323,8 +323,10 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx)
 
 static int pcm_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PCMDecode *s = avctx->priv_data;
     int sample_size, c, n;
     short *samples;
diff --git a/libavcodec/pcx.c b/libavcodec/pcx.c
index bf80e437fef..23a808d633d 100644
--- a/libavcodec/pcx.c
+++ b/libavcodec/pcx.c
@@ -70,7 +70,9 @@ static void pcx_palette(const uint8_t **src, uint32_t *dst, unsigned int pallen)
 }
 
 static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                            const uint8_t *buf, int buf_size) {
+                            AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PCXContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p = &s->picture;
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index a3431525b6f..fadbcd07c94 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -379,8 +379,10 @@ static int png_decode_idat(PNGDecContext *s, int length)
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PNGDecContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= &s->picture;
diff --git a/libavcodec/pnmenc.c b/libavcodec/pnmenc.c
index 69e6bed657b..2619d90c857 100644
--- a/libavcodec/pnmenc.c
+++ b/libavcodec/pnmenc.c
@@ -34,8 +34,10 @@ static av_cold int common_init(AVCodecContext *avctx){
 
 static int pnm_decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PNMContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&s->picture;
diff --git a/libavcodec/ptx.c b/libavcodec/ptx.c
index 2ab45b08a7c..67799fac9ec 100644
--- a/libavcodec/ptx.c
+++ b/libavcodec/ptx.c
@@ -36,7 +36,9 @@ static av_cold int ptx_init(AVCodecContext *avctx) {
 }
 
 static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                            const uint8_t *buf, int buf_size) {
+                            AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     PTXContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p = &s->picture;
diff --git a/libavcodec/qcelpdec.c b/libavcodec/qcelpdec.c
index 9bef200670f..516965c7cfd 100644
--- a/libavcodec/qcelpdec.c
+++ b/libavcodec/qcelpdec.c
@@ -729,8 +729,10 @@ static void warn_insufficient_frame_quality(AVCodecContext *avctx,
 }
 
 static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QCELPContext *q = avctx->priv_data;
     float *outbuffer = data;
     int   i;
diff --git a/libavcodec/qdm2.c b/libavcodec/qdm2.c
index a3373a16d96..6dafd0aabdd 100644
--- a/libavcodec/qdm2.c
+++ b/libavcodec/qdm2.c
@@ -1968,8 +1968,10 @@ static void qdm2_decode (QDM2Context *q, const uint8_t *in, int16_t *out)
 
 static int qdm2_decode_frame(AVCodecContext *avctx,
             void *data, int *data_size,
-            const uint8_t *buf, int buf_size)
+            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QDM2Context *s = avctx->priv_data;
 
     if(!buf)
diff --git a/libavcodec/qdrw.c b/libavcodec/qdrw.c
index 4349e168e03..0f9609159cc 100644
--- a/libavcodec/qdrw.c
+++ b/libavcodec/qdrw.c
@@ -34,8 +34,10 @@ typedef struct QdrawContext{
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QdrawContext * const a = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&a->pic;
     uint8_t* outdata;
diff --git a/libavcodec/qpeg.c b/libavcodec/qpeg.c
index aa8f69c0cf0..64ab74b2b2c 100644
--- a/libavcodec/qpeg.c
+++ b/libavcodec/qpeg.c
@@ -248,8 +248,10 @@ static void qpeg_decode_inter(const uint8_t *src, uint8_t *dst, int size,
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QpegContext * const a = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&a->pic;
     uint8_t* outdata;
diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
index d535c38dd9a..998ba702d8c 100644
--- a/libavcodec/qtrle.c
+++ b/libavcodec/qtrle.c
@@ -424,8 +424,10 @@ static av_cold int qtrle_decode_init(AVCodecContext *avctx)
 
 static int qtrle_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QtrleContext *s = avctx->priv_data;
     int header, start_line;
     int stream_ptr, height, row_ptr;
diff --git a/libavcodec/ra144.c b/libavcodec/ra144.c
index 5126b07bdce..a4e4943952e 100644
--- a/libavcodec/ra144.c
+++ b/libavcodec/ra144.c
@@ -287,8 +287,10 @@ static int interp(RA144Context *ractx, int16_t *out, int a,
 
 /** Uncompress one block (20 bytes -> 160*2 bytes). */
 static int ra144_decode_frame(AVCodecContext * avctx, void *vdata,
-                              int *data_size, const uint8_t *buf, int buf_size)
+                              int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
     unsigned int refl_rms[4];    // RMS of the reflection coefficients
     uint16_t block_coefs[4][30]; // LPC coefficients of each sub-block
diff --git a/libavcodec/ra288.c b/libavcodec/ra288.c
index 746075e9726..437adb355b8 100644
--- a/libavcodec/ra288.c
+++ b/libavcodec/ra288.c
@@ -160,9 +160,10 @@ static void backward_filter(float *hist, float *rec, const float *window,
 }
 
 static int ra288_decode_frame(AVCodecContext * avctx, void *data,
-                              int *data_size, const uint8_t * buf,
-                              int buf_size)
+                              int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     float *out = data;
     int i, j;
     RA288Context *ractx = avctx->priv_data;
diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c
index 963e148aa17..25f5c91aa75 100644
--- a/libavcodec/rawdec.c
+++ b/libavcodec/rawdec.c
@@ -100,8 +100,10 @@ static void flip(AVCodecContext *avctx, AVPicture * picture){
 
 static int raw_decode(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     RawVideoContext *context = avctx->priv_data;
 
     AVFrame * frame = (AVFrame *) data;
diff --git a/libavcodec/rl2.c b/libavcodec/rl2.c
index 7cbaca077c8..afef8a77e81 100644
--- a/libavcodec/rl2.c
+++ b/libavcodec/rl2.c
@@ -181,8 +181,10 @@ static av_cold int rl2_decode_init(AVCodecContext *avctx)
  */
 static int rl2_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Rl2Context *s = avctx->priv_data;
 
     if(s->frame.data[0])
diff --git a/libavcodec/roqvideodec.c b/libavcodec/roqvideodec.c
index c9daec729fa..64924a5ce68 100644
--- a/libavcodec/roqvideodec.c
+++ b/libavcodec/roqvideodec.c
@@ -169,8 +169,10 @@ static av_cold int roq_decode_init(AVCodecContext *avctx)
 
 static int roq_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     RoqContext *s = avctx->priv_data;
     int copy= !s->current_frame->data[0];
 
diff --git a/libavcodec/rpza.c b/libavcodec/rpza.c
index 27ed71f9371..ba276c55e0a 100644
--- a/libavcodec/rpza.c
+++ b/libavcodec/rpza.c
@@ -241,8 +241,10 @@ static av_cold int rpza_decode_init(AVCodecContext *avctx)
 
 static int rpza_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     RpzaContext *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
index 71a25d650ff..99fb9044172 100644
--- a/libavcodec/rv10.c
+++ b/libavcodec/rv10.c
@@ -727,8 +727,10 @@ static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
 
 static int rv10_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MpegEncContext *s = avctx->priv_data;
     int i;
     AVFrame *pict = data;
diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
index 66036414d54..0e83f77ff5b 100644
--- a/libavcodec/rv34.c
+++ b/libavcodec/rv34.c
@@ -1370,8 +1370,10 @@ static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
 
 int ff_rv34_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     RV34DecContext *r = avctx->priv_data;
     MpegEncContext *s = &r->s;
     AVFrame *pict = data;
diff --git a/libavcodec/rv34.h b/libavcodec/rv34.h
index b14ba828ddf..a4f768eb2a3 100644
--- a/libavcodec/rv34.h
+++ b/libavcodec/rv34.h
@@ -123,7 +123,7 @@ typedef struct RV34DecContext{
  */
 int ff_rv34_get_start_offset(GetBitContext *gb, int blocks);
 int ff_rv34_decode_init(AVCodecContext *avctx);
-int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size);
+int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt);
 int ff_rv34_decode_end(AVCodecContext *avctx);
 
 #endif /* AVCODEC_RV34_H */
diff --git a/libavcodec/sgidec.c b/libavcodec/sgidec.c
index f6ca7438ee0..dadbc19d222 100644
--- a/libavcodec/sgidec.c
+++ b/libavcodec/sgidec.c
@@ -147,8 +147,10 @@ static int read_uncompressed_sgi(unsigned char* out_buf, uint8_t* out_end,
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *in_buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *in_buf = avpkt->data;
+    int buf_size = avpkt->size;
     SgiState *s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame *p = &s->picture;
diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c
index 053f5c2ed1a..8f7149af0ab 100644
--- a/libavcodec/shorten.c
+++ b/libavcodec/shorten.c
@@ -269,8 +269,10 @@ static void decode_subframe_lpc(ShortenContext *s, int channel, int residual_siz
 
 static int shorten_decode_frame(AVCodecContext *avctx,
         void *data, int *data_size,
-        const uint8_t *buf, int buf_size)
+        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     ShortenContext *s = avctx->priv_data;
     int i, input_buf_size = 0;
     int16_t *samples = data;
diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c
index ad5827ea22b..ac638f85226 100644
--- a/libavcodec/smacker.c
+++ b/libavcodec/smacker.c
@@ -345,8 +345,10 @@ static av_always_inline int smk_get_code(GetBitContext *gb, int *recode, int *la
     return v;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     SmackVContext * const smk = avctx->priv_data;
     uint8_t *out;
     uint32_t *pal;
@@ -565,8 +567,10 @@ static av_cold int smka_decode_init(AVCodecContext *avctx)
 /**
  * Decode Smacker audio data
  */
-static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     GetBitContext gb;
     HuffContext h[4];
     VLC vlc[4];
diff --git a/libavcodec/smc.c b/libavcodec/smc.c
index d0102eaa9c8..75ecd4f1866 100644
--- a/libavcodec/smc.c
+++ b/libavcodec/smc.c
@@ -441,8 +441,10 @@ static av_cold int smc_decode_init(AVCodecContext *avctx)
 
 static int smc_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     SmcContext *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index ca85ad676d1..a8de940949f 100644
--- a/libavcodec/snow.c
+++ b/libavcodec/snow.c
@@ -4483,7 +4483,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size){
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     SnowContext *s = avctx->priv_data;
     RangeCoder * const c= &s->c;
     int bytes_read;
diff --git a/libavcodec/sonic.c b/libavcodec/sonic.c
index 14e19ad6391..7db8b3c9571 100644
--- a/libavcodec/sonic.c
+++ b/libavcodec/sonic.c
@@ -851,8 +851,10 @@ static av_cold int sonic_decode_close(AVCodecContext *avctx)
 
 static int sonic_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     SonicContext *s = avctx->priv_data;
     GetBitContext gb;
     int i, quant, ch, j;
diff --git a/libavcodec/sp5xdec.c b/libavcodec/sp5xdec.c
index 920b32d8cd0..62214aadd3a 100644
--- a/libavcodec/sp5xdec.c
+++ b/libavcodec/sp5xdec.c
@@ -32,8 +32,11 @@
 
 static int sp5x_decode_frame(AVCodecContext *avctx,
                               void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
+    AVPacket avpkt_recoded;
 #if 0
     MJpegDecodeContext *s = avctx->priv_data;
 #endif
@@ -89,7 +92,10 @@ static int sp5x_decode_frame(AVCodecContext *avctx,
     recoded[j++] = 0xD9;
 
     avctx->flags &= ~CODEC_FLAG_EMU_EDGE;
-    i = ff_mjpeg_decode_frame(avctx, data, data_size, recoded, j);
+    av_init_packet(&avpkt_recoded);
+    avpkt_recoded.data = recoded;
+    avpkt_recoded.size = j;
+    i = ff_mjpeg_decode_frame(avctx, data, data_size, &avpkt_recoded);
 
     av_free(recoded);
 
diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c
index f7a7f9c6c03..8a78f1aab4e 100644
--- a/libavcodec/sunrast.c
+++ b/libavcodec/sunrast.c
@@ -43,7 +43,9 @@ static av_cold int sunrast_init(AVCodecContext *avctx) {
 }
 
 static int sunrast_decode_frame(AVCodecContext *avctx, void *data,
-                                int *data_size, const uint8_t *buf, int buf_size) {
+                                int *data_size, AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     SUNRASTContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p = &s->picture;
diff --git a/libavcodec/svq1dec.c b/libavcodec/svq1dec.c
index 7fef10bb99b..225c9e8c4d5 100644
--- a/libavcodec/svq1dec.c
+++ b/libavcodec/svq1dec.c
@@ -642,8 +642,10 @@ static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
 
 static int svq1_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+  const uint8_t *buf = avpkt->data;
+  int buf_size = avpkt->size;
   MpegEncContext *s=avctx->priv_data;
   uint8_t        *current, *previous;
   int             result, i, x, y, width, height;
diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c
index bef7075a262..28dacf79a2e 100644
--- a/libavcodec/svq3.c
+++ b/libavcodec/svq3.c
@@ -889,8 +889,10 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
 
 static int svq3_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     MpegEncContext *const s = avctx->priv_data;
     H264Context *const h = avctx->priv_data;
     int m, mb_type;
diff --git a/libavcodec/targa.c b/libavcodec/targa.c
index 56a6876ec4a..10b1aa47f25 100644
--- a/libavcodec/targa.c
+++ b/libavcodec/targa.c
@@ -91,8 +91,10 @@ static void targa_decode_rle(AVCodecContext *avctx, TargaContext *s, const uint8
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TargaContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&s->picture;
diff --git a/libavcodec/tiertexseqv.c b/libavcodec/tiertexseqv.c
index fdf635864e5..09703707134 100644
--- a/libavcodec/tiertexseqv.c
+++ b/libavcodec/tiertexseqv.c
@@ -187,8 +187,10 @@ static av_cold int seqvideo_decode_init(AVCodecContext *avctx)
 
 static int seqvideo_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 
     SeqVideoContext *seq = avctx->priv_data;
 
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 503f8312f06..78051933c9c 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -404,8 +404,10 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TiffContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&s->picture;
diff --git a/libavcodec/truemotion1.c b/libavcodec/truemotion1.c
index 1cf56ed3dd5..303dfb5c15f 100644
--- a/libavcodec/truemotion1.c
+++ b/libavcodec/truemotion1.c
@@ -846,8 +846,10 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
 
 static int truemotion1_decode_frame(AVCodecContext *avctx,
                                     void *data, int *data_size,
-                                    const uint8_t *buf, int buf_size)
+                                    AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TrueMotion1Context *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c
index 6349565f2d7..b3289162ee0 100644
--- a/libavcodec/truemotion2.c
+++ b/libavcodec/truemotion2.c
@@ -763,8 +763,10 @@ static const int tm2_stream_order[TM2_NUM_STREAMS] = {
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TM2Context * const l = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&l->pic;
     int i, skip, t;
diff --git a/libavcodec/truespeech.c b/libavcodec/truespeech.c
index df5d57bbcc3..598d414832a 100644
--- a/libavcodec/truespeech.c
+++ b/libavcodec/truespeech.c
@@ -332,8 +332,10 @@ static void truespeech_save_prevvec(TSContext *c)
 
 static int truespeech_decode_frame(AVCodecContext *avctx,
                 void *data, int *data_size,
-                const uint8_t *buf, int buf_size)
+                AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TSContext *c = avctx->priv_data;
 
     int i, j;
diff --git a/libavcodec/tscc.c b/libavcodec/tscc.c
index 0ffb1644ba8..8e5edbd6083 100644
--- a/libavcodec/tscc.c
+++ b/libavcodec/tscc.c
@@ -67,8 +67,10 @@ typedef struct TsccContext {
  * Decode a frame
  *
  */
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     CamtasiaContext * const c = avctx->priv_data;
     const unsigned char *encoded = buf;
     unsigned char *outptr;
diff --git a/libavcodec/tta.c b/libavcodec/tta.c
index 5536aa4cd9b..3ab31e66295 100644
--- a/libavcodec/tta.c
+++ b/libavcodec/tta.c
@@ -287,8 +287,10 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
 
 static int tta_decode_frame(AVCodecContext *avctx,
         void *data, int *data_size,
-        const uint8_t *buf, int buf_size)
+        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TTAContext *s = avctx->priv_data;
     int i;
 
diff --git a/libavcodec/txd.c b/libavcodec/txd.c
index 44bbad4cab1..d2c743feed7 100644
--- a/libavcodec/txd.c
+++ b/libavcodec/txd.c
@@ -39,7 +39,9 @@ static av_cold int txd_init(AVCodecContext *avctx) {
 }
 
 static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                            const uint8_t *buf, int buf_size) {
+                            AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TXDContext * const s = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p = &s->picture;
diff --git a/libavcodec/ulti.c b/libavcodec/ulti.c
index efc05924c36..31649f86583 100644
--- a/libavcodec/ulti.c
+++ b/libavcodec/ulti.c
@@ -200,8 +200,10 @@ static void ulti_grad(AVFrame *frame, int x, int y, uint8_t *Y, int chroma, int
 
 static int ulti_decode_frame(AVCodecContext *avctx,
                              void *data, int *data_size,
-                             const uint8_t *buf, int buf_size)
+                             AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     UltimotionDecodeContext *s=avctx->priv_data;
     int modifier = 0;
     int uniq = 0;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 4113382997d..f39b49d5119 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -524,18 +524,32 @@ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
     return ret;
 }
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
                          int *got_picture_ptr,
                          const uint8_t *buf, int buf_size)
+{
+    AVPacket avpkt;
+    av_init_packet(&avpkt);
+    avpkt.data = buf;
+    avpkt.size = buf_size;
+
+    return avcodec_decode_video2(avctx, picture, got_picture_ptr, &avpkt);
+}
+#endif
+
+int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
+                         int *got_picture_ptr,
+                         AVPacket *avpkt)
 {
     int ret;
 
     *got_picture_ptr= 0;
     if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height))
         return -1;
-    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
+    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
         ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
-                                buf, buf_size);
+                                avpkt);
 
         emms_c(); //needed to avoid an emms_c() call before every return;
 
@@ -547,13 +561,27 @@ int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *pic
     return ret;
 }
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
                          int *frame_size_ptr,
                          const uint8_t *buf, int buf_size)
+{
+    AVPacket avpkt;
+    av_init_packet(&avpkt);
+    avpkt.data = buf;
+    avpkt.size = buf_size;
+
+    return avcodec_decode_audio3(avctx, samples, frame_size_ptr, &avpkt);
+}
+#endif
+
+int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
+                         int *frame_size_ptr,
+                         AVPacket *avpkt)
 {
     int ret;
 
-    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
+    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
         //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
         if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
             av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n");
@@ -565,8 +593,7 @@ int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *sa
             return -1;
         }
 
-        ret = avctx->codec->decode(avctx, samples, frame_size_ptr,
-                                buf, buf_size);
+        ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt);
         avctx->frame_number++;
     }else{
         ret= 0;
@@ -575,15 +602,28 @@ int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *sa
     return ret;
 }
 
+#if LIBAVCODEC_VERSION_MAJOR < 53
 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
                             int *got_sub_ptr,
                             const uint8_t *buf, int buf_size)
+{
+    AVPacket avpkt;
+    av_init_packet(&avpkt);
+    avpkt.data = buf;
+    avpkt.size = buf_size;
+
+    return avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, &avpkt);
+}
+#endif
+
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+                            int *got_sub_ptr,
+                            AVPacket *avpkt)
 {
     int ret;
 
     *got_sub_ptr = 0;
-    ret = avctx->codec->decode(avctx, sub, got_sub_ptr,
-                               buf, buf_size);
+    ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt);
     if (*got_sub_ptr)
         avctx->frame_number++;
     return ret;
diff --git a/libavcodec/vb.c b/libavcodec/vb.c
index 4c927888975..b95fa1a9c7c 100644
--- a/libavcodec/vb.c
+++ b/libavcodec/vb.c
@@ -173,8 +173,10 @@ static int vb_decode_framedata(VBDecContext *c, const uint8_t *buf, int offset)
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VBDecContext * const c = avctx->priv_data;
     uint8_t *outptr, *srcptr;
     int i, j;
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 3c391c678a7..f3d3cd4ed1b 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -4136,8 +4136,10 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
  */
 static int vc1_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VC1Context *v = avctx->priv_data;
     MpegEncContext *s = &v->s;
     AVFrame *pict = data;
diff --git a/libavcodec/vcr1.c b/libavcodec/vcr1.c
index 21136289d51..6218c7c6348 100644
--- a/libavcodec/vcr1.c
+++ b/libavcodec/vcr1.c
@@ -43,8 +43,10 @@ typedef struct VCR1Context{
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VCR1Context * const a = avctx->priv_data;
     AVFrame *picture = data;
     AVFrame * const p= (AVFrame*)&a->picture;
diff --git a/libavcodec/vmdav.c b/libavcodec/vmdav.c
index 1921c81ca27..2c24355a5fe 100644
--- a/libavcodec/vmdav.c
+++ b/libavcodec/vmdav.c
@@ -366,8 +366,10 @@ static av_cold int vmdvideo_decode_init(AVCodecContext *avctx)
 
 static int vmdvideo_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VmdVideoContext *s = avctx->priv_data;
 
     s->buf = buf;
@@ -521,8 +523,10 @@ static int vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data,
 
 static int vmdaudio_decode_frame(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VmdAudioContext *s = avctx->priv_data;
     unsigned char *output_samples = (unsigned char *)data;
 
diff --git a/libavcodec/vmnc.c b/libavcodec/vmnc.c
index c7efaf8a2f9..fb78449d285 100644
--- a/libavcodec/vmnc.c
+++ b/libavcodec/vmnc.c
@@ -284,8 +284,10 @@ static int decode_hextile(VmncContext *c, uint8_t* dst, const uint8_t* src, int
     return src - ssrc;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VmncContext * const c = avctx->priv_data;
     uint8_t *outptr;
     const uint8_t *src = buf;
diff --git a/libavcodec/vorbis_dec.c b/libavcodec/vorbis_dec.c
index 6ca8763bb3f..77dbfa2e93e 100644
--- a/libavcodec/vorbis_dec.c
+++ b/libavcodec/vorbis_dec.c
@@ -1560,8 +1560,10 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
 
 static int vorbis_decode_frame(AVCodecContext *avccontext,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     vorbis_context *vc = avccontext->priv_data ;
     GetBitContext *gb = &(vc->gb);
     const float *channel_ptrs[vc->audio_channels];
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 64901616cca..33d6c8f74b6 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -1800,8 +1800,10 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
  */
 static int vp3_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     Vp3DecodeContext *s = avctx->priv_data;
     GetBitContext gb;
     static int counter = 0;
diff --git a/libavcodec/vqavideo.c b/libavcodec/vqavideo.c
index 00df736d3bd..5026989070b 100644
--- a/libavcodec/vqavideo.c
+++ b/libavcodec/vqavideo.c
@@ -565,8 +565,10 @@ static void vqa_decode_chunk(VqaContext *s)
 
 static int vqa_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VqaContext *s = avctx->priv_data;
 
     s->buf = buf;
diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c
index 12eac33fe76..1c1406f8c73 100644
--- a/libavcodec/wavpack.c
+++ b/libavcodec/wavpack.c
@@ -476,8 +476,10 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
 
 static int wavpack_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     WavpackContext *s = avctx->priv_data;
     int16_t *samples = data;
     int samplecount;
diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c
index e7936ce49f2..323f69d303b 100644
--- a/libavcodec/wmadec.c
+++ b/libavcodec/wmadec.c
@@ -752,8 +752,10 @@ static int wma_decode_frame(WMACodecContext *s, int16_t *samples)
 
 static int wma_decode_superframe(AVCodecContext *avctx,
                                  void *data, int *data_size,
-                                 const uint8_t *buf, int buf_size)
+                                 AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     WMACodecContext *s = avctx->priv_data;
     int nb_frames, bit_offset, i, pos, len;
     uint8_t *q;
diff --git a/libavcodec/wnv1.c b/libavcodec/wnv1.c
index 7c0105f1eff..fa3a308dc06 100644
--- a/libavcodec/wnv1.c
+++ b/libavcodec/wnv1.c
@@ -58,8 +58,10 @@ static inline int wnv1_get_code(WNV1Context *w, int base_value)
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     WNV1Context * const l = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&l->pic;
     unsigned char *Y,*U,*V;
diff --git a/libavcodec/ws-snd1.c b/libavcodec/ws-snd1.c
index b27b1551359..85e04f55d4f 100644
--- a/libavcodec/ws-snd1.c
+++ b/libavcodec/ws-snd1.c
@@ -48,8 +48,10 @@ static av_cold int ws_snd_decode_init(AVCodecContext * avctx)
 
 static int ws_snd_decode_frame(AVCodecContext *avctx,
                 void *data, int *data_size,
-                const uint8_t *buf, int buf_size)
+                AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
 //    WSSNDContext *c = avctx->priv_data;
 
     int in_size, out_size;
diff --git a/libavcodec/xan.c b/libavcodec/xan.c
index e269c2fcf63..65c65283b18 100644
--- a/libavcodec/xan.c
+++ b/libavcodec/xan.c
@@ -405,8 +405,10 @@ static void xan_wc4_decode_frame(XanContext *s) {
 
 static int xan_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            const uint8_t *buf, int buf_size)
+                            AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     XanContext *s = avctx->priv_data;
     AVPaletteControl *palette_control = avctx->palctrl;
 
diff --git a/libavcodec/xl.c b/libavcodec/xl.c
index ccff40e17a4..fb4241f255a 100644
--- a/libavcodec/xl.c
+++ b/libavcodec/xl.c
@@ -40,8 +40,10 @@ static const int xl_table[32] = {
 
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     VideoXLContext * const a = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&a->pic;
     uint8_t *Y, *U, *V;
diff --git a/libavcodec/xsubdec.c b/libavcodec/xsubdec.c
index 35b00a54b4c..942db0cd1bf 100644
--- a/libavcodec/xsubdec.c
+++ b/libavcodec/xsubdec.c
@@ -44,7 +44,9 @@ static uint64_t parse_timecode(const uint8_t *buf) {
 }
 
 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                        const uint8_t *buf, int buf_size) {
+                        AVPacket *avpkt) {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     AVSubtitle *sub = data;
     const uint8_t *buf_end = buf + buf_size;
     uint8_t *bitmap;
diff --git a/libavcodec/zmbv.c b/libavcodec/zmbv.c
index 33c1087e2d8..7b3c7dd3f6d 100644
--- a/libavcodec/zmbv.c
+++ b/libavcodec/zmbv.c
@@ -392,8 +392,10 @@ static int zmbv_decode_intra(ZmbvContext *c)
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size)
+static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     ZmbvContext * const c = avctx->priv_data;
     uint8_t *outptr;
     int zret = Z_OK; // Zlib return code
-- 
GitLab