summaryrefslogtreecommitdiff
path: root/avconv.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-02-06 21:47:41 +0100
committerAnton Khirnov <anton@khirnov.net>2012-02-26 07:28:27 +0100
commitd43040e28b7e9af315260c0837e276fdeda8eb79 (patch)
tree5ff29b46790b26b00790aeb61588d86dcecdc2e8 /avconv.c
parent493a86e25b9e51b45231c510cabe481ae369fb37 (diff)
avconv: refactor vsync code.
No functional changes, just make it more readable.
Diffstat (limited to 'avconv.c')
-rw-r--r--avconv.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/avconv.c b/avconv.c
index d7ca8bdf89..8310f7374b 100644
--- a/avconv.c
+++ b/avconv.c
@@ -1356,11 +1356,12 @@ static void do_video_out(AVFormatContext *s,
int nb_frames, i, ret, format_video_sync;
AVFrame *final_picture;
AVCodecContext *enc;
- double sync_ipts;
+ double sync_ipts, delta;
enc = ost->st->codec;
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 */
nb_frames = 1;
@@ -1372,31 +1373,36 @@ static void do_video_out(AVFormatContext *s,
format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
(s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
- if (format_video_sync != VSYNC_PASSTHROUGH) {
- double vdelta = sync_ipts - ost->sync_opts;
+ switch (format_video_sync) {
+ case VSYNC_CFR:
// 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;
- else if (format_video_sync == VSYNC_VFR) {
- if (vdelta <= -0.6) {
- nb_frames = 0;
- } else if (vdelta > 0.6)
- ost->sync_opts = lrintf(sync_ipts);
- } else if (vdelta > 1.1)
- nb_frames = lrintf(vdelta);
- if (nb_frames == 0) {
- ++nb_frames_drop;
- av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
- } else if (nb_frames > 1) {
- nb_frames_dup += nb_frames - 1;
- av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
- }
- } else
+ else if (delta > 1.1)
+ nb_frames = lrintf(delta);
+ break;
+ case VSYNC_VFR:
+ if (delta <= -0.6)
+ nb_frames = 0;
+ else if (delta > 0.6)
+ ost->sync_opts = lrintf(sync_ipts);
+ break;
+ 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++;
+ av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
return;
+ } else if (nb_frames > 1) {
+ nb_frames_dup += nb_frames - 1;
+ av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
+ }
#if !CONFIG_AVFILTER
do_video_resample(ost, ist, in_picture, &final_picture);