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