diff options
-rw-r--r-- | libmpcodecs/ad_ffmpeg.c | 27 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 8 | ||||
-rw-r--r-- | libmpdemux/stheader.h | 1 |
3 files changed, 25 insertions, 11 deletions
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c index 9009aaa82c..d2f329c645 100644 --- a/libmpcodecs/ad_ffmpeg.c +++ b/libmpcodecs/ad_ffmpeg.c @@ -52,10 +52,13 @@ static int preinit(sh_audio_t *sh) return 1; } +/* Prefer playing audio with the samplerate given in container data + * if available, but take number the number of channels and sample format + * from the codec, since if the codec isn't using the correct values for + * those everything breaks anyway. + */ static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context) { - int broken_srate = 0; - int samplerate = lavc_context->sample_rate; int sample_format = sh_audio->sample_format; switch (lavc_context->sample_fmt) { case SAMPLE_FMT_U8: sample_format = AF_FORMAT_U8; break; @@ -65,16 +68,18 @@ static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context default: mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Unsupported sample format\n"); } - if(sh_audio->wf){ - // If the decoder uses the wrong number of channels all is lost anyway. - // sh_audio->channels=sh_audio->wf->nChannels; - if (lavc_context->codec_id == CODEC_ID_AAC && - samplerate == 2*sh_audio->wf->nSamplesPerSec) { - broken_srate = 1; - } else if (sh_audio->wf->nSamplesPerSec) - samplerate=sh_audio->wf->nSamplesPerSec; - } + bool broken_srate = false; + int samplerate = lavc_context->sample_rate; + int container_samplerate = sh_audio->container_out_samplerate; + if (!container_samplerate && sh_audio->wf) + container_samplerate = sh_audio->wf->nSamplesPerSec; + if (lavc_context->codec_id == CODEC_ID_AAC + && samplerate == 2 * container_samplerate) + broken_srate = true; + else if (container_samplerate) + samplerate = container_samplerate; + if (lavc_context->channels != sh_audio->channels || samplerate != sh_audio->samplerate || sample_format != sh_audio->sample_format) { diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 358f152c16..5e205f7cc2 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -107,6 +107,7 @@ typedef struct mkv_track { uint32_t a_formattag; uint32_t a_channels, a_bps; float a_sfreq; + float a_osfreq; double default_duration; @@ -525,6 +526,12 @@ static void parse_trackaudio(struct demuxer *demuxer, struct mkv_track *track, "[mkv] | + Sampling frequency: %f\n", track->a_sfreq); } else track->a_sfreq = 8000; + if (audio->n_output_sampling_frequency) { + track->a_osfreq = audio->output_sampling_frequency; + mp_msg(MSGT_DEMUX, MSGL_V, + "[mkv] | + Output sampling frequency: %f\n", track->a_osfreq); + } else + 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", @@ -1410,6 +1417,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track, 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; if (track->a_bps == 0) { sh_a->samplesize = 2; diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h index 35409188d5..4bb2da3ac7 100644 --- a/libmpdemux/stheader.h +++ b/libmpdemux/stheader.h @@ -55,6 +55,7 @@ typedef struct sh_audio { // output format: int sample_format; int samplerate; + int container_out_samplerate; int samplesize; int channels; int o_bps; // == samplerate*samplesize*channels (uncompr. bytes/sec) |