Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Anton Khirnov <anton@khirnov.net>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH 03/13] fftools/ffmpeg: store forced keyframe pts in AV_TIME_BASE_Q
Date: Sat, 26 Nov 2022 09:19:01 +0100
Message-ID: <20221126081911.31275-3-anton@khirnov.net> (raw)
In-Reply-To: <20221126081911.31275-1-anton@khirnov.net>

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 --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;
-- 
2.35.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2022-11-26  8:20 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-26  8:18 [FFmpeg-devel] [PATCH 01/13] fftools/ffmpeg: stop explicitly closing decoders Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 02/13] fftools/ffmpeg: move force-keyframe-related vars to a separate struct Anton Khirnov
2022-11-26  8:19 ` Anton Khirnov [this message]
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 04/13] fftools/ffmpeg: parse forced keyframes in of_open() Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 05/13] fftools/ffmpeg: avoid storing full forced keyframe spec Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 06/13] fftools/ffmpeg: move logging filtered frame timestamps Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 07/13] fftools/ffmpeg: set AVFrame.time_base after filtering Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 08/13] fftools/ffmpeg: stop calling adjust_frame_pts_to_encoder_tb() for audio Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 09/13] fftools/ffmpeg: call check_recording_time() with actual frame pts Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 10/13] fftools/ffmpeg: only convert video frame pts if we have a frame Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 11/13] fftools/ffmpeg: drop an always-false check Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 12/13] fftools/ffmpeg: remove a useless inner block Anton Khirnov
2022-11-26  8:19 ` [FFmpeg-devel] [PATCH 13/13] fftools/ffmpeg: cosmetics Anton Khirnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221126081911.31275-3-anton@khirnov.net \
    --to=anton@khirnov.net \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git