Extract into its own function the code to compute frame delay.

Patch by Tomer Barletz gmail_address(last_name)

Originally committed as revision 17431 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Tomer Barletz 2009-02-18 15:17:39 +00:00 committed by Benoit Fouet
parent 1447aac4be
commit 49410784de
1 changed files with 46 additions and 39 deletions

View File

@ -1005,35 +1005,18 @@ static void stream_pause(VideoState *is)
}
}
/* called to display each frame */
static void video_refresh_timer(void *opaque)
static double compute_frame_delay(double frame_current_pts, VideoState *is)
{
VideoState *is = opaque;
VideoPicture *vp;
double actual_delay, delay, sync_threshold, ref_clock, diff;
SubPicture *sp, *sp2;
if (is->video_st) {
if (is->pictq_size == 0) {
/* if no picture, need to wait */
schedule_refresh(is, 1);
} else {
/* dequeue the picture */
vp = &is->pictq[is->pictq_rindex];
/* update current video pts */
is->video_current_pts = vp->pts;
is->video_current_pts_time = av_gettime();
/* compute nominal delay */
delay = vp->pts - is->frame_last_pts;
delay = frame_current_pts - is->frame_last_pts;
if (delay <= 0 || delay >= 10.0) {
/* if incorrect delay, use previous one */
delay = is->frame_last_delay;
}
is->frame_last_delay = delay;
is->frame_last_pts = vp->pts;
is->frame_last_pts = frame_current_pts;
/* update delay to follow master synchronisation source */
if (((is->av_sync_type == AV_SYNC_AUDIO_MASTER && is->audio_st) ||
@ -1041,7 +1024,7 @@ static void video_refresh_timer(void *opaque)
/* if video is slave, we try to correct big delays by
duplicating or deleting a frame */
ref_clock = get_master_clock(is);
diff = vp->pts - ref_clock;
diff = frame_current_pts - ref_clock;
/* skip or repeat frame. We take into account the
delay to compute the threshold. I still don't know
@ -1063,8 +1046,32 @@ static void video_refresh_timer(void *opaque)
/* XXX: should skip picture */
actual_delay = 0.010;
}
return actual_delay;
}
/* called to display each frame */
static void video_refresh_timer(void *opaque)
{
VideoState *is = opaque;
VideoPicture *vp;
SubPicture *sp, *sp2;
if (is->video_st) {
if (is->pictq_size == 0) {
/* if no picture, need to wait */
schedule_refresh(is, 1);
} else {
/* dequeue the picture */
vp = &is->pictq[is->pictq_rindex];
/* update current video pts */
is->video_current_pts = vp->pts;
is->video_current_pts_time = av_gettime();
/* launch timer for next picture */
schedule_refresh(is, (int)(actual_delay * 1000 + 0.5));
schedule_refresh(is, (int)(compute_frame_delay(vp->pts, is) * 1000 + 0.5));
#if defined(DEBUG_SYNC)
printf("video: delay=%0.3f actual_delay=%0.3f pts=%0.3f A-V=%f\n",