1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-10-03 17:29:30 +02:00

fftools/ffmpeg: store forced keyframe pts in AV_TIME_BASE_Q

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.
This commit is contained in:
Anton Khirnov 2022-11-17 12:55:47 +01:00
parent b1143330c8
commit efe4423627
2 changed files with 6 additions and 10 deletions

View File

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

View File

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