[FFmpeg-devel] [PATCH 9/9] fftools/ffmpeg: move derivation of frame duration from filter framerate

Anton Khirnov anton at khirnov.net
Sun Oct 1 15:55:52 EEST 2023


>From ffmpeg_enc to ffmpeg_filter, which is a more appropriate
place for it.
---
 fftools/ffmpeg_enc.c    | 9 +--------
 fftools/ffmpeg_filter.c | 6 +++++-
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index 6c00156121..ec9cebbd96 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -1109,16 +1109,9 @@ static int do_video_out(OutputFile *of, OutputStream *ost, AVFrame *frame)
     int64_t nb_frames, nb_frames_prev, i;
     double duration = 0;
 
-    if (frame) {
-        FrameData *fd = frame_data(frame);
-
+    if (frame)
         duration = frame->duration * av_q2d(frame->time_base) / av_q2d(enc->time_base);
 
-        if (duration <= 0 &&
-            fd->frame_rate_filter.num > 0 && fd->frame_rate_filter.den > 0)
-            duration = 1 / (av_q2d(fd->frame_rate_filter) * av_q2d(enc->time_base));
-    }
-
     video_sync_process(of, ost, frame, duration,
                        &nb_frames, &nb_frames_prev);
 
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 9bf870b615..b6348d7f87 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -1817,8 +1817,12 @@ static int fg_output_step(OutputFilterPriv *ofp, int flush)
 
     if (ost->type == AVMEDIA_TYPE_VIDEO) {
         AVRational fr = av_buffersink_get_frame_rate(filter);
-        if (fr.num > 0 && fr.den > 0)
+        if (fr.num > 0 && fr.den > 0) {
             fd->frame_rate_filter = fr;
+
+            if (!frame->duration)
+                frame->duration = av_rescale_q(1, av_inv_q(fr), frame->time_base);
+        }
     }
 
     ret = enc_frame(ost, frame);
-- 
2.40.1



More information about the ffmpeg-devel mailing list