changeset 6884:a790b3ee61b9 libavcodec

add error concealment
author jbr
date Sun, 25 May 2008 18:05:15 +0000
parents 63fadff777e2
children 5554f5ab2c19
files ac3dec.c
diffstat 1 files changed, 7 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/ac3dec.c	Sun May 25 17:06:14 2008 +0000
+++ b/ac3dec.c	Sun May 25 18:05:15 2008 +0000
@@ -1154,8 +1154,8 @@
     if(err) {
         switch(err) {
             case AC3_PARSE_ERROR_SYNC:
-                av_log(avctx, AV_LOG_ERROR, "frame sync error\n");
-                break;
+                av_log(avctx, AV_LOG_ERROR, "frame sync error : cannot use error concealment\n");
+                return -1;
             case AC3_PARSE_ERROR_BSID:
                 av_log(avctx, AV_LOG_ERROR, "invalid bitstream id\n");
                 break;
@@ -1172,7 +1172,6 @@
                 av_log(avctx, AV_LOG_ERROR, "invalid header\n");
                 break;
         }
-        return -1;
     }
 
     /* check that reported frame size fits in input buffer */
@@ -1185,11 +1184,12 @@
     if(avctx->error_resilience >= FF_ER_CAREFUL) {
         if(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &buf[2], s->frame_size-2)) {
             av_log(avctx, AV_LOG_ERROR, "frame CRC mismatch\n");
-            return -1;
+            err = 1;
         }
-        /* TODO: error concealment */
     }
 
+    /* if frame is ok, set audio parameters */
+    if (!err) {
     avctx->sample_rate = s->sample_rate;
     avctx->bit_rate = s->bit_rate;
 
@@ -1207,13 +1207,12 @@
             s->fbw_channels == s->out_channels)) {
         set_downmix_coeffs(s);
     }
+    }
 
     /* parse the audio blocks */
     for (blk = 0; blk < NB_BLOCKS; blk++) {
-        if (ac3_parse_audio_block(s, blk)) {
+        if (!err && ac3_parse_audio_block(s, blk)) {
             av_log(avctx, AV_LOG_ERROR, "error parsing the audio block\n");
-            *data_size = 0;
-            return s->frame_size;
         }
         for (i = 0; i < 256; i++)
             for (ch = 0; ch < s->out_channels; ch++)