Re: [FFmpeg-devel] [PATCH] Fix target_level for EAC3.

2016-09-15 Thread Michael Niedermayer
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

[...]
-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The worst form of inequality is to try to make unequal things equal.
-- Aristotle


signature.asc
Description: Digital signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] Fix target_level for EAC3.

2016-09-14 Thread Niki Bowe
ping.


On Fri, Sep 9, 2016 at 12:48 PM, 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(-)
>
> 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
>
>


-- 

Nikolas Bowe |  SWE |  nb...@google.com |  408-565-5137
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] Fix target_level for EAC3.

2016-09-09 Thread Nikolas Bowe
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

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel