|
|
|
@ -1215,11 +1215,11 @@ static void count_frame_bits_fixed(AC3EncodeContext *s) |
|
|
|
|
/* audio blocks */ |
|
|
|
|
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
/* block switch flags */ |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
/* block switch flags */ |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
|
|
|
|
|
/* dither flags */ |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
/* dither flags */ |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* dynamic range */ |
|
|
|
@ -1230,15 +1230,15 @@ static void count_frame_bits_fixed(AC3EncodeContext *s) |
|
|
|
|
frame_bits++; |
|
|
|
|
|
|
|
|
|
if (!s->eac3) { |
|
|
|
|
/* exponent strategy */ |
|
|
|
|
frame_bits += 2 * s->fbw_channels; |
|
|
|
|
if (s->lfe_on) |
|
|
|
|
frame_bits++; |
|
|
|
|
/* exponent strategy */ |
|
|
|
|
frame_bits += 2 * s->fbw_channels; |
|
|
|
|
if (s->lfe_on) |
|
|
|
|
frame_bits++; |
|
|
|
|
|
|
|
|
|
/* bit allocation params */ |
|
|
|
|
frame_bits++; |
|
|
|
|
if (!blk) |
|
|
|
|
frame_bits += 2 + 2 + 2 + 2 + 3; |
|
|
|
|
/* bit allocation params */ |
|
|
|
|
frame_bits++; |
|
|
|
|
if (!blk) |
|
|
|
|
frame_bits += 2 + 2 + 2 + 2 + 3; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* converter snr offset */ |
|
|
|
@ -1246,11 +1246,11 @@ static void count_frame_bits_fixed(AC3EncodeContext *s) |
|
|
|
|
frame_bits++; |
|
|
|
|
|
|
|
|
|
if (!s->eac3) { |
|
|
|
|
/* delta bit allocation */ |
|
|
|
|
frame_bits++; |
|
|
|
|
/* delta bit allocation */ |
|
|
|
|
frame_bits++; |
|
|
|
|
|
|
|
|
|
/* skipped data */ |
|
|
|
|
frame_bits++; |
|
|
|
|
/* skipped data */ |
|
|
|
|
frame_bits++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1326,14 +1326,14 @@ static void count_frame_bits(AC3EncodeContext *s) |
|
|
|
|
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) |
|
|
|
|
frame_bits += 2 * s->blocks[blk].cpl_in_use; |
|
|
|
|
} else { |
|
|
|
|
if (opt->audio_production_info) |
|
|
|
|
frame_bits += 7; |
|
|
|
|
if (s->bitstream_id == 6) { |
|
|
|
|
if (opt->extended_bsi_1) |
|
|
|
|
frame_bits += 14; |
|
|
|
|
if (opt->extended_bsi_2) |
|
|
|
|
frame_bits += 14; |
|
|
|
|
} |
|
|
|
|
if (opt->audio_production_info) |
|
|
|
|
frame_bits += 7; |
|
|
|
|
if (s->bitstream_id == 6) { |
|
|
|
|
if (opt->extended_bsi_1) |
|
|
|
|
frame_bits += 14; |
|
|
|
|
if (opt->extended_bsi_2) |
|
|
|
|
frame_bits += 14; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* audio blocks */ |
|
|
|
@ -1342,22 +1342,22 @@ static void count_frame_bits(AC3EncodeContext *s) |
|
|
|
|
|
|
|
|
|
/* coupling strategy */ |
|
|
|
|
if (!s->eac3) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->new_cpl_strategy) { |
|
|
|
|
if (!s->eac3) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->cpl_in_use) { |
|
|
|
|
if (s->eac3) |
|
|
|
|
frame_bits++; |
|
|
|
|
if (!s->eac3 || s->channel_mode != AC3_CHMODE_STEREO) |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
frame_bits += s->fbw_channels; |
|
|
|
|
if (s->channel_mode == AC3_CHMODE_STEREO) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits += 4 + 4; |
|
|
|
|
if (s->eac3) |
|
|
|
|
frame_bits++; |
|
|
|
|
else |
|
|
|
|
frame_bits += s->num_cpl_subbands - 1; |
|
|
|
|
frame_bits += s->num_cpl_subbands - 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1366,7 +1366,7 @@ static void count_frame_bits(AC3EncodeContext *s) |
|
|
|
|
for (ch = 1; ch <= s->fbw_channels; ch++) { |
|
|
|
|
if (block->channel_in_cpl[ch]) { |
|
|
|
|
if (!s->eac3 || block->new_cpl_coords != 2) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->new_cpl_coords) { |
|
|
|
|
frame_bits += 2; |
|
|
|
|
frame_bits += (4 + 4) * s->num_cpl_bands; |
|
|
|
@ -1378,7 +1378,7 @@ static void count_frame_bits(AC3EncodeContext *s) |
|
|
|
|
/* stereo rematrixing */ |
|
|
|
|
if (s->channel_mode == AC3_CHMODE_STEREO) { |
|
|
|
|
if (!s->eac3 || blk > 0) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits++; |
|
|
|
|
if (s->blocks[blk].new_rematrixing_strategy) |
|
|
|
|
frame_bits += block->num_rematrixing_bands; |
|
|
|
|
} |
|
|
|
@ -1398,15 +1398,15 @@ static void count_frame_bits(AC3EncodeContext *s) |
|
|
|
|
|
|
|
|
|
/* snr offsets and fast gain codes */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->new_snr_offsets) |
|
|
|
|
frame_bits += 6 + (s->channels + block->cpl_in_use) * (4 + 3); |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->new_snr_offsets) |
|
|
|
|
frame_bits += 6 + (s->channels + block->cpl_in_use) * (4 + 3); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* coupling leak info */ |
|
|
|
|
if (block->cpl_in_use) { |
|
|
|
|
if (!s->eac3 || block->new_cpl_leak != 2) |
|
|
|
|
frame_bits++; |
|
|
|
|
frame_bits++; |
|
|
|
|
if (block->new_cpl_leak) |
|
|
|
|
frame_bits += 3 + 3; |
|
|
|
|
} |
|
|
|
@ -1971,14 +1971,14 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
|
|
|
|
|
/* block switching */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
for (ch = 0; ch < s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, 0); |
|
|
|
|
for (ch = 0; ch < s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* dither flags */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
for (ch = 0; ch < s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, 1); |
|
|
|
|
for (ch = 0; ch < s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* dynamic range codes */ |
|
|
|
@ -1990,17 +1990,17 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
|
|
|
|
|
/* channel coupling */ |
|
|
|
|
if (!s->eac3) |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_strategy); |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_strategy); |
|
|
|
|
if (block->new_cpl_strategy) { |
|
|
|
|
if (!s->eac3) |
|
|
|
|
put_bits(&s->pb, 1, block->cpl_in_use); |
|
|
|
|
put_bits(&s->pb, 1, block->cpl_in_use); |
|
|
|
|
if (block->cpl_in_use) { |
|
|
|
|
int start_sub, end_sub; |
|
|
|
|
if (s->eac3) |
|
|
|
|
put_bits(&s->pb, 1, 0); /* enhanced coupling */ |
|
|
|
|
if (!s->eac3 || s->channel_mode != AC3_CHMODE_STEREO) { |
|
|
|
|
for (ch = 1; ch <= s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, block->channel_in_cpl[ch]); |
|
|
|
|
for (ch = 1; ch <= s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 1, block->channel_in_cpl[ch]); |
|
|
|
|
} |
|
|
|
|
if (s->channel_mode == AC3_CHMODE_STEREO) |
|
|
|
|
put_bits(&s->pb, 1, 0); /* phase flags in use */ |
|
|
|
@ -2012,8 +2012,8 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
if (s->eac3) { |
|
|
|
|
put_bits(&s->pb, 1, 0); /* use default */ |
|
|
|
|
} else { |
|
|
|
|
for (bnd = start_sub+1; bnd < end_sub; bnd++) |
|
|
|
|
put_bits(&s->pb, 1, ff_eac3_default_cpl_band_struct[bnd]); |
|
|
|
|
for (bnd = start_sub+1; bnd < end_sub; bnd++) |
|
|
|
|
put_bits(&s->pb, 1, ff_eac3_default_cpl_band_struct[bnd]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -2023,7 +2023,7 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
for (ch = 1; ch <= s->fbw_channels; ch++) { |
|
|
|
|
if (block->channel_in_cpl[ch]) { |
|
|
|
|
if (!s->eac3 || block->new_cpl_coords != 2) |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_coords); |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_coords); |
|
|
|
|
if (block->new_cpl_coords) { |
|
|
|
|
put_bits(&s->pb, 2, block->cpl_master_exp[ch]); |
|
|
|
|
for (bnd = 0; bnd < s->num_cpl_bands; bnd++) { |
|
|
|
@ -2038,7 +2038,7 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
/* stereo rematrixing */ |
|
|
|
|
if (s->channel_mode == AC3_CHMODE_STEREO) { |
|
|
|
|
if (!s->eac3 || blk > 0) |
|
|
|
|
put_bits(&s->pb, 1, block->new_rematrixing_strategy); |
|
|
|
|
put_bits(&s->pb, 1, block->new_rematrixing_strategy); |
|
|
|
|
if (block->new_rematrixing_strategy) { |
|
|
|
|
/* rematrixing flags */ |
|
|
|
|
for (bnd = 0; bnd < block->num_rematrixing_bands; bnd++) |
|
|
|
@ -2048,10 +2048,10 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
|
|
|
|
|
/* exponent strategy */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
for (ch = !block->cpl_in_use; ch <= s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 2, s->exp_strategy[ch][blk]); |
|
|
|
|
if (s->lfe_on) |
|
|
|
|
put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]); |
|
|
|
|
for (ch = !block->cpl_in_use; ch <= s->fbw_channels; ch++) |
|
|
|
|
put_bits(&s->pb, 2, s->exp_strategy[ch][blk]); |
|
|
|
|
if (s->lfe_on) |
|
|
|
|
put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* bandwidth */ |
|
|
|
@ -2083,27 +2083,27 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
|
|
|
|
|
/* bit allocation info */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
baie = (blk == 0); |
|
|
|
|
put_bits(&s->pb, 1, baie); |
|
|
|
|
if (baie) { |
|
|
|
|
put_bits(&s->pb, 2, s->slow_decay_code); |
|
|
|
|
put_bits(&s->pb, 2, s->fast_decay_code); |
|
|
|
|
put_bits(&s->pb, 2, s->slow_gain_code); |
|
|
|
|
put_bits(&s->pb, 2, s->db_per_bit_code); |
|
|
|
|
put_bits(&s->pb, 3, s->floor_code); |
|
|
|
|
} |
|
|
|
|
baie = (blk == 0); |
|
|
|
|
put_bits(&s->pb, 1, baie); |
|
|
|
|
if (baie) { |
|
|
|
|
put_bits(&s->pb, 2, s->slow_decay_code); |
|
|
|
|
put_bits(&s->pb, 2, s->fast_decay_code); |
|
|
|
|
put_bits(&s->pb, 2, s->slow_gain_code); |
|
|
|
|
put_bits(&s->pb, 2, s->db_per_bit_code); |
|
|
|
|
put_bits(&s->pb, 3, s->floor_code); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* snr offset */ |
|
|
|
|
if (!s->eac3) { |
|
|
|
|
put_bits(&s->pb, 1, block->new_snr_offsets); |
|
|
|
|
if (block->new_snr_offsets) { |
|
|
|
|
put_bits(&s->pb, 6, s->coarse_snr_offset); |
|
|
|
|
for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { |
|
|
|
|
put_bits(&s->pb, 4, s->fine_snr_offset[ch]); |
|
|
|
|
put_bits(&s->pb, 3, s->fast_gain_code[ch]); |
|
|
|
|
put_bits(&s->pb, 1, block->new_snr_offsets); |
|
|
|
|
if (block->new_snr_offsets) { |
|
|
|
|
put_bits(&s->pb, 6, s->coarse_snr_offset); |
|
|
|
|
for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { |
|
|
|
|
put_bits(&s->pb, 4, s->fine_snr_offset[ch]); |
|
|
|
|
put_bits(&s->pb, 3, s->fast_gain_code[ch]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
put_bits(&s->pb, 1, 0); /* no converter snr offset */ |
|
|
|
|
} |
|
|
|
@ -2111,7 +2111,7 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
/* coupling leak */ |
|
|
|
|
if (block->cpl_in_use) { |
|
|
|
|
if (!s->eac3 || block->new_cpl_leak != 2) |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_leak); |
|
|
|
|
put_bits(&s->pb, 1, block->new_cpl_leak); |
|
|
|
|
if (block->new_cpl_leak) { |
|
|
|
|
put_bits(&s->pb, 3, s->bit_alloc.cpl_fast_leak); |
|
|
|
|
put_bits(&s->pb, 3, s->bit_alloc.cpl_slow_leak); |
|
|
|
@ -2119,8 +2119,8 @@ static void output_audio_block(AC3EncodeContext *s, int blk) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!s->eac3) { |
|
|
|
|
put_bits(&s->pb, 1, 0); /* no delta bit allocation */ |
|
|
|
|
put_bits(&s->pb, 1, 0); /* no data to skip */ |
|
|
|
|
put_bits(&s->pb, 1, 0); /* no delta bit allocation */ |
|
|
|
|
put_bits(&s->pb, 1, 0); /* no data to skip */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* mantissas */ |
|
|
|
@ -2265,11 +2265,11 @@ static void dprint_options(AVCodecContext *avctx) |
|
|
|
|
char strbuf[32]; |
|
|
|
|
|
|
|
|
|
switch (s->bitstream_id) { |
|
|
|
|
case 6: av_strlcpy(strbuf, "AC-3 (alt syntax)", 32); break; |
|
|
|
|
case 8: av_strlcpy(strbuf, "AC-3 (standard)", 32); break; |
|
|
|
|
case 9: av_strlcpy(strbuf, "AC-3 (dnet half-rate)", 32); break; |
|
|
|
|
case 10: av_strlcpy(strbuf, "AC-3 (dnet quater-rate", 32); break; |
|
|
|
|
case 16: av_strlcpy(strbuf, "E-AC-3 (enhanced)", 32); break; |
|
|
|
|
case 6: av_strlcpy(strbuf, "AC-3 (alt syntax)", 32); break; |
|
|
|
|
case 8: av_strlcpy(strbuf, "AC-3 (standard)", 32); break; |
|
|
|
|
case 9: av_strlcpy(strbuf, "AC-3 (dnet half-rate)", 32); break; |
|
|
|
|
case 10: av_strlcpy(strbuf, "AC-3 (dnet quater-rate)", 32); break; |
|
|
|
|
case 16: av_strlcpy(strbuf, "E-AC-3 (enhanced)", 32); break; |
|
|
|
|
default: snprintf(strbuf, 32, "ERROR"); |
|
|
|
|
} |
|
|
|
|
av_dlog(avctx, "bitstream_id: %s (%d)\n", strbuf, s->bitstream_id); |
|
|
|
@ -2730,16 +2730,16 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) |
|
|
|
|
wpf--; |
|
|
|
|
s->frame_size_min = 2 * wpf; |
|
|
|
|
} else { |
|
|
|
|
for (i = 0; i < 19; i++) { |
|
|
|
|
if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == avctx->bit_rate) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (i == 19) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "invalid bit rate\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
s->frame_size_code = i << 1; |
|
|
|
|
s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code]; |
|
|
|
|
for (i = 0; i < 19; i++) { |
|
|
|
|
if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == avctx->bit_rate) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (i == 19) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "invalid bit rate\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
s->frame_size_code = i << 1; |
|
|
|
|
s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code]; |
|
|
|
|
} |
|
|
|
|
s->bit_rate = avctx->bit_rate; |
|
|
|
|
s->frame_size = s->frame_size_min; |
|
|
|
@ -2766,9 +2766,9 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!s->eac3) { |
|
|
|
|
ret = validate_metadata(avctx); |
|
|
|
|
if (ret) |
|
|
|
|
return ret; |
|
|
|
|
ret = validate_metadata(avctx); |
|
|
|
|
if (ret) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
s->rematrixing_enabled = s->options.stereo_rematrixing && |
|
|
|
|