Message ID | 1473450532-45376-1-git-send-email-nbowe@google.com |
---|---|
State | Accepted |
Commit | 96cd6f672e5d8c5d49b06de4f24376f36880fea8 |
Headers | show |
ping. On Fri, Sep 9, 2016 at 12:48 PM, Nikolas Bowe <nbowe@google.com> wrote: > Currently when using target_level with EAC3 it produces silence. This > small patch fixes target_level for decoding EAC3. > > Example: > ffmpeg -y -i /tmp/test.wav -acodec eac3 -dialnorm -14 -ac 6 -b:a 384000 > /tmp/test.m2ts > ffmpeg -y -target_level -24 -i /tmp/test.m2ts -acodec pcm_s16le -f > matroska /tmp/out.mkv > ffplay /tmp/out.mkv > --- > libavcodec/ac3.h | 2 +- > libavcodec/ac3dec.c | 9 ++++++--- > libavcodec/ac3dec.h | 4 ++++ > libavcodec/eac3dec.c | 14 +++++++++++--- > 4 files changed, 22 insertions(+), 7 deletions(-) > > diff --git a/libavcodec/ac3.h b/libavcodec/ac3.h > index 747f2f5..5c9c377 100644 > --- a/libavcodec/ac3.h > +++ b/libavcodec/ac3.h > @@ -87,7 +87,7 @@ typedef int16_t SHORTFLOAT; > #define AC3_NORM(norm) (1.0f/(norm)) > #define AC3_MUL(a,b) ((a) * (b)) > #define AC3_RANGE(x) (dynamic_range_tab[(x)]) > -#define AC3_HEAVY_RANGE(x) (heavy_dynamic_range_tab[(x)]) > +#define AC3_HEAVY_RANGE(x) (ff_ac3_heavy_dynamic_range_tab[(x)]) > #define AC3_DYNAMIC_RANGE(x) (powf(x, s->drc_scale)) > #define AC3_SPX_BLEND(x) (x)* (1.0f/32) > #define AC3_DYNAMIC_RANGE1 1.0f > diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c > index fac189b..a95c204 100644 > --- a/libavcodec/ac3dec.c > +++ b/libavcodec/ac3dec.c > @@ -63,9 +63,11 @@ static const uint8_t quantization_tab[16] = { > 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 > }; > > +#if (!USE_FIXED) > /** dynamic range table. converts codes to scale factors. */ > static float dynamic_range_tab[256]; > -static float heavy_dynamic_range_tab[256]; > +float ff_ac3_heavy_dynamic_range_tab[256]; > +#endif > > /** Adjustments in dB gain */ > static const float gain_levels[9] = { > @@ -159,6 +161,7 @@ static av_cold void ac3_tables_init(void) > b5_mantissas[i] = symmetric_dequant(i, 15); > } > > +#if (!USE_FIXED) > /* generate dynamic range table > reference: Section 7.7.1 Dynamic Range Control */ > for (i = 0; i < 256; i++) { > @@ -170,9 +173,9 @@ static av_cold void ac3_tables_init(void) > reference: Section 7.7.2 Heavy Compression */ > for (i = 0; i < 256; i++) { > int v = (i >> 4) - ((i >> 7) << 4) - 4; > - heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10); > + ff_ac3_heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | > 0x10); > } > - > +#endif > } > > /** > diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h > index c2b867e..6cd67c0 100644 > --- a/libavcodec/ac3dec.h > +++ b/libavcodec/ac3dec.h > @@ -260,4 +260,8 @@ static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext > *s, int ch); > */ > static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s); > > +#if (!USE_FIXED) > +extern float ff_ac3_heavy_dynamic_range_tab[256]; > +#endif > + > #endif /* AVCODEC_AC3DEC_H */ > diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c > index 47e5aa6..83a54bc 100644 > --- a/libavcodec/eac3dec.c > +++ b/libavcodec/eac3dec.c > @@ -339,9 +339,17 @@ static int ff_eac3_parse_header(AC3DecodeContext *s) > > /* volume control params */ > for (i = 0; i < (s->channel_mode ? 1 : 2); i++) { > - skip_bits(gbc, 5); // skip dialog normalization > - if (get_bits1(gbc)) { > - skip_bits(gbc, 8); // skip compression gain word > + s->dialog_normalization[i] = -get_bits(gbc, 5); > + if (s->dialog_normalization[i] == 0) { > + s->dialog_normalization[i] = -31; > + } > + if (s->target_level != 0) { > + s->level_gain[i] = powf(2.0f, > + (float)(s->target_level - s->dialog_normalization[i])/6. > 0f); > + } > + s->compression_exists[i] = get_bits1(gbc); > + if (s->compression_exists[i]) { > + s->heavy_dynamic_range[i] = AC3_HEAVY_RANGE(get_bits(gbc, 8)); > } > } > > -- > 2.8.0.rc3.226.g39d4020 > >
On Fri, Sep 09, 2016 at 12:48:52PM -0700, Nikolas Bowe wrote: > Currently when using target_level with EAC3 it produces silence. This small patch fixes target_level for decoding EAC3. > > Example: > ffmpeg -y -i /tmp/test.wav -acodec eac3 -dialnorm -14 -ac 6 -b:a 384000 /tmp/test.m2ts > ffmpeg -y -target_level -24 -i /tmp/test.m2ts -acodec pcm_s16le -f matroska /tmp/out.mkv > ffplay /tmp/out.mkv > --- > libavcodec/ac3.h | 2 +- > libavcodec/ac3dec.c | 9 ++++++--- > libavcodec/ac3dec.h | 4 ++++ > libavcodec/eac3dec.c | 14 +++++++++++--- > 4 files changed, 22 insertions(+), 7 deletions(-) applied can you add a fate test for this ? also if you can reduce the number of #if, that would be welcome too Thanks [...]
diff --git a/libavcodec/ac3.h b/libavcodec/ac3.h index 747f2f5..5c9c377 100644 --- a/libavcodec/ac3.h +++ b/libavcodec/ac3.h @@ -87,7 +87,7 @@ typedef int16_t SHORTFLOAT; #define AC3_NORM(norm) (1.0f/(norm)) #define AC3_MUL(a,b) ((a) * (b)) #define AC3_RANGE(x) (dynamic_range_tab[(x)]) -#define AC3_HEAVY_RANGE(x) (heavy_dynamic_range_tab[(x)]) +#define AC3_HEAVY_RANGE(x) (ff_ac3_heavy_dynamic_range_tab[(x)]) #define AC3_DYNAMIC_RANGE(x) (powf(x, s->drc_scale)) #define AC3_SPX_BLEND(x) (x)* (1.0f/32) #define AC3_DYNAMIC_RANGE1 1.0f diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index fac189b..a95c204 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -63,9 +63,11 @@ static const uint8_t quantization_tab[16] = { 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 }; +#if (!USE_FIXED) /** dynamic range table. converts codes to scale factors. */ static float dynamic_range_tab[256]; -static float heavy_dynamic_range_tab[256]; +float ff_ac3_heavy_dynamic_range_tab[256]; +#endif /** Adjustments in dB gain */ static const float gain_levels[9] = { @@ -159,6 +161,7 @@ static av_cold void ac3_tables_init(void) b5_mantissas[i] = symmetric_dequant(i, 15); } +#if (!USE_FIXED) /* generate dynamic range table reference: Section 7.7.1 Dynamic Range Control */ for (i = 0; i < 256; i++) { @@ -170,9 +173,9 @@ static av_cold void ac3_tables_init(void) reference: Section 7.7.2 Heavy Compression */ for (i = 0; i < 256; i++) { int v = (i >> 4) - ((i >> 7) << 4) - 4; - heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10); + ff_ac3_heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10); } - +#endif } /** diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h index c2b867e..6cd67c0 100644 --- a/libavcodec/ac3dec.h +++ b/libavcodec/ac3dec.h @@ -260,4 +260,8 @@ static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch); */ static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s); +#if (!USE_FIXED) +extern float ff_ac3_heavy_dynamic_range_tab[256]; +#endif + #endif /* AVCODEC_AC3DEC_H */ diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c index 47e5aa6..83a54bc 100644 --- a/libavcodec/eac3dec.c +++ b/libavcodec/eac3dec.c @@ -339,9 +339,17 @@ static int ff_eac3_parse_header(AC3DecodeContext *s) /* volume control params */ for (i = 0; i < (s->channel_mode ? 1 : 2); i++) { - skip_bits(gbc, 5); // skip dialog normalization - if (get_bits1(gbc)) { - skip_bits(gbc, 8); // skip compression gain word + s->dialog_normalization[i] = -get_bits(gbc, 5); + if (s->dialog_normalization[i] == 0) { + s->dialog_normalization[i] = -31; + } + if (s->target_level != 0) { + s->level_gain[i] = powf(2.0f, + (float)(s->target_level - s->dialog_normalization[i])/6.0f); + } + s->compression_exists[i] = get_bits1(gbc); + if (s->compression_exists[i]) { + s->heavy_dynamic_range[i] = AC3_HEAVY_RANGE(get_bits(gbc, 8)); } }