diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c index 7f43e6307f..0b10b41848 100644 --- a/libavcodec/eac3dec.c +++ b/libavcodec/eac3dec.c @@ -420,21 +420,21 @@ int ff_eac3_parse_header(AC3DecodeContext *s) /* determine which channels use AHT */ if (parse_aht_info) { - /* AHT is only available when there are 6 blocks in the frame. - The coupling channel can only use AHT when coupling is in use for - all blocks. - reference: Section E3.3.2 Bit Stream Helper Variables */ + /* For AHT to be used, all non-zero blocks must reuse exponents from + the first block. Furthermore, for AHT to be used in the coupling + channel, all blocks must use coupling and use the same coupling + strategy. */ s->channel_uses_aht[CPL_CH]=0; for (ch = (num_cpl_blocks != 6); ch <= s->channels; ch++) { - int nchregs = 0; - for (blk = 0; blk < 6; blk++) { - if (ch) - nchregs += (s->exp_strategy[blk][ch] != EXP_REUSE); - else - nchregs += s->cpl_strategy_exists[blk] || - (s->exp_strategy[blk][CPL_CH] != EXP_REUSE); + int use_aht = 1; + for (blk = 1; blk < 6; blk++) { + if ((s->exp_strategy[blk][ch] != EXP_REUSE) || + (!ch && s->cpl_strategy_exists[blk])) { + use_aht = 0; + break; + } } - s->channel_uses_aht[ch] = (nchregs == 1) && get_bits1(gbc); + s->channel_uses_aht[ch] = use_aht && get_bits1(gbc); } } else { memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht));