Commit 6730e9f3 authored by Justin Ruggles's avatar Justin Ruggles

get the number of blocks from the ac3 parser and use in the ac3 decoder.

Originally committed as revision 13688 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 467ec3c1
...@@ -88,6 +88,7 @@ typedef struct { ...@@ -88,6 +88,7 @@ typedef struct {
int center_mix_level; ///< Center mix level index int center_mix_level; ///< Center mix level index
int surround_mix_level; ///< Surround mix level index int surround_mix_level; ///< Surround mix level index
uint16_t channel_map; uint16_t channel_map;
int num_blocks; ///< number of audio blocks
/** @} */ /** @} */
/** @defgroup derived Derived values /** @defgroup derived Derived values
......
...@@ -49,7 +49,6 @@ static const uint8_t surround_levels[4] = { 2, 4, 0, 4 }; ...@@ -49,7 +49,6 @@ static const uint8_t surround_levels[4] = { 2, 4, 0, 4 };
int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
{ {
int frame_size_code; int frame_size_code;
int num_blocks;
memset(hdr, 0, sizeof(*hdr)); memset(hdr, 0, sizeof(*hdr));
...@@ -62,6 +61,8 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) ...@@ -62,6 +61,8 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
if(hdr->bitstream_id > 16) if(hdr->bitstream_id > 16)
return AC3_PARSE_ERROR_BSID; return AC3_PARSE_ERROR_BSID;
hdr->num_blocks = 6;
if(hdr->bitstream_id <= 10) { if(hdr->bitstream_id <= 10) {
/* Normal AC-3 */ /* Normal AC-3 */
hdr->crc1 = get_bits(gbc, 16); hdr->crc1 = get_bits(gbc, 16);
...@@ -118,9 +119,8 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) ...@@ -118,9 +119,8 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
return AC3_PARSE_ERROR_SAMPLE_RATE; return AC3_PARSE_ERROR_SAMPLE_RATE;
hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2; hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2;
hdr->sr_shift = 1; hdr->sr_shift = 1;
num_blocks = 6;
} else { } else {
num_blocks = eac3_blocks[get_bits(gbc, 2)]; hdr->num_blocks = eac3_blocks[get_bits(gbc, 2)];
hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code]; hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code];
hdr->sr_shift = 0; hdr->sr_shift = 0;
} }
...@@ -129,7 +129,7 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr) ...@@ -129,7 +129,7 @@ int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
hdr->lfe_on = get_bits1(gbc); hdr->lfe_on = get_bits1(gbc);
hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate / hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate /
(num_blocks * 256.0)); (hdr->num_blocks * 256.0));
hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
} }
......
...@@ -111,6 +111,7 @@ static const uint8_t ac3_default_coeffs[8][5][2] = { ...@@ -111,6 +111,7 @@ static const uint8_t ac3_default_coeffs[8][5][2] = {
#define AC3_OUTPUT_LFEON 8 #define AC3_OUTPUT_LFEON 8
typedef struct { typedef struct {
int num_blocks; ///< number of audio blocks
int channel_mode; ///< channel mode (acmod) int channel_mode; ///< channel mode (acmod)
int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags
int dither_flag[AC3_MAX_CHANNELS]; ///< dither flags int dither_flag[AC3_MAX_CHANNELS]; ///< dither flags
...@@ -324,6 +325,7 @@ static int ac3_parse_header(AC3DecodeContext *s) ...@@ -324,6 +325,7 @@ static int ac3_parse_header(AC3DecodeContext *s)
s->frame_size = hdr.frame_size; s->frame_size = hdr.frame_size;
s->center_mix_level = hdr.center_mix_level; s->center_mix_level = hdr.center_mix_level;
s->surround_mix_level = hdr.surround_mix_level; s->surround_mix_level = hdr.surround_mix_level;
s->num_blocks = hdr.num_blocks;
if(s->lfe_on) { if(s->lfe_on) {
s->start_freq[s->lfe_ch] = 0; s->start_freq[s->lfe_ch] = 0;
...@@ -1206,7 +1208,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, ...@@ -1206,7 +1208,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
} }
/* parse the audio blocks */ /* parse the audio blocks */
for (blk = 0; blk < NB_BLOCKS; blk++) { for (blk = 0; blk < s->num_blocks; blk++) {
if (!err && 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"); av_log(avctx, AV_LOG_ERROR, "error parsing the audio block\n");
} }
...@@ -1216,7 +1218,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, ...@@ -1216,7 +1218,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
for (ch = 0; ch < s->out_channels; ch++) for (ch = 0; ch < s->out_channels; ch++)
*(out_samples++) = s->int_output[ch][i]; *(out_samples++) = s->int_output[ch][i];
} }
*data_size = NB_BLOCKS * 256 * avctx->channels * sizeof (int16_t); *data_size = s->num_blocks * 256 * avctx->channels * sizeof (int16_t);
return s->frame_size; return s->frame_size;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment