summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-26 08:53:41 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-26 08:53:41 +0000
commit4ed4169ec64e11b1d0c4cadb7c0e5a04c90cc739 (patch)
treeb9d74bcdbe1d87ffd9c192e8449b1ae0cfb47f33
parent6f2ea1e2dff171515a52c3259c90785637261f7b (diff)
downloadmpv-4ed4169ec64e11b1d0c4cadb7c0e5a04c90cc739.tar.bz2
mpv-4ed4169ec64e11b1d0c4cadb7c0e5a04c90cc739.tar.xz
a52 dynamic range compression support by Peter Gansterer
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12286 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--DOCS/man/de/mplayer.18
-rw-r--r--DOCS/man/en/mplayer.18
-rw-r--r--cfg-common.h4
-rw-r--r--libmpcodecs/ad_liba52.c37
4 files changed, 57 insertions, 0 deletions
diff --git a/DOCS/man/de/mplayer.1 b/DOCS/man/de/mplayer.1
index 009bd8ab58..41ce7ca366 100644
--- a/DOCS/man/de/mplayer.1
+++ b/DOCS/man/de/mplayer.1
@@ -388,6 +388,14 @@ soll. Für Slideshows nützlich.
.SH "DEMUXER/STREAM-OPTIONEN"
.TP
+.B \-a52drc <level>
+Gibt die Höhe der Dynamic Range Compression für den AC3 Audio Stream an.
+<level> ist ein Fließkommawert im Bereich von 0 bis 1, wobei 0 keine Kompression
+und 1 (der Standardwert) volle Kompression bedeutet (laute Passagen werden leiser
+und umgekehrt).
+Diese Option zeigt nur Wirkung, wenn im AC3 Stream die Rangei Compression i
+Information vorhanden ist.
+.TP
.B \-aid <id> (siehe auch \-alang)
Gibt die zu verwendende Audiospur an [MPEG: 0\-31 AVI/\:OGM: 1\-99
ASF/\:RM: 0\-127 VOB(AC3): 128\-159 VOB(LPCM): 160\-191]
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 8642930dbe..dc61bd41a6 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -596,6 +596,14 @@ this option.
.
.SH "DEMUXER/STREAM OPTIONS"
.TP
+.B \-a52drc <level>
+Select the Dynamic Range Compression level for AC3 audio streams.
+<level> is a float value ranging from 0 to 1, where 0 means no compression
+and 1 (which is the default) means full compression (make loud passages more
+silent and vice versa).
+This option only shows an effect if the AC3 stream contains the required range
+compression information.
+.TP
.B \-aid <id> (also see \-alang option)
Select audio channel [MPEG: 0\-31 AVI/\:OGM: 1\-99 ASF/\:RM: 0\-127
VOB(AC3): 128\-159 VOB(LPCM): 160\-191 MPEG-TS 17\-8190].
diff --git a/cfg-common.h b/cfg-common.h
index 7bfe6c9bd8..fa48141d24 100644
--- a/cfg-common.h
+++ b/cfg-common.h
@@ -134,6 +134,8 @@
{"channels", &audio_output_channels, CONF_TYPE_INT, CONF_RANGE, 1, 6, NULL},
{"format", &audio_output_format, CONF_TYPE_INT, CONF_RANGE, 0, 0x00002000, NULL},
+ {"a52drc", &a52_drc_level, CONF_TYPE_FLOAT, CONF_RANGE, 0, 1, NULL},
+
// ------------------------- codec/vfilter options --------------------
// MP3-only: select stereo/left/right
@@ -303,6 +305,8 @@ extern int network_ipv4_only_proxy;
#endif
+extern float a52_drc_level;
+
/* defined in libmpdemux: */
extern int hr_mp3_seek;
extern m_option_t demux_rawaudio_opts[];
diff --git a/libmpcodecs/ad_liba52.c b/libmpcodecs/ad_liba52.c
index b25e670b2f..03262ad87c 100644
--- a/libmpcodecs/ad_liba52.c
+++ b/libmpcodecs/ad_liba52.c
@@ -1,6 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <math.h>
#include "config.h"
#ifdef USE_LIBA52
@@ -19,6 +20,13 @@ static sample_t * a52_samples;
static a52_state_t a52_state;
static uint32_t a52_flags=0;
+#define DRC_NO_ACTION 0
+#define DRC_NO_COMPRESSION 1
+#define DRC_CALLBACK 2
+
+float a52_drc_level = 1.0;
+static int a52_drc_action = DRC_NO_ACTION;
+
#include "bswap.h"
static ad_info_t info =
@@ -95,6 +103,11 @@ int channels=0;
return (flags&A52_LFE) ? (channels+1) : channels;
}
+sample_t dynrng_call (sample_t c, void *data) {
+// fprintf(stderr, "(%lf, %lf): %lf\n", (double)c, (double)a52_drc_level, (double)pow((double)c, a52_drc_level));
+ return pow((double)c, a52_drc_level);
+}
+
static int preinit(sh_audio_t *sh)
{
@@ -126,6 +139,21 @@ static int init(sh_audio_t *sh_audio)
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n");
return 0;
}
+
+
+ /* Init a52 dynrng */
+ if (a52_drc_level < 0.001) {
+ /* level == 0 --> no compression, init library without callback */
+ a52_drc_action = DRC_NO_COMPRESSION;
+ } else if (a52_drc_level > 0.999) {
+ /* level == 1 --> full compression, do nothing at all (library default = full compression) */
+ a52_drc_action = DRC_NO_ACTION;
+ } else {
+ a52_drc_action = DRC_CALLBACK;
+ }
+ /* Library init for dynrng has to be done for each frame, see decode_audio() */
+
+
/* 'a52 cannot upmix' hotfix:*/
a52_printinfo(sh_audio);
sh_audio->channels=audio_output_channels;
@@ -186,6 +214,15 @@ static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int m
mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n");
return len;
}
+
+ /* handle dynrng */
+ if (a52_drc_action != DRC_NO_ACTION) {
+ if (a52_drc_action == DRC_NO_COMPRESSION)
+ a52_dynrng(&a52_state, NULL, NULL);
+ else
+ a52_dynrng(&a52_state, dynrng_call, NULL);
+ }
+
len=0;
for (i = 0; i < 6; i++) {
if (a52_block (&a52_state, a52_samples)){