[FFmpeg-cvslog] ac3dec: decode directly into output buffers

Mans Rullgard git at videolan.org
Mon Dec 10 04:51:00 CET 2012


ffmpeg | branch: master | Mans Rullgard <mans at mansr.com> | Thu Sep 13 19:40:03 2012 +0100| [ec5da7aee277e3e5265a632cd4e932e3d5487de7] | committer: Mans Rullgard

ac3dec: decode directly into output buffers

Signed-off-by: Mans Rullgard <mans at mansr.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ec5da7aee277e3e5265a632cd4e932e3d5487de7
---

 libavcodec/ac3dec.c |   27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index fe709de..acefe41 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -188,7 +188,6 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
     avctx->coded_frame = &s->frame;
 
     for (i = 0; i < AC3_MAX_CHANNELS; i++) {
-        s->outptr[i] = s->output[i];
         s->xcfptr[i] = s->transform_coeffs[i];
         s->dlyptr[i] = s->delay[i];
     }
@@ -607,14 +606,14 @@ static inline void do_imdct(AC3DecodeContext *s, int channels)
             for (i = 0; i < 128; i++)
                 x[i] = s->transform_coeffs[ch][2 * i];
             s->imdct_256.imdct_half(&s->imdct_256, s->tmp_output, x);
-            s->dsp.vector_fmul_window(s->output[ch - 1], s->delay[ch - 1],
+            s->dsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
                                       s->tmp_output, s->window, 128);
             for (i = 0; i < 128; i++)
                 x[i] = s->transform_coeffs[ch][2 * i + 1];
             s->imdct_256.imdct_half(&s->imdct_256, s->delay[ch - 1], x);
         } else {
             s->imdct_512.imdct_half(&s->imdct_512, s->tmp_output, s->transform_coeffs[ch]);
-            s->dsp.vector_fmul_window(s->output[ch - 1], s->delay[ch - 1],
+            s->dsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
                                       s->tmp_output, s->window, 128);
             memcpy(s->delay[ch - 1], s->tmp_output + 128, 128 * sizeof(float));
         }
@@ -1377,17 +1376,31 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data,
 
     /* decode the audio blocks */
     channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on];
-    for (ch = 0; ch < s->out_channels; ch++)
-        output[ch] = s->output[channel_map[ch]];
+    for (ch = 0; ch < s->channels; ch++) {
+        if (ch < s->out_channels)
+            s->outptr[channel_map[ch]] = (float *)s->frame.data[ch];
+        else
+            s->outptr[ch] = s->output[ch];
+        output[ch] = s->output[ch];
+    }
     for (blk = 0; blk < s->num_blocks; blk++) {
         if (!err && decode_audio_block(s, blk)) {
             av_log(avctx, AV_LOG_ERROR, "error decoding the audio block\n");
             err = 1;
         }
-        for (ch = 0; ch < s->out_channels; ch++)
-            memcpy(s->frame.data[ch] + blk * 1024, output[ch], 1024);
+        if (err)
+            for (ch = 0; ch < s->out_channels; ch++)
+                memcpy(s->outptr[channel_map[ch]], output[ch], 1024);
+        for (ch = 0; ch < s->out_channels; ch++) {
+            output[ch] = s->outptr[channel_map[ch]];
+            s->outptr[channel_map[ch]] += AC3_BLOCK_SIZE;
+        }
     }
 
+    /* keep last block for error concealment in next frame */
+    for (ch = 0; ch < s->out_channels; ch++)
+        memcpy(s->output[ch], output[ch], 1024);
+
     *got_frame_ptr   = 1;
     *(AVFrame *)data = s->frame;
 



More information about the ffmpeg-cvslog mailing list