diff --git a/ffplay.c b/ffplay.c index 7a6b72a43c..3cd3c3fdf7 100644 --- a/ffplay.c +++ b/ffplay.c @@ -1359,13 +1359,30 @@ static void alloc_picture(void *opaque) SDL_UnlockMutex(is->pictq_mutex); } -/** - * - * @param pts the dts of the pkt / pts of the frame and guessed if not known - */ -static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t pos) +static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_t pos) { VideoPicture *vp; + double frame_delay, pts = pts1; + + /* compute the exact PTS for the picture if it is omitted in the stream + * pts1 is the dts of the pkt / pts of the frame */ + if (pts != 0) { + /* update video clock with pts, if present */ + is->video_clock = pts; + } else { + pts = is->video_clock; + } + /* update video clock for next frame */ + frame_delay = av_q2d(is->video_st->codec->time_base); + /* for MPEG2, the frame can be repeated, so we update the + clock accordingly */ + frame_delay += src_frame->repeat_pict * (frame_delay * 0.5); + is->video_clock += frame_delay; + +#if defined(DEBUG_SYNC) && 0 + printf("frame_type=%c clock=%0.3f pts=%0.3f\n", + av_get_pict_type_char(src_frame->pict_type), pts, pts1); +#endif /* wait until we have space to put a new picture */ SDL_LockMutex(is->pictq_mutex); @@ -1469,36 +1486,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, int64_t return 0; } -/** - * compute the exact PTS for the picture if it is omitted in the stream - * @param pts1 the dts of the pkt / pts of the frame - */ -static int output_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_t pos) -{ - double frame_delay, pts; - - pts = pts1; - - if (pts != 0) { - /* update video clock with pts, if present */ - is->video_clock = pts; - } else { - pts = is->video_clock; - } - /* update video clock for next frame */ - frame_delay = av_q2d(is->video_st->codec->time_base); - /* for MPEG2, the frame can be repeated, so we update the - clock accordingly */ - frame_delay += src_frame->repeat_pict * (frame_delay * 0.5); - is->video_clock += frame_delay; - -#if defined(DEBUG_SYNC) && 0 - printf("frame_type=%c clock=%0.3f pts=%0.3f\n", - av_get_pict_type_char(src_frame->pict_type), pts, pts1); -#endif - return queue_picture(is, src_frame, pts, pos); -} - static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacket *pkt) { int len1, got_picture, i; @@ -1853,7 +1840,7 @@ static int video_thread(void *arg) pts = pts_int*av_q2d(is->video_st->time_base); - ret = output_picture(is, frame, pts, pos); + ret = queue_picture(is, frame, pts, pos); #if !CONFIG_AVFILTER av_free_packet(&pkt); #endif