1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-04-24 17:12:34 +02:00

avconv: refactor vsync code.

No functional changes, just make it more readable.
This commit is contained in:
Anton Khirnov 2012-02-06 21:47:41 +01:00
parent 493a86e25b
commit d43040e28b

View File

@ -1356,11 +1356,12 @@ static void do_video_out(AVFormatContext *s,
int nb_frames, i, ret, format_video_sync; int nb_frames, i, ret, format_video_sync;
AVFrame *final_picture; AVFrame *final_picture;
AVCodecContext *enc; AVCodecContext *enc;
double sync_ipts; double sync_ipts, delta;
enc = ost->st->codec; enc = ost->st->codec;
sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base); sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
delta = sync_ipts - ost->sync_opts;
/* by default, we output a single frame */ /* by default, we output a single frame */
nb_frames = 1; nb_frames = 1;
@ -1372,31 +1373,36 @@ static void do_video_out(AVFormatContext *s,
format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
(s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR; (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
if (format_video_sync != VSYNC_PASSTHROUGH) { switch (format_video_sync) {
double vdelta = sync_ipts - ost->sync_opts; case VSYNC_CFR:
// FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
if (vdelta < -1.1) if (delta < -1.1)
nb_frames = 0; nb_frames = 0;
else if (format_video_sync == VSYNC_VFR) { else if (delta > 1.1)
if (vdelta <= -0.6) { nb_frames = lrintf(delta);
break;
case VSYNC_VFR:
if (delta <= -0.6)
nb_frames = 0; nb_frames = 0;
} else if (vdelta > 0.6) else if (delta > 0.6)
ost->sync_opts = lrintf(sync_ipts); ost->sync_opts = lrintf(sync_ipts);
} else if (vdelta > 1.1) break;
nb_frames = lrintf(vdelta); case VSYNC_PASSTHROUGH:
ost->sync_opts = lrintf(sync_ipts);
break;
default:
av_assert0(0);
}
nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
if (nb_frames == 0) { if (nb_frames == 0) {
++nb_frames_drop; nb_frames_drop++;
av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n"); av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
return;
} else if (nb_frames > 1) { } else if (nb_frames > 1) {
nb_frames_dup += nb_frames - 1; nb_frames_dup += nb_frames - 1;
av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1); av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
} }
} else
ost->sync_opts = lrintf(sync_ipts);
nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
if (nb_frames <= 0)
return;
#if !CONFIG_AVFILTER #if !CONFIG_AVFILTER
do_video_resample(ost, ist, in_picture, &final_picture); do_video_resample(ost, ist, in_picture, &final_picture);