summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-video/mpv/files/0.18.0/mpv-0.18.0-fix-initial-av-sync.patch')
-rw-r--r--media-video/mpv/files/0.18.0/mpv-0.18.0-fix-initial-av-sync.patch42
1 files changed, 42 insertions, 0 deletions
diff --git a/media-video/mpv/files/0.18.0/mpv-0.18.0-fix-initial-av-sync.patch b/media-video/mpv/files/0.18.0/mpv-0.18.0-fix-initial-av-sync.patch
new file mode 100644
index 000000000000..c2cacc3bff7a
--- /dev/null
+++ b/media-video/mpv/files/0.18.0/mpv-0.18.0-fix-initial-av-sync.patch
@@ -0,0 +1,42 @@
+commit 614efea3e67a435f3330820c3dc8b402535641e8
+Author: wm4 <wm4@nowhere>
+Date: Fri Jul 1 15:51:34 2016 +0200
+
+ad_lavc: work around braindead ffmpeg behavior
+
+The libavcodec wmapro decoder will skip some bytes at the start of the
+first packet and return each time. It will not return any audio data in
+this state.
+
+Our own code as well as libavcodec's new API handling
+(avcodec_send_packet() etc.) discard the PTS on the first return, which
+means the PTS is never known for the first packet. This results in a
+"Failed audio resync." message.
+
+Fixy it by remember the PTS in next_pts. This field is used only if the
+decoder outputs no PTS, and is updated after each frame - and thus
+should be safe to set.
+
+(Possibly this should be fixed in libavcodec new API handling by not
+setting the PTS to NOPTS as long as no real data has been output. It
+could even interpolate the PTS if the timebase is known.)
+
+Fixes the failure message seen in #3297.
+
+diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c
+index f48993f..0316f6b 100644
+--- a/audio/decode/ad_lavc.c
++++ b/audio/decode/ad_lavc.c
+@@ -186,6 +186,12 @@ static int decode_packet(struct dec_audio *da, struct demux_packet *mpkt,
+ struct priv *priv = da->priv;
+ AVCodecContext *avctx = priv->avctx;
+
++ // If the decoder discards the timestamp for some reason, we use the
++ // interpolated PTS. Initialize it so that it works for the initial
++ // packet as well.
++ if (mpkt && priv->next_pts == MP_NOPTS_VALUE)
++ priv->next_pts = mpkt->pts;
++
+ int in_len = mpkt ? mpkt->len : 0;
+
+ AVPacket pkt;