1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-02-04 06:08:26 +02:00

fftools/ffmpeg: use last filter output pts to choose next output stream

This will be needed in following commits that will add new buffering
stages after encoding and bitstream filtering.
This commit is contained in:
Anton Khirnov 2022-06-10 14:38:32 +02:00
parent d55b8dbcff
commit b2b9e9ccee
3 changed files with 20 additions and 5 deletions

View File

@ -1351,6 +1351,12 @@ static int reap_filters(int flush)
continue;
}
if (filtered_frame->pts != AV_NOPTS_VALUE) {
AVRational tb = av_buffersink_get_time_base(filter);
ost->last_filter_pts = av_rescale_q(filtered_frame->pts, tb,
AV_TIME_BASE_Q);
}
switch (av_buffersink_get_type(filter)) {
case AVMEDIA_TYPE_VIDEO:
if (!ost->frame_aspect_ratio.num)
@ -3448,13 +3454,19 @@ static OutputStream *choose_output(void)
for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i];
int64_t opts = ost->last_mux_dts == AV_NOPTS_VALUE ? INT64_MIN :
int64_t opts;
if (ost->filter && ost->last_filter_pts != AV_NOPTS_VALUE) {
opts = ost->last_filter_pts;
} else {
opts = ost->last_mux_dts == AV_NOPTS_VALUE ? INT64_MIN :
av_rescale_q(ost->last_mux_dts, ost->st->time_base,
AV_TIME_BASE_Q);
if (ost->last_mux_dts == AV_NOPTS_VALUE)
av_log(NULL, AV_LOG_DEBUG,
"cur_dts is invalid st:%d (%d) [init:%d i_done:%d finish:%d] (this is harmless if it occurs once at the start per stream)\n",
ost->st->index, ost->st->id, ost->initialized, ost->inputs_done, ost->finished);
if (ost->last_mux_dts == AV_NOPTS_VALUE)
av_log(NULL, AV_LOG_DEBUG,
"cur_dts is invalid st:%d (%d) [init:%d i_done:%d finish:%d] (this is harmless if it occurs once at the start per stream)\n",
ost->st->index, ost->st->id, ost->initialized, ost->inputs_done, ost->finished);
}
if (!ost->initialized && !ost->inputs_done)
return ost->unavailable ? NULL : ost;

View File

@ -470,6 +470,8 @@ typedef struct OutputStream {
int64_t first_pts;
/* dts of the last packet sent to the muxer */
int64_t last_mux_dts;
/* pts of the last frame received from the filters, in AV_TIME_BASE_Q */
int64_t last_filter_pts;
// the timebase of the packets sent to the muxer
AVRational mux_timebase;
AVRational enc_timebase;

View File

@ -1721,6 +1721,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
}
ost->last_mux_dts = AV_NOPTS_VALUE;
ost->last_filter_pts = AV_NOPTS_VALUE;
return ost;
}