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:
parent
b1143330c8
commit
efe4423627
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user