sonic: update to new API
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Mar 2012 14:10:33 +0000 (15:10 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Mar 2012 14:23:10 +0000 (15:23 +0100)
Fixes Ticket1075

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 6f9803e5e02c557e1003cface9f3084a7e1e43e4)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/sonic.c

index 71641f9..c2697ea 100644 (file)
@@ -44,6 +44,7 @@
 #define RIGHT_SIDE 2
 
 typedef struct SonicContext {
+    AVFrame frame;
     int lossless, decorrelation;
 
     int num_taps, downsampling;
@@ -757,6 +758,9 @@ static av_cold int sonic_decode_init(AVCodecContext *avctx)
     s->channels = avctx->channels;
     s->samplerate = avctx->sample_rate;
 
+    avcodec_get_frame_defaults(&s->frame);
+    avctx->coded_frame = &s->frame;
+
     if (!avctx->extradata)
     {
         av_log(avctx, AV_LOG_ERROR, "No mandatory headers present\n");
@@ -848,18 +852,25 @@ static av_cold int sonic_decode_close(AVCodecContext *avctx)
 }
 
 static int sonic_decode_frame(AVCodecContext *avctx,
-                            void *data, int *data_size,
+                            void *data, int *got_frame_ptr,
                             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;
-    short *samples = data;
+    int i, quant, ch, j, ret;
+    short *samples;
 
     if (buf_size == 0) return 0;
 
+    s->frame.nb_samples = s->frame_size;
+    if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+        return ret;
+    }
+    samples = s->frame.data[0];
+
 //    av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size);
 
     init_get_bits(&gb, buf, buf_size*8);
@@ -930,7 +941,8 @@ static int sonic_decode_frame(AVCodecContext *avctx,
 
     align_get_bits(&gb);
 
-    *data_size = s->frame_size * 2;
+    *got_frame_ptr = 1;
+    *(AVFrame*)data = s->frame;
 
     return (get_bits_count(&gb)+7)/8;
 }
@@ -943,6 +955,7 @@ AVCodec ff_sonic_decoder = {
     .init           = sonic_decode_init,
     .close          = sonic_decode_close,
     .decode         = sonic_decode_frame,
+    .capabilities   = CODEC_CAP_DR1,
     .long_name = NULL_IF_CONFIG_SMALL("Sonic"),
 };
 #endif /* CONFIG_SONIC_DECODER */