diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2008-05-25 20:02:24 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2008-05-25 20:02:24 +0000 |
commit | eccba2bc4bde88755dc2a8569e44ea0373f5e0c7 (patch) | |
tree | a0a2c51d4619d17cb6a2c3ede90c156f17c616e7 | |
parent | 5012cf88a304a48629821cf29e3a795a647d17fc (diff) | |
download | ffmpeg-eccba2bc4bde88755dc2a8569e44ea0373f5e0c7.tar.gz |
safer solution for setting audio parameters
Originally committed as revision 13402 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/ac3dec.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index ab811f1c31..4272a6d35f 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -324,12 +324,6 @@ static int ac3_parse_header(AC3DecodeContext *s) s->center_mix_level = hdr.center_mix_level; s->surround_mix_level = hdr.surround_mix_level; - /* set default output to all source channels */ - s->out_channels = s->channels; - s->output_mode = s->channel_mode; - if(s->lfe_on) - s->output_mode |= AC3_OUTPUT_LFEON; - /* read the rest of the bsi. read twice for dual mono mode. */ i = !(s->channel_mode); do { @@ -1188,13 +1182,16 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, } } - /* if frame header is ok, set audio parameters */ - if (err >= 0) { + /* if frame is ok, set audio parameters */ + if (!err) { avctx->sample_rate = s->sample_rate; avctx->bit_rate = s->bit_rate; /* channel config */ s->out_channels = s->channels; + s->output_mode = s->channel_mode; + if(s->lfe_on) + s->output_mode |= AC3_OUTPUT_LFEON; if (avctx->request_channels > 0 && avctx->request_channels <= 2 && avctx->request_channels < s->channels) { s->out_channels = avctx->request_channels; @@ -1207,6 +1204,10 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, s->fbw_channels == s->out_channels)) { set_downmix_coeffs(s); } + } else if (!s->out_channels) { + s->out_channels = avctx->channels; + if(s->out_channels < s->channels) + s->output_mode = s->out_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO; } /* parse the audio blocks */ |