diff options
-rw-r--r-- | mpvcore/player/video.c | 5 | ||||
-rw-r--r-- | video/decode/dec_video.c | 6 | ||||
-rw-r--r-- | video/decode/dec_video.h | 3 |
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; |