mirror of
https://github.com/mpv-player/mpv
synced 2024-12-23 23:32:26 +00:00
77a00e444f
This fixes playback of the sample linked by FFmpeg ticket 2508. The fix follows ffmpeg commit 6158a3b (although it's not exactly the same). The problem here is that the file contains an apparently non-sense DefaultDuration value. DefaultDuration for audio tracks is used to derive PTS values for packets with no timestamps, like they can happen with frames inside a laced block. So the first packet of a SimpleBlock will have a correct PTS, while the PTS values of the following packets are calculated using DefaultDuration, and thus are broken. This leads to seemingly ok playback, but broken A/V sync. Not using the DefaultDuration value will leave the PTS values of these packets unset, and the audio decoder can derive them from the output instead. The fix more or less uses a heuristic to detect the broken case: if the sample rate is 8 KHz (Matroska default, can assume unset), and the codec is AC3 (as the broken file did), don't use it. I'm not sure why this should be done only for AC3, maybe the muxing application (mkvmerge v4.9.1) has known issues with AC3. AC3 also doesn't support 8 KHz as sample rate natively. (By the way, I'm not sure why we should honor the DefaultDuration at all for audio. It doesn't seem to be needed. You can't seek to these frames, and decoders should always be able to produce perfect PTS values by adding the duration of the decoded audio to the first PTS.) |
||
---|---|---|
.. | ||
codec_tags.c | ||
codec_tags.h | ||
demux_cue.c | ||
demux_edl.c | ||
demux_lavf.c | ||
demux_libass.c | ||
demux_mf.c | ||
demux_mkv.c | ||
demux_mng.c | ||
demux_packet.h | ||
demux_raw.c | ||
demux_subreader.c | ||
demux.c | ||
demux.h | ||
ebml.c | ||
ebml.h | ||
matroska.h | ||
mf.c | ||
mf.h | ||
ms_hdr.h | ||
stheader.h |