diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index f7699ffdfa..8bba964295 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -618,8 +618,15 @@ static void export_replaygain(demuxer_t *demuxer, struct sh_stream *sh, if (!av_rgain) return; - struct replaygain_data *rgain = talloc_ptrtype(demuxer, rgain); + bool track_data_available = + av_rgain->track_gain != INT32_MIN && av_rgain->track_peak != 0; + bool album_data_available = + av_rgain->album_gain != INT32_MIN && av_rgain->album_peak != 0; + if (!track_data_available && !album_data_available) + return; + + struct replaygain_data *rgain = talloc_ptrtype(demuxer, rgain); rgain->track_gain = rgain->album_gain = 0; rgain->track_peak = rgain->album_peak = 1; @@ -627,22 +634,17 @@ static void export_replaygain(demuxer_t *demuxer, struct sh_stream *sh, // if the latter is not present. This behavior matches that in // demux/demux.c's decode_rgain; if you change this, please make // equivalent changes there too. - if (av_rgain->track_gain != INT32_MIN && av_rgain->track_peak != 0.0) { - // Track gain is defined. - rgain->track_gain = av_rgain->track_gain / 100000.0f; - rgain->track_peak = av_rgain->track_peak / 100000.0f; + if (track_data_available) { + rgain->track_gain = rgain->album_gain = + av_rgain->track_gain / 100000.0f; + rgain->track_peak = rgain->album_peak = + av_rgain->track_peak / 100000.0f; + } - if (av_rgain->album_gain != INT32_MIN && - av_rgain->album_peak != 0.0) - { - // Album gain is also defined. - rgain->album_gain = av_rgain->album_gain / 100000.0f; - rgain->album_peak = av_rgain->album_peak / 100000.0f; - } else { - // Album gain is undefined; fall back to track gain. - rgain->album_gain = rgain->track_gain; - rgain->album_peak = rgain->track_peak; - } + // If album data is actually available, fill it in with proper values. + if (album_data_available) { + rgain->album_gain = av_rgain->album_gain / 100000.0f; + rgain->album_peak = av_rgain->album_peak / 100000.0f; } // This must be run only before the stream was added, otherwise there