From 096d88dcc60f3a15ba7b5ee653a76bfaf25b2807 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 23 Jul 2023 10:52:12 +0200 Subject: [PATCH] fftools/ffmpeg_enc: move remaining vsync-related code to video_sync_process() --- fftools/ffmpeg_enc.c | 46 +++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c index d21e85397e..d66aa3fe37 100644 --- a/fftools/ffmpeg_enc.c +++ b/fftools/ffmpeg_enc.c @@ -1036,6 +1036,30 @@ finish: e->frames_prev_hist, sizeof(e->frames_prev_hist[0]) * (FF_ARRAY_ELEMS(e->frames_prev_hist) - 1)); e->frames_prev_hist[0] = *nb_frames_prev; + + if (*nb_frames_prev == 0 && ost->last_dropped) { + ost->nb_frames_drop++; + av_log(ost, AV_LOG_VERBOSE, + "*** dropping frame %"PRId64" at ts %"PRId64"\n", + e->vsync_frame_number, e->last_frame->pts); + } + if (*nb_frames > (*nb_frames_prev && ost->last_dropped) + (*nb_frames > *nb_frames_prev)) { + if (*nb_frames > dts_error_threshold * 30) { + av_log(ost, AV_LOG_ERROR, "%"PRId64" frame duplication too large, skipping\n", *nb_frames - 1); + ost->nb_frames_drop++; + *nb_frames = 0; + return; + } + ost->nb_frames_dup += *nb_frames - (*nb_frames_prev && ost->last_dropped) - (*nb_frames > *nb_frames_prev); + av_log(ost, AV_LOG_VERBOSE, "*** %"PRId64" dup!\n", *nb_frames - 1); + if (ost->nb_frames_dup > e->dup_warning) { + av_log(ost, AV_LOG_WARNING, "More than %"PRIu64" frames duplicated\n", e->dup_warning); + e->dup_warning *= 10; + } + } + + ost->last_dropped = *nb_frames == *nb_frames_prev && frame; + ost->kf.dropped_keyframe = ost->last_dropped && frame && (frame->flags & AV_FRAME_FLAG_KEY); } static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf, @@ -1101,28 +1125,6 @@ static int do_video_out(OutputFile *of, OutputStream *ost, AVFrame *frame) video_sync_process(of, ost, frame, &nb_frames, &nb_frames_prev); - if (nb_frames_prev == 0 && ost->last_dropped) { - ost->nb_frames_drop++; - av_log(ost, AV_LOG_VERBOSE, - "*** dropping frame %"PRId64" at ts %"PRId64"\n", - e->vsync_frame_number, e->last_frame->pts); - } - if (nb_frames > (nb_frames_prev && ost->last_dropped) + (nb_frames > nb_frames_prev)) { - if (nb_frames > dts_error_threshold * 30) { - av_log(ost, AV_LOG_ERROR, "%"PRId64" frame duplication too large, skipping\n", nb_frames - 1); - ost->nb_frames_drop++; - return 0; - } - ost->nb_frames_dup += nb_frames - (nb_frames_prev && ost->last_dropped) - (nb_frames > nb_frames_prev); - av_log(ost, AV_LOG_VERBOSE, "*** %"PRId64" dup!\n", nb_frames - 1); - if (ost->nb_frames_dup > e->dup_warning) { - av_log(ost, AV_LOG_WARNING, "More than %"PRIu64" frames duplicated\n", e->dup_warning); - e->dup_warning *= 10; - } - } - ost->last_dropped = nb_frames == nb_frames_prev && frame; - ost->kf.dropped_keyframe = ost->last_dropped && frame && (frame->flags & AV_FRAME_FLAG_KEY); - /* duplicates frame if needed */ for (i = 0; i < nb_frames; i++) { AVFrame *in_picture;