*/
#include "avcodec.h"
+#include "internal.h"
#include "ac3.h"
#include "ac3_parser.h"
#include "ac3dec.h"
/* Vector Quantization */
int v = get_bits(gbc, bits);
for (blk = 0; blk < 6; blk++) {
- s->pre_mantissa[ch][bin][blk] = ff_eac3_vq_hebap[hebap][v][blk] << 8;
+ s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] << 8;
}
} else {
/* Gain Adaptive Quantization */
application can select from. each independent stream can also contain
dependent streams which are used to add or replace channels. */
if (s->frame_type == EAC3_FRAME_TYPE_DEPENDENT) {
- av_log_missing_feature(s->avctx, "Dependent substream decoding", 1);
+ ff_log_missing_feature(s->avctx, "Dependent substream decoding", 1);
return AC3_PARSE_ERROR_FRAME_TYPE;
} else if (s->frame_type == EAC3_FRAME_TYPE_RESERVED) {
av_log(s->avctx, AV_LOG_ERROR, "Reserved frame type\n");
associated to an independent stream have matching substream id's. */
if (s->substreamid) {
/* only decode substream with id=0. skip any additional substreams. */
- av_log_missing_feature(s->avctx, "Additional substreams", 1);
+ ff_log_missing_feature(s->avctx, "Additional substreams", 1);
return AC3_PARSE_ERROR_FRAME_TYPE;
}
rates in bit allocation. The best assumption would be that it is
handled like AC-3 DolbyNet, but we cannot be sure until we have a
sample which utilizes this feature. */
- av_log_missing_feature(s->avctx, "Reduced sampling rates", 1);
+ ff_log_missing_feature(s->avctx, "Reduced sampling rates", 1);
return -1;
}
skip_bits(gbc, 5); // skip bitstream id
/* original exponent strategies if this stream was converted from AC-3 */
if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT &&
(s->num_blocks == 6 || get_bits1(gbc))) {
- for (ch = 1; ch <= s->fbw_channels; ch++) {
- skip_bits(gbc, 5); // skip converter channel exponent strategy
- }
+ skip_bits(gbc, 5 * s->fbw_channels); // skip converter channel exponent strategy
}
/* 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));
/* spectral extension attenuation data */
if (parse_spx_atten_data) {
- av_log_missing_feature(s->avctx, "Spectral extension attenuation", 1);
+ ff_log_missing_feature(s->avctx, "Spectral extension attenuation", 1);
for (ch = 1; ch <= s->fbw_channels; ch++) {
if (get_bits1(gbc)) { // channel has spx attenuation
skip_bits(gbc, 5); // skip spx attenuation code
The spec does not say what this data is or what it's used for.
It is likely the offset of each block within the frame. */
int block_start_bits = (s->num_blocks-1) * (4 + av_log2(s->frame_size-2));
- skip_bits(gbc, block_start_bits);
+ skip_bits_long(gbc, block_start_bits);
+ ff_log_missing_feature(s->avctx, "Block start info", 1);
}
/* syntax state initialization */