diff mbox series

[FFmpeg-devel,03/13] fftools/ffmpeg: store forced keyframe pts in AV_TIME_BASE_Q

Message ID 20221126081911.31275-3-anton@khirnov.net
State Accepted
Commit efe442362794abe3cef43eea6b4071919b0b2866
Headers show
Series [FFmpeg-devel,01/13] fftools/ffmpeg: stop explicitly closing decoders | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov Nov. 26, 2022, 8:19 a.m. UTC
Rather than the encoder timebase. Since the times are parsed as
microseconds, this will not reduce precision, except possibly when
chapter times are used and the chapter timebase happens to be better
aligned with the encoder timebase, which is unlikely.

This will allow parsing the keyframe times earlier (before encoder
timebase is known) in future commits.
---
 fftools/ffmpeg.c | 15 +++++----------
 fftools/ffmpeg.h |  1 +
 2 files changed, 6 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 3d10ffc3b2..5d39d8f69b 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -1052,7 +1052,7 @@  static enum AVPictureType forced_kf_apply(KeyframeForceCtx *kf, AVRational tb,
 
     pts_time = (in_picture->pts - kf->ref_pts) * av_q2d(tb);
     if (kf->index < kf->nb_pts &&
-        in_picture->pts >= kf->pts[kf->index]) {
+        av_compare_ts(in_picture->pts, tb, kf->pts[kf->index], AV_TIME_BASE_Q) >= 0) {
         kf->index++;
         goto force_keyframe;
     } else if (kf->pexpr) {
@@ -2748,8 +2748,7 @@  static void set_encoder_id(OutputFile *of, OutputStream *ost)
                 AV_DICT_DONT_STRDUP_VAL | AV_DICT_DONT_OVERWRITE);
 }
 
-static void parse_forced_key_frames(KeyframeForceCtx *kf, OutputFile *of,
-                                    AVCodecContext *avctx)
+static void parse_forced_key_frames(KeyframeForceCtx *kf, OutputFile *of)
 {
     const char *p;
     int n = 1, i, size, index = 0;
@@ -2782,21 +2781,17 @@  static void parse_forced_key_frames(KeyframeForceCtx *kf, OutputFile *of,
                                      sizeof(*pts))))
                 report_and_exit(AVERROR(ENOMEM));
             t = p[8] ? parse_time_or_die("force_key_frames", p + 8, 1) : 0;
-            t = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
 
             for (j = 0; j < nb_ch; j++) {
                 const AVChapter *c = ch[j];
                 av_assert1(index < size);
                 pts[index++] = av_rescale_q(c->start, c->time_base,
-                                            avctx->time_base) + t;
+                                            AV_TIME_BASE_Q) + t;
             }
 
         } else {
-
-            t = parse_time_or_die("force_key_frames", p, 1);
             av_assert1(index < size);
-            pts[index++] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
-
+            pts[index++] = parse_time_or_die("force_key_frames", p, 1);
         }
 
         p = next;
@@ -2971,7 +2966,7 @@  static int init_output_stream_encode(OutputStream *ost, AVFrame *frame)
                 // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
                 // parse it only for static kf timings
             } else if(strncmp(ost->kf.forced_keyframes, "source", 6)) {
-                parse_forced_key_frames(&ost->kf, of, ost->enc_ctx);
+                parse_forced_key_frames(&ost->kf, of);
             }
         }
         break;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index db1f00b259..f5d51b90ec 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -492,6 +492,7 @@  typedef struct KeyframeForceCtx {
 
     int64_t      ref_pts;
 
+    // timestamps of the forced keyframes, in AV_TIME_BASE_Q
     int64_t     *pts;
     int       nb_pts;
     int          index;