Message ID | OS3PR01MB5573C67E918C88150E0E6177DD589@OS3PR01MB5573.jpnprd01.prod.outlook.com |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel] fftools/ffmpeg: fix -t inaccurate recording time | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
Is there objection? will push it tomorrow. On Thu, 6 May 2021, Shiwang.Xie wrote: > > if input start time is not 0 -t is inaccurate doing stream copy, > will record extra duration according to input start time. > it should base on following cases: > > input video start time from 60s, duration is 300s, > 1. stream copy: > ffmpeg -ss 40 -t 60 -i in.mp4 -c copy -y out.mp4 > open_input_file() will seek to 100 and set ts_offset to -100, > process_input() will offset pkt->pts with ts_offset to make it 0, > so when do_streamcopy() with -t, exits when ist->pts >= recording_time. > > 2. stream copy with -copyts: > ffmpeg -ss 40 -t 60 -copyts -i in.mp4 -c copy -y out.mp4 > open_input_file() will seek to 100 and set ts_offset to 0, > process_input() will keep raw pkt->pts as ts_offset is 0, > so when do_streamcopy() with -t, exits when > ist->pts >= (recording_time+f->start_time+f->ctx->start_time). > > 3. stream copy with -copyts -start_at_zero: > ffmpeg -ss 40 -t 60 -copyts -start_at_zero -i in.mp4 -c copy -y out.mp4 > open_input_file() will seek to 120 and set ts_offset to -60 as start_to_zero option, > process_input() will offset pkt->pts with input file start time, > so when do_streamcopy() with -t, exits when ist->pts >= (recording_time+f->start_time). > > 0 60 40 60 360 > |_______|_____|_______|_______________________| > start -ss -t > > This fixes ticket #9141. > > Signed-off-by: Shiwang.Xie <shiwang.xie666@outlook.com> > --- > fftools/ffmpeg.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > >
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 3ad11452da..fac9f67462 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -2082,9 +2082,11 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p } if (f->recording_time != INT64_MAX) { - start_time = f->ctx->start_time; - if (f->start_time != AV_NOPTS_VALUE && copy_ts) - start_time += f->start_time; + start_time = 0; + if (copy_ts) { + start_time += f->start_time != AV_NOPTS_VALUE ? f->start_time : 0; + start_time += start_at_zero ? 0 : f->ctx->start_time; + } if (ist->pts >= f->recording_time + start_time) { close_output_stream(ost); return;
if input start time is not 0 -t is inaccurate doing stream copy, will record extra duration according to input start time. it should base on following cases: input video start time from 60s, duration is 300s, 1. stream copy: ffmpeg -ss 40 -t 60 -i in.mp4 -c copy -y out.mp4 open_input_file() will seek to 100 and set ts_offset to -100, process_input() will offset pkt->pts with ts_offset to make it 0, so when do_streamcopy() with -t, exits when ist->pts >= recording_time. 2. stream copy with -copyts: ffmpeg -ss 40 -t 60 -copyts -i in.mp4 -c copy -y out.mp4 open_input_file() will seek to 100 and set ts_offset to 0, process_input() will keep raw pkt->pts as ts_offset is 0, so when do_streamcopy() with -t, exits when ist->pts >= (recording_time+f->start_time+f->ctx->start_time). 3. stream copy with -copyts -start_at_zero: ffmpeg -ss 40 -t 60 -copyts -start_at_zero -i in.mp4 -c copy -y out.mp4 open_input_file() will seek to 120 and set ts_offset to -60 as start_to_zero option, process_input() will offset pkt->pts with input file start time, so when do_streamcopy() with -t, exits when ist->pts >= (recording_time+f->start_time). 0 60 40 60 360 |_______|_____|_______|_______________________| start -ss -t This fixes ticket #9141. Signed-off-by: Shiwang.Xie <shiwang.xie666@outlook.com> --- fftools/ffmpeg.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)