diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux_mkv.c | 27 | ||||
-rw-r--r-- | demux/stheader.h | 1 |
2 files changed, 10 insertions, 18 deletions
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) { diff --git a/demux/stheader.h b/demux/stheader.h index 3b9c47ba2c..e90909e17a 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -90,7 +90,6 @@ typedef struct sh_audio { // output format: int sample_format; int samplerate; - int container_out_samplerate; int samplesize; struct mp_chmap channels; int i_bps; // == bitrate (compressed bytes/sec) |