summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mpvcore/player/video.c5
-rw-r--r--video/decode/dec_video.c6
-rw-r--r--video/decode/dec_video.h3
3 files changed, 13 insertions, 1 deletions
diff --git a/mpvcore/player/video.c b/mpvcore/player/video.c
index a758995c09..daa98c55f6 100644
--- a/mpvcore/player/video.c
+++ b/mpvcore/player/video.c
@@ -295,8 +295,11 @@ double update_video(struct MPContext *mpctx, double endpts)
struct demux_packet *pkt = demux_read_packet(d_video->header);
if (pkt && pkt->pts != MP_NOPTS_VALUE)
pkt->pts += mpctx->video_offset;
- if (pkt && pkt->pts >= mpctx->hrseek_pts - .005)
+ if ((pkt && pkt->pts >= mpctx->hrseek_pts - .005) ||
+ d_video->has_broken_packet_pts)
+ {
mpctx->hrseek_framedrop = false;
+ }
int framedrop_type = mpctx->hrseek_active && mpctx->hrseek_framedrop ?
1 : check_framedrop(mpctx, -1);
struct mp_image *decoded_frame =
diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c
index 1802e19fbf..ec4cd5b775 100644
--- a/video/decode/dec_video.c
+++ b/video/decode/dec_video.c
@@ -171,6 +171,7 @@ bool video_init_best_codec(struct dec_video *d_video, char* video_decoders)
{
assert(!d_video->vd_driver);
video_reset_decoding(d_video);
+ d_video->has_broken_packet_pts = -10; // needs 10 packets to reach decision
struct mp_decoder_entry *decoder = NULL;
struct mp_decoder_list *list =
@@ -363,6 +364,11 @@ struct mp_image *video_decode(struct dec_video *d_video,
pts = d_video->decoded_pts;
}
+ if (d_video->has_broken_packet_pts < 0)
+ d_video->has_broken_packet_pts++;
+ if (d_video->num_codec_pts_problems || pkt_pts == MP_NOPTS_VALUE)
+ d_video->has_broken_packet_pts = 1;
+
mpi->pts = pts;
d_video->decoded_pts = pts;
return mpi;
diff --git a/video/decode/dec_video.h b/video/decode/dec_video.h
index d411717a32..090b60bc1c 100644
--- a/video/decode/dec_video.h
+++ b/video/decode/dec_video.h
@@ -62,6 +62,9 @@ struct dec_video {
// PTS or DTS of packet last read
double last_packet_pdts;
+ // There was at least one packet with non-sense timestamps.
+ int has_broken_packet_pts; // <0: uninitialized, 0: no problems, 1: broken
+
// Final PTS of previously decoded image
double decoded_pts;