diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2014-03-25 11:46:10 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-04-04 18:35:29 +0200 |
commit | 41ba6dad721e618c0e54315bd72ad28afbd7b622 (patch) | |
tree | 15ba19792361da70f1b5228fb0aa68b299c24336 /demux/demux_lavf.c | |
parent | cc3d4a2725df3a07d353588afde7773ddd8d5e3a (diff) | |
download | mpv-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.c | 39 |
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: { |