diff mbox series

[FFmpeg-devel] fftools/ffmpeg: fix -t inaccurate recording time

Message ID OS3PR01MB5573C67E918C88150E0E6177DD589@OS3PR01MB5573.jpnprd01.prod.outlook.com
State Superseded
Headers show
Series [FFmpeg-devel] fftools/ffmpeg: fix -t inaccurate recording time | expand

Checks

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

Commit Message

Shiwang.Xie May 6, 2021, 3:57 p.m. UTC
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(-)

Comments

Shiwang.Xie May 12, 2021, 10:42 a.m. UTC | #1
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 mbox series

Patch

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;