diff options
author | James Almer <jamrial@gmail.com> | 2021-11-25 14:06:01 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2021-12-01 18:16:56 -0300 |
commit | c1818cb9471c0ab8345a023dc16d6b0c8c2ee000 (patch) | |
tree | 2b9e12cc02eafd190deac33441a77b3adb04af0b | |
parent | 96caa01f130526cb420d0706a40fb63695153128 (diff) | |
download | ffmpeg-c1818cb9471c0ab8345a023dc16d6b0c8c2ee000.tar.gz |
ffmpeg: fix usage of -shortest in codec copy scenarios
Don't mark all streams as finished, instead make sync_opts keep track of the
stream's duration, and set recording_time to it, same as in transcoding paths.
Fixes tickets #9512 and #9513.
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | fftools/ffmpeg.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 18302f3b5f..cfb04d5eff 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -871,10 +871,11 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u static void close_output_stream(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; + AVRational time_base = ost->stream_copy ? ost->mux_timebase : ost->enc_ctx->time_base; ost->finished |= ENCODER_FINISHED; if (of->shortest) { - int64_t end = av_rescale_q(ost->sync_opts - ost->first_pts, ost->enc_ctx->time_base, AV_TIME_BASE_Q); + int64_t end = av_rescale_q(ost->sync_opts - ost->first_pts, time_base, AV_TIME_BASE_Q); of->recording_time = FFMIN(of->recording_time, end); } } @@ -1483,13 +1484,13 @@ static void do_video_stats(OutputStream *ost, int frame_size) static void finish_output_stream(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; - int i; + AVRational time_base = ost->stream_copy ? ost->mux_timebase : ost->enc_ctx->time_base; ost->finished = ENCODER_FINISHED | MUXER_FINISHED; if (of->shortest) { - for (i = 0; i < of->ctx->nb_streams; i++) - output_streams[of->ost_index + i]->finished = ENCODER_FINISHED | MUXER_FINISHED; + int64_t end = av_rescale_q(ost->sync_opts - ost->first_pts, time_base, AV_TIME_BASE_Q); + of->recording_time = FFMIN(of->recording_time, end); } } @@ -2086,10 +2087,6 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p } } - /* force the input stream PTS */ - if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) - ost->sync_opts++; - if (av_packet_ref(opkt, pkt) < 0) exit_program(1); @@ -2113,6 +2110,8 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p opkt->duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->mux_timebase); + ost->sync_opts += opkt->duration; + output_packet(of, opkt, ost, 0); } |