summaryrefslogtreecommitdiffstats
path: root/demux/demux_lavf.c
diff options
context:
space:
mode:
authorAlessandro Ghedini <alessandro@ghedini.me>2014-03-25 11:46:10 +0100
committerwm4 <wm4@nowhere>2014-04-04 18:35:29 +0200
commit41ba6dad721e618c0e54315bd72ad28afbd7b622 (patch)
tree15ba19792361da70f1b5228fb0aa68b299c24336 /demux/demux_lavf.c
parentcc3d4a2725df3a07d353588afde7773ddd8d5e3a (diff)
downloadmpv-41ba6dad721e618c0e54315bd72ad28afbd7b622.tar.bz2
mpv-41ba6dad721e618c0e54315bd72ad28afbd7b622.tar.xz
demux: add replaygain_data field to demuxer_t
Diffstat (limited to 'demux/demux_lavf.c')
-rw-r--r--demux/demux_lavf.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index b781971669..00dc2aee2b 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -26,15 +26,19 @@
#include <string.h>
#include <assert.h>
+#include "config.h"
+
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libavutil/avutil.h>
#include <libavutil/avstring.h>
#include <libavutil/mathematics.h>
+#if HAVE_AVCODEC_REPLAYGAIN_SIDE_DATA
+# include <libavutil/replaygain.h>
+#endif
#include <libavutil/opt.h>
#include "compat/libav.h"
-#include "config.h"
#include "options/options.h"
#include "common/msg.h"
#include "common/av_opts.h"
@@ -372,6 +376,37 @@ static void select_tracks(struct demuxer *demuxer, int start)
}
}
+static void export_replaygain(demuxer_t *demuxer, AVStream *st)
+{
+#if HAVE_AVCODEC_REPLAYGAIN_SIDE_DATA
+ for (int i = 0; i < st->nb_side_data; i++) {
+ AVReplayGain *av_rgain;
+ struct replaygain_data *rgain;
+ AVPacketSideData *src_sd = &st->side_data[i];
+
+ if (src_sd->type != AV_PKT_DATA_REPLAYGAIN)
+ continue;
+
+ av_rgain = (AVReplayGain*)src_sd->data;
+ rgain = talloc_ptrtype(demuxer, rgain);
+
+ rgain->track_gain = (av_rgain->track_gain != INT32_MIN) ?
+ av_rgain->track_gain / 100000.0f : 0.0;
+
+ rgain->track_peak = (av_rgain->track_peak != 0.0) ?
+ av_rgain->track_peak / 100000.0f : 1.0;
+
+ rgain->album_gain = (av_rgain->album_gain != INT32_MIN) ?
+ av_rgain->album_gain / 100000.0f : 0.0;
+
+ rgain->album_peak = (av_rgain->album_peak != 0.0) ?
+ av_rgain->album_peak / 100000.0f : 1.0;
+
+ demuxer->replaygain_data = rgain;
+ }
+#endif
+}
+
static void handle_stream(demuxer_t *demuxer, int i)
{
lavf_priv_t *priv = demuxer->priv;
@@ -396,6 +431,8 @@ static void handle_stream(demuxer_t *demuxer, int i)
sh_audio->samplerate = codec->sample_rate;
sh_audio->i_bps = codec->bit_rate / 8;
+ export_replaygain(demuxer, st);
+
break;
}
case AVMEDIA_TYPE_VIDEO: {