[FFmpeg-cvslog] Merge commit 'a5ebe5d1217942238c641c83b24ef1106e53934a'
Clément Bœsch
git at videolan.org
Wed Mar 15 22:45:27 EET 2017
ffmpeg | branch: master | Clément Bœsch <u at pkh.me> | Wed Mar 15 21:43:59 2017 +0100| [7c4dbd1df985b171252d0d8deaf3c87c82d710da] | committer: Clément Bœsch
Merge commit 'a5ebe5d1217942238c641c83b24ef1106e53934a'
* commit 'a5ebe5d1217942238c641c83b24ef1106e53934a':
ac3dec: Split spx-specific code from decode_audio_block()
Merged-by: Clément Bœsch <u at pkh.me>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7c4dbd1df985b171252d0d8deaf3c87c82d710da
---
libavcodec/ac3dec.c | 261 ++++++++++++++++++++++++++++------------------------
1 file changed, 139 insertions(+), 122 deletions(-)
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 4499160..bd17b69 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -801,6 +801,140 @@ static void decode_band_structure(GetBitContext *gbc, int blk, int eac3,
memcpy(band_sizes, bnd_sz, n_bands);
}
+static inline int spx_strategy(AC3DecodeContext *s, int blk)
+{
+ GetBitContext *bc = &s->gbc;
+ int fbw_channels = s->fbw_channels;
+ int dst_start_freq, dst_end_freq, src_start_freq,
+ start_subband, end_subband, ch;
+
+ /* determine which channels use spx */
+ if (s->channel_mode == AC3_CHMODE_MONO) {
+ s->channel_uses_spx[1] = 1;
+ } else {
+ for (ch = 1; ch <= fbw_channels; ch++)
+ s->channel_uses_spx[ch] = get_bits1(bc);
+ }
+
+ /* get the frequency bins of the spx copy region and the spx start
+ and end subbands */
+ dst_start_freq = get_bits(bc, 2);
+ start_subband = get_bits(bc, 3) + 2;
+ if (start_subband > 7)
+ start_subband += start_subband - 7;
+ end_subband = get_bits(bc, 3) + 5;
+#if USE_FIXED
+ s->spx_dst_end_freq = end_freq_inv_tab[end_subband-5];
+#endif
+ if (end_subband > 7)
+ end_subband += end_subband - 7;
+ dst_start_freq = dst_start_freq * 12 + 25;
+ src_start_freq = start_subband * 12 + 25;
+ dst_end_freq = end_subband * 12 + 25;
+
+ /* check validity of spx ranges */
+ if (start_subband >= end_subband) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
+ "range (%d >= %d)\n", start_subband, end_subband);
+ return AVERROR_INVALIDDATA;
+ }
+ if (dst_start_freq >= src_start_freq) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
+ "copy start bin (%d >= %d)\n", dst_start_freq, src_start_freq);
+ return AVERROR_INVALIDDATA;
+ }
+
+ s->spx_dst_start_freq = dst_start_freq;
+ s->spx_src_start_freq = src_start_freq;
+ if (!USE_FIXED)
+ s->spx_dst_end_freq = dst_end_freq;
+
+ decode_band_structure(bc, blk, s->eac3, 0,
+ start_subband, end_subband,
+ ff_eac3_default_spx_band_struct,
+ &s->num_spx_bands,
+ s->spx_band_sizes);
+ return 0;
+}
+
+static inline void spx_coordinates(AC3DecodeContext *s)
+{
+ GetBitContext *bc = &s->gbc;
+ int fbw_channels = s->fbw_channels;
+ int ch, bnd;
+
+ for (ch = 1; ch <= fbw_channels; ch++) {
+ if (s->channel_uses_spx[ch]) {
+ if (s->first_spx_coords[ch] || get_bits1(bc)) {
+ INTFLOAT spx_blend;
+ int bin, master_spx_coord;
+
+ s->first_spx_coords[ch] = 0;
+ spx_blend = AC3_SPX_BLEND(get_bits(bc, 5));
+ master_spx_coord = get_bits(bc, 2) * 3;
+
+ bin = s->spx_src_start_freq;
+ for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
+ int bandsize = s->spx_band_sizes[bnd];
+ int spx_coord_exp, spx_coord_mant;
+ INTFLOAT nratio, sblend, nblend;
+#if USE_FIXED
+ /* calculate blending factors */
+ int64_t accu = ((bin << 23) + (bandsize << 22))
+ * (int64_t)s->spx_dst_end_freq;
+ nratio = (int)(accu >> 32);
+ nratio -= spx_blend << 18;
+
+ if (nratio < 0) {
+ nblend = 0;
+ sblend = 0x800000;
+ } else if (nratio > 0x7fffff) {
+ nblend = 14529495; // sqrt(3) in FP.23
+ sblend = 0;
+ } else {
+ nblend = fixed_sqrt(nratio, 23);
+ accu = (int64_t)nblend * 1859775393;
+ nblend = (int)((accu + (1<<29)) >> 30);
+ sblend = fixed_sqrt(0x800000 - nratio, 23);
+ }
+#else
+ float spx_coord;
+
+ /* calculate blending factors */
+ nratio = ((float)((bin + (bandsize >> 1))) / s->spx_dst_end_freq) - spx_blend;
+ nratio = av_clipf(nratio, 0.0f, 1.0f);
+ nblend = sqrtf(3.0f * nratio); // noise is scaled by sqrt(3)
+ // to give unity variance
+ sblend = sqrtf(1.0f - nratio);
+#endif
+ bin += bandsize;
+
+ /* decode spx coordinates */
+ spx_coord_exp = get_bits(bc, 4);
+ spx_coord_mant = get_bits(bc, 2);
+ if (spx_coord_exp == 15) spx_coord_mant <<= 1;
+ else spx_coord_mant += 4;
+ spx_coord_mant <<= (25 - spx_coord_exp - master_spx_coord);
+
+ /* multiply noise and signal blending factors by spx coordinate */
+#if USE_FIXED
+ accu = (int64_t)nblend * spx_coord_mant;
+ s->spx_noise_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
+ accu = (int64_t)sblend * spx_coord_mant;
+ s->spx_signal_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
+#else
+ spx_coord = spx_coord_mant * (1.0f / (1 << 23));
+ s->spx_noise_blend [ch][bnd] = nblend * spx_coord;
+ s->spx_signal_blend[ch][bnd] = sblend * spx_coord;
+#endif
+ }
+ }
+ } else {
+ s->first_spx_coords[ch] = 1;
+ }
+ }
+}
+
/**
* Decode a single audio block from the AC-3 bitstream.
*/
@@ -808,7 +942,7 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
{
int fbw_channels = s->fbw_channels;
int channel_mode = s->channel_mode;
- int i, bnd, seg, ch;
+ int i, bnd, seg, ch, ret;
int different_transforms;
int downmix_output;
int cpl_in_use;
@@ -853,55 +987,8 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
if (s->eac3 && (!blk || get_bits1(gbc))) {
s->spx_in_use = get_bits1(gbc);
if (s->spx_in_use) {
- int dst_start_freq, dst_end_freq, src_start_freq,
- start_subband, end_subband;
-
- /* determine which channels use spx */
- if (s->channel_mode == AC3_CHMODE_MONO) {
- s->channel_uses_spx[1] = 1;
- } else {
- for (ch = 1; ch <= fbw_channels; ch++)
- s->channel_uses_spx[ch] = get_bits1(gbc);
- }
-
- /* get the frequency bins of the spx copy region and the spx start
- and end subbands */
- dst_start_freq = get_bits(gbc, 2);
- start_subband = get_bits(gbc, 3) + 2;
- if (start_subband > 7)
- start_subband += start_subband - 7;
- end_subband = get_bits(gbc, 3) + 5;
-#if USE_FIXED
- s->spx_dst_end_freq = end_freq_inv_tab[end_subband-5];
-#endif
- if (end_subband > 7)
- end_subband += end_subband - 7;
- dst_start_freq = dst_start_freq * 12 + 25;
- src_start_freq = start_subband * 12 + 25;
- dst_end_freq = end_subband * 12 + 25;
-
- /* check validity of spx ranges */
- if (start_subband >= end_subband) {
- av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
- "range (%d >= %d)\n", start_subband, end_subband);
- return AVERROR_INVALIDDATA;
- }
- if (dst_start_freq >= src_start_freq) {
- av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
- "copy start bin (%d >= %d)\n", dst_start_freq, src_start_freq);
- return AVERROR_INVALIDDATA;
- }
-
- s->spx_dst_start_freq = dst_start_freq;
- s->spx_src_start_freq = src_start_freq;
- if (!USE_FIXED)
- s->spx_dst_end_freq = dst_end_freq;
-
- decode_band_structure(gbc, blk, s->eac3, 0,
- start_subband, end_subband,
- ff_eac3_default_spx_band_struct,
- &s->num_spx_bands,
- s->spx_band_sizes);
+ if ((ret = spx_strategy(s, blk)) < 0)
+ return ret;
}
}
if (!s->eac3 || !s->spx_in_use) {
@@ -913,78 +1000,8 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
}
/* spectral extension coordinates */
- if (s->spx_in_use) {
- for (ch = 1; ch <= fbw_channels; ch++) {
- if (s->channel_uses_spx[ch]) {
- if (s->first_spx_coords[ch] || get_bits1(gbc)) {
- INTFLOAT spx_blend;
- int bin, master_spx_coord;
-
- s->first_spx_coords[ch] = 0;
- spx_blend = AC3_SPX_BLEND(get_bits(gbc, 5));
- master_spx_coord = get_bits(gbc, 2) * 3;
-
- bin = s->spx_src_start_freq;
- for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
- int bandsize = s->spx_band_sizes[bnd];
- int spx_coord_exp, spx_coord_mant;
- INTFLOAT nratio, sblend, nblend;
-#if USE_FIXED
- /* calculate blending factors */
- int64_t accu = ((bin << 23) + (bandsize << 22))
- * (int64_t)s->spx_dst_end_freq;
- nratio = (int)(accu >> 32);
- nratio -= spx_blend << 18;
-
- if (nratio < 0) {
- nblend = 0;
- sblend = 0x800000;
- } else if (nratio > 0x7fffff) {
- nblend = 14529495; // sqrt(3) in FP.23
- sblend = 0;
- } else {
- nblend = fixed_sqrt(nratio, 23);
- accu = (int64_t)nblend * 1859775393;
- nblend = (int)((accu + (1<<29)) >> 30);
- sblend = fixed_sqrt(0x800000 - nratio, 23);
- }
-#else
- float spx_coord;
-
- /* calculate blending factors */
- nratio = ((float)((bin + (bandsize >> 1))) / s->spx_dst_end_freq) - spx_blend;
- nratio = av_clipf(nratio, 0.0f, 1.0f);
- nblend = sqrtf(3.0f * nratio); // noise is scaled by sqrt(3)
- // to give unity variance
- sblend = sqrtf(1.0f - nratio);
-#endif
- bin += bandsize;
-
- /* decode spx coordinates */
- spx_coord_exp = get_bits(gbc, 4);
- spx_coord_mant = get_bits(gbc, 2);
- if (spx_coord_exp == 15) spx_coord_mant <<= 1;
- else spx_coord_mant += 4;
- spx_coord_mant <<= (25 - spx_coord_exp - master_spx_coord);
-
- /* multiply noise and signal blending factors by spx coordinate */
-#if USE_FIXED
- accu = (int64_t)nblend * spx_coord_mant;
- s->spx_noise_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
- accu = (int64_t)sblend * spx_coord_mant;
- s->spx_signal_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
-#else
- spx_coord = spx_coord_mant * (1.0f / (1 << 23));
- s->spx_noise_blend [ch][bnd] = nblend * spx_coord;
- s->spx_signal_blend[ch][bnd] = sblend * spx_coord;
-#endif
- }
- }
- } else {
- s->first_spx_coords[ch] = 1;
- }
- }
- }
+ if (s->spx_in_use)
+ spx_coordinates(s);
/* coupling strategy */
if (s->eac3 ? s->cpl_strategy_exists[blk] : get_bits1(gbc)) {
======================================================================
diff --cc libavcodec/ac3dec.c
index 4499160,4de7475..bd17b69
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@@ -801,6 -746,109 +801,140 @@@ static void decode_band_structure(GetBi
memcpy(band_sizes, bnd_sz, n_bands);
}
+ static inline int spx_strategy(AC3DecodeContext *s, int blk)
+ {
+ GetBitContext *bc = &s->gbc;
+ int fbw_channels = s->fbw_channels;
+ int dst_start_freq, dst_end_freq, src_start_freq,
+ start_subband, end_subband, ch;
+
+ /* determine which channels use spx */
+ if (s->channel_mode == AC3_CHMODE_MONO) {
+ s->channel_uses_spx[1] = 1;
+ } else {
+ for (ch = 1; ch <= fbw_channels; ch++)
+ s->channel_uses_spx[ch] = get_bits1(bc);
+ }
+
+ /* get the frequency bins of the spx copy region and the spx start
+ and end subbands */
+ dst_start_freq = get_bits(bc, 2);
+ start_subband = get_bits(bc, 3) + 2;
+ if (start_subband > 7)
+ start_subband += start_subband - 7;
+ end_subband = get_bits(bc, 3) + 5;
++#if USE_FIXED
++ s->spx_dst_end_freq = end_freq_inv_tab[end_subband-5];
++#endif
+ if (end_subband > 7)
+ end_subband += end_subband - 7;
+ dst_start_freq = dst_start_freq * 12 + 25;
+ src_start_freq = start_subband * 12 + 25;
+ dst_end_freq = end_subband * 12 + 25;
+
+ /* check validity of spx ranges */
+ if (start_subband >= end_subband) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
+ "range (%d >= %d)\n", start_subband, end_subband);
+ return AVERROR_INVALIDDATA;
+ }
+ if (dst_start_freq >= src_start_freq) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
+ "copy start bin (%d >= %d)\n", dst_start_freq, src_start_freq);
+ return AVERROR_INVALIDDATA;
+ }
+
+ s->spx_dst_start_freq = dst_start_freq;
+ s->spx_src_start_freq = src_start_freq;
- s->spx_dst_end_freq = dst_end_freq;
++ if (!USE_FIXED)
++ s->spx_dst_end_freq = dst_end_freq;
+
+ decode_band_structure(bc, blk, s->eac3, 0,
+ start_subband, end_subband,
+ ff_eac3_default_spx_band_struct,
+ &s->num_spx_bands,
+ s->spx_band_sizes);
-
+ return 0;
+ }
+
+ static inline void spx_coordinates(AC3DecodeContext *s)
+ {
+ GetBitContext *bc = &s->gbc;
+ int fbw_channels = s->fbw_channels;
+ int ch, bnd;
+
+ for (ch = 1; ch <= fbw_channels; ch++) {
+ if (s->channel_uses_spx[ch]) {
+ if (s->first_spx_coords[ch] || get_bits1(bc)) {
- float spx_blend;
++ INTFLOAT spx_blend;
+ int bin, master_spx_coord;
+
+ s->first_spx_coords[ch] = 0;
- spx_blend = get_bits(bc, 5) * (1.0f / 32);
++ spx_blend = AC3_SPX_BLEND(get_bits(bc, 5));
+ master_spx_coord = get_bits(bc, 2) * 3;
+
+ bin = s->spx_src_start_freq;
+ for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
- int bandsize;
++ int bandsize = s->spx_band_sizes[bnd];
+ int spx_coord_exp, spx_coord_mant;
- float nratio, sblend, nblend, spx_coord;
++ INTFLOAT nratio, sblend, nblend;
++#if USE_FIXED
++ /* calculate blending factors */
++ int64_t accu = ((bin << 23) + (bandsize << 22))
++ * (int64_t)s->spx_dst_end_freq;
++ nratio = (int)(accu >> 32);
++ nratio -= spx_blend << 18;
++
++ if (nratio < 0) {
++ nblend = 0;
++ sblend = 0x800000;
++ } else if (nratio > 0x7fffff) {
++ nblend = 14529495; // sqrt(3) in FP.23
++ sblend = 0;
++ } else {
++ nblend = fixed_sqrt(nratio, 23);
++ accu = (int64_t)nblend * 1859775393;
++ nblend = (int)((accu + (1<<29)) >> 30);
++ sblend = fixed_sqrt(0x800000 - nratio, 23);
++ }
++#else
++ float spx_coord;
+
+ /* calculate blending factors */
- bandsize = s->spx_band_sizes[bnd];
+ nratio = ((float)((bin + (bandsize >> 1))) / s->spx_dst_end_freq) - spx_blend;
+ nratio = av_clipf(nratio, 0.0f, 1.0f);
+ nblend = sqrtf(3.0f * nratio); // noise is scaled by sqrt(3)
+ // to give unity variance
+ sblend = sqrtf(1.0f - nratio);
++#endif
+ bin += bandsize;
+
+ /* decode spx coordinates */
+ spx_coord_exp = get_bits(bc, 4);
+ spx_coord_mant = get_bits(bc, 2);
+ if (spx_coord_exp == 15) spx_coord_mant <<= 1;
+ else spx_coord_mant += 4;
+ spx_coord_mant <<= (25 - spx_coord_exp - master_spx_coord);
- spx_coord = spx_coord_mant * (1.0f / (1 << 23));
+
+ /* multiply noise and signal blending factors by spx coordinate */
++#if USE_FIXED
++ accu = (int64_t)nblend * spx_coord_mant;
++ s->spx_noise_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
++ accu = (int64_t)sblend * spx_coord_mant;
++ s->spx_signal_blend[ch][bnd] = (int)((accu + (1<<22)) >> 23);
++#else
++ spx_coord = spx_coord_mant * (1.0f / (1 << 23));
+ s->spx_noise_blend [ch][bnd] = nblend * spx_coord;
+ s->spx_signal_blend[ch][bnd] = sblend * spx_coord;
++#endif
+ }
+ }
+ } else {
+ s->first_spx_coords[ch] = 1;
+ }
+ }
+ }
+
/**
* Decode a single audio block from the AC-3 bitstream.
*/
@@@ -853,62 -900,13 +987,15 @@@ static int decode_audio_block(AC3Decode
if (s->eac3 && (!blk || get_bits1(gbc))) {
s->spx_in_use = get_bits1(gbc);
if (s->spx_in_use) {
- int dst_start_freq, dst_end_freq, src_start_freq,
- start_subband, end_subband;
-
- /* determine which channels use spx */
- if (s->channel_mode == AC3_CHMODE_MONO) {
- s->channel_uses_spx[1] = 1;
- } else {
- for (ch = 1; ch <= fbw_channels; ch++)
- s->channel_uses_spx[ch] = get_bits1(gbc);
- }
-
- /* get the frequency bins of the spx copy region and the spx start
- and end subbands */
- dst_start_freq = get_bits(gbc, 2);
- start_subband = get_bits(gbc, 3) + 2;
- if (start_subband > 7)
- start_subband += start_subband - 7;
- end_subband = get_bits(gbc, 3) + 5;
- #if USE_FIXED
- s->spx_dst_end_freq = end_freq_inv_tab[end_subband-5];
- #endif
- if (end_subband > 7)
- end_subband += end_subband - 7;
- dst_start_freq = dst_start_freq * 12 + 25;
- src_start_freq = start_subband * 12 + 25;
- dst_end_freq = end_subband * 12 + 25;
-
- /* check validity of spx ranges */
- if (start_subband >= end_subband) {
- av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
- "range (%d >= %d)\n", start_subband, end_subband);
- return AVERROR_INVALIDDATA;
- }
- if (dst_start_freq >= src_start_freq) {
- av_log(s->avctx, AV_LOG_ERROR, "invalid spectral extension "
- "copy start bin (%d >= %d)\n", dst_start_freq, src_start_freq);
- return AVERROR_INVALIDDATA;
- }
-
- s->spx_dst_start_freq = dst_start_freq;
- s->spx_src_start_freq = src_start_freq;
- if (!USE_FIXED)
- s->spx_dst_end_freq = dst_end_freq;
-
- decode_band_structure(gbc, blk, s->eac3, 0,
- start_subband, end_subband,
- ff_eac3_default_spx_band_struct,
- &s->num_spx_bands,
- s->spx_band_sizes);
+ if ((ret = spx_strategy(s, blk)) < 0)
+ return ret;
- } else {
- for (ch = 1; ch <= fbw_channels; ch++) {
- s->channel_uses_spx[ch] = 0;
- s->first_spx_coords[ch] = 1;
- }
+ }
+ }
+ if (!s->eac3 || !s->spx_in_use) {
+ s->spx_in_use = 0;
+ for (ch = 1; ch <= fbw_channels; ch++) {
+ s->channel_uses_spx[ch] = 0;
+ s->first_spx_coords[ch] = 1;
}
}
More information about the ffmpeg-cvslog
mailing list