summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/dec_video.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c
index 51da1adf7b..1dd6e42313 100644
--- a/libmpcodecs/dec_video.c
+++ b/libmpcodecs/dec_video.c
@@ -394,20 +394,6 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
double tt;
if (correct_pts && pts != MP_NOPTS_VALUE) {
- int delay = get_current_video_decoder_lag(sh_video);
- if (delay >= 0) {
- if (delay > sh_video->num_buffered_pts)
-#if 0
- // this is disabled because vd_ffmpeg reports the same lag
- // after seek even when there are no buffered frames,
- // leading to incorrect error messages
- mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n");
-#else
- ;
-#endif
- else
- sh_video->num_buffered_pts = delay;
- }
if (sh_video->num_buffered_pts ==
sizeof(sh_video->buffered_pts) / sizeof(double))
mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n");
@@ -451,6 +437,7 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
mpi->fields &= ~MP_IMGFIELD_TOP_FIRST;
if (correct_pts) {
+ int delay = get_current_video_decoder_lag(sh_video);
if (sh_video->num_buffered_pts) {
sh_video->num_buffered_pts--;
sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts];
@@ -459,6 +446,22 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
"No pts value from demuxer to " "use for frame!\n");
sh_video->pts = MP_NOPTS_VALUE;
}
+ if (delay >= 0) {
+ // limit buffered pts only afterwards so we do not get confused
+ // by packets that produce no output (e.g. a single field of a
+ // H.264 frame).
+ if (delay > sh_video->num_buffered_pts)
+#if 0
+ // this is disabled because vd_ffmpeg reports the same lag
+ // after seek even when there are no buffered frames,
+ // leading to incorrect error messages
+ mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n");
+#else
+ ;
+#endif
+ else
+ sh_video->num_buffered_pts = delay;
+ }
}
return mpi;
}