[FFmpeg-devel] [PATCH] ffmpeg: apply discontinuity adjustment per-stream

Gyan Doshi ffmpeg at gyani.pro
Wed Jan 11 08:59:40 EET 2023



On 2023-01-11 01:40 am, Michael Niedermayer wrote:
> On Tue, Jan 03, 2023 at 03:52:17PM +0530, Gyan Doshi wrote:
>> At present, the offset for discontinuity adjustment is applied per-file but
>> the check for discontinuity is intra-stream so the same discontinuity when
>> seen in multiple streams with copyts, leads to compounded adjustment of the
>> discontinuity offset. This introduces gaps in streams, leading to loss of sync
>> or even de facto loss of stream.
>>
>> The ts_offset_discont parameter is transferred to InputStream and adjusted
>> based on intra-stream gaps.
>> ---
>> Here's a simulated example to demonstrate the issue:
>> 1) generate input
>> ffmpeg -f lavfi -i nullsrc=s=32x32:r=1,format=gray -f lavfi -i anullsrc=cl=mono:r=8000 -c:v libx264 -preset superfast -bf 0 -crf 50 -c:a aac -b:a 64k -muxpreload 0 -muxdelay 0 -output_ts_offset 95000 -t 100000 src-100000s.ts
>>
>> 2) demo
>> ffmpeg -copyts -i "src-100000.ts" -vf "showinfo=checksum=0" -af "ashowinfo" -f null - -report
>>
>> ==Before patch==
>>
>> timestamp discontinuity for stream #0:1 (id=257, type=audio): -95443717689, new offset= 95443717689
>> timestamp discontinuity for stream #0:0 (id=256, type=video): -95443717689, new offset= 190887435378
>>
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:0 pts:759998976 pts_time:94999.9
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:1 pts:760000000 pts_time:95000
>>   ...
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:745202 pts:1523085824 pts_time:190386
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:745203 pts:1523086848 pts_time:190386
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:745204 pts:2286637614 pts_time:285830
>> [Parsed_ashowinfo_0 @ 000002700af98800] n:745205 pts:2286638638 pts_time:285830
>>
>>
>> [Parsed_showinfo_0 @ 000002700ec34700] n:   0 pts:8550000000 pts_time:95000
>> [Parsed_showinfo_0 @ 000002700ec34700] n:   1 pts:8550090000 pts_time:95001
>>   ...
>> [Parsed_showinfo_0 @ 000002700ec34700] n:95380 pts:17134200000 pts_time:190380
>> [Parsed_showinfo_0 @ 000002700ec34700] n:95381 pts:17134290000 pts_time:190381
>> [Parsed_showinfo_0 @ 000002700ec34700] n:95382 pts:25724314592 pts_time:285826
>> [Parsed_showinfo_0 @ 000002700ec34700] n:95383 pts:25724404592 pts_time:285827
>>
>> ==After patch==
>>
>> timestamp discontinuity for stream #0:1 (id=257, type=audio): -95443717689, new stream offset= 95443717689
>> timestamp discontinuity for stream #0:0 (id=256, type=video): -95443717689, new stream offset= 95443717689
>>
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:0 pts:759998976 pts_time:94999.9
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:1 pts:760000000 pts_time:95000
>>   ...
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:745202 pts:1523085824 pts_time:190386
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:745203 pts:1523086848 pts_time:190386
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:745204 pts:1523087872 pts_time:190386
>> [Parsed_ashowinfo_0 @ 0000023c773c8880] n:745205 pts:1523088896 pts_time:190386
>>
>>
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:   0 pts:8550000000 pts_time:95000
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:   1 pts:8550090000 pts_time:95001
>>   ...
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:95380 pts:17134200000 pts_time:190380
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:95381 pts:17134290000 pts_time:190381
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:95382 pts:17134380000 pts_time:190382
>> [Parsed_showinfo_0 @ 0000023c795d07c0] n:95383 pts:17134470000 pts_time:190383
>>
>>
>>
>>   fftools/ffmpeg.c | 12 ++++++------
>>   fftools/ffmpeg.h |  8 ++++----
>>   2 files changed, 10 insertions(+), 10 deletions(-)
> I havent looked into this but i have a slightly ungood feeling about this
> change
Yes, this is a hack. Ideal is to track and sync discontinuities at both 
file and stream level to avoid compound adjustments.
Let me rework this.

Regards,
Gyan



More information about the ffmpeg-devel mailing list