---
 libavcodec/mpc.h  |    1 +
 libavcodec/mpc7.c |   29 ++++++++++++++++++-----------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/libavcodec/mpc.h b/libavcodec/mpc.h
index 6d0f7b4..1a6e794 100644
--- a/libavcodec/mpc.h
+++ b/libavcodec/mpc.h
@@ -50,6 +50,7 @@ typedef struct {
 }Band;
 
 typedef struct {
+    AVFrame frame;
     DSPContext dsp;
     MPADSPContext mpadsp;
     GetBitContext gb;
diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
index 576400d..290ecfb 100644
--- a/libavcodec/mpc7.c
+++ b/libavcodec/mpc7.c
@@ -136,6 +136,10 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
         }
     }
     vlc_initialized = 1;
+
+    avcodec_get_frame_defaults(&c->frame);
+    avctx->coded_frame = &c->frame;
+
     return 0;
 }
 
@@ -192,9 +196,8 @@ static int get_scale_idx(GetBitContext *gb, int ref)
     return ref + t;
 }
 
-static int mpc7_decode_frame(AVCodecContext * avctx,
-                            void *data, int *data_size,
-                            AVPacket *avpkt)
+static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
+                             int *got_frame_ptr, AVPacket *avpkt)
 {
     const uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
@@ -204,7 +207,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
     int i, ch;
     int mb = -1;
     Band *bands = c->bands;
-    int off, out_size;
+    int off, ret;
     int bits_used, bits_avail;
 
     memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
@@ -213,10 +216,11 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
         return AVERROR(EINVAL);
     }
 
-    out_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
-    if (*data_size < out_size) {
-        av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
-        return AVERROR(EINVAL);
+    /* get output buffer */
+    c->frame.nb_samples = buf[1] ? c->lastframelen : MPC_FRAME_SIZE;
+    if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+        return ret;
     }
 
     bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE);
@@ -276,7 +280,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
         for(ch = 0; ch < 2; ch++)
             idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
 
-    ff_mpc_dequantize_and_synth(c, mb, data, 2);
+    ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);
 
     av_free(bits);
 
@@ -288,10 +292,12 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
     }
     if(c->frames_to_skip){
         c->frames_to_skip--;
-        *data_size = 0;
+        *got_frame_ptr = 0;
         return buf_size;
     }
-    *data_size = out_size;
+
+    *got_frame_ptr   = 1;
+    *(AVFrame *)data = c->frame;
 
     return buf_size;
 }
@@ -312,5 +318,6 @@ AVCodec ff_mpc7_decoder = {
     .init           = mpc7_decode_init,
     .decode         = mpc7_decode_frame,
     .flush = mpc7_decode_flush,
+    .capabilities   = CODEC_CAP_DR1,
     .long_name = NULL_IF_CONFIG_SMALL("Musepack SV7"),
 };
-- 
1.7.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to