From 66a9eb570d8ab086ecd29c244dc99c5c6b85cd03 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 16 Jul 2013 22:44:15 +0200 Subject: demux_mkv: never force output sample rate Matroska has an output sample rate (OutputSamplingFrequency), which in theory should be forced instead of whatever the decoder outputs. But it appears no software (other than mplayer2 and mpv until now) actually respects this. Even worse, there were broken files around, which played correctly with (in theory) broken software, but not mplayer2/mpv. Hacks were added to our code to play these files correctly, but they didn't catch all cases. Simplify this by doing what everyone else does, and always use the decoder's sample rate instead. In particular, we try to handle all sample rate issues like libavformat's Matroska demuxer does. --- demux/demux_mkv.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index ed6de6a69c..d3e12f7190 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -488,14 +488,6 @@ static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track, "[mkv] | + Output sampling frequency: %f\n", track->a_osfreq); } else track->a_osfreq = track->a_sfreq; - // Something creates files with osfreq incorrectly set - if (track->a_sfreq == 44100 && track->a_osfreq == 96000) { - mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Audio track has codec frequency " - "%.1f and playback frequency %.1f.\n[mkv] This looks wrong. " - "Assuming this file is corrupt and ignoring the latter.\n", - track->a_sfreq, track->a_osfreq); - track->a_osfreq = track->a_sfreq; - } if (audio->n_bit_depth) { track->a_bps = audio->bit_depth; mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n", @@ -1359,9 +1351,12 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) sh_a->gsh->demuxer_id = track->tnum; sh_a->gsh->title = talloc_strdup(sh_a, track->name); sh_a->gsh->default_track = track->default_track; + if (!track->a_osfreq) + track->a_osfreq = track->a_sfreq; if (track->ms_compat) { if (track->private_size < sizeof(*sh_a->wf)) goto error; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] track with MS compat audio.\n"); WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data; sh_a->wf = calloc(1, track->private_size); sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag); @@ -1373,8 +1368,8 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) sh_a->wf->cbSize = track->private_size - sizeof(*sh_a->wf); memcpy(sh_a->wf + 1, wf + 1, track->private_size - sizeof(*sh_a->wf)); - if (track->a_sfreq == 0.0) - track->a_sfreq = sh_a->wf->nSamplesPerSec; + if (track->a_osfreq == 0.0) + track->a_osfreq = sh_a->wf->nSamplesPerSec; if (track->a_channels == 0) track->a_channels = sh_a->wf->nChannels; if (track->a_bps == 0) @@ -1402,9 +1397,8 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) sh_a->wf->wFormatTag = track->a_formattag; mp_chmap_from_channels(&sh_a->channels, track->a_channels); sh_a->wf->nChannels = track->a_channels; - sh_a->samplerate = (uint32_t) track->a_sfreq; - sh_a->container_out_samplerate = track->a_osfreq; - sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq; + sh_a->samplerate = (uint32_t) track->a_osfreq; + sh_a->wf->nSamplesPerSec = (uint32_t) track->a_osfreq; if (track->a_bps == 0) sh_a->wf->wBitsPerSample = 16; else @@ -1438,7 +1432,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) } else { /* Recreate the 'private data' */ /* which faad2 uses in its initialization */ - srate_idx = aac_get_sample_rate_index(sh_a->samplerate); + srate_idx = aac_get_sample_rate_index(track->a_sfreq); if (!strncmp(&track->codec_id[12], "MAIN", 4)) profile = 0; else if (!strncmp(&track->codec_id[12], "LC", 2)) @@ -1456,8 +1450,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) /* HE-AAC (aka SBR AAC) */ sh_a->codecdata_len = 5; - sh_a->samplerate *= 2; - sh_a->wf->nSamplesPerSec *= 2; + sh_a->samplerate = sh_a->wf->nSamplesPerSec = track->a_osfreq; srate_idx = aac_get_sample_rate_index(sh_a->samplerate); sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3; sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5; @@ -1587,7 +1580,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) AV_WL16(data + 4, 1); AV_WL16(data + 6, sh_a->channels.num); AV_WL16(data + 8, sh_a->wf->wBitsPerSample); - AV_WL32(data + 10, sh_a->samplerate); + AV_WL32(data + 10, track->a_osfreq); // Bogus: last frame won't be played. AV_WL32(data + 14, 0); } else if (!track->ms_compat) { -- cgit v1.2.3