From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id ABB754C85B for ; Fri, 24 Jan 2025 15:31:03 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8608568B77F; Fri, 24 Jan 2025 17:30:59 +0200 (EET) Received: from mout-p-102.mailbox.org (mout-p-102.mailbox.org [80.241.56.152]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 60DFF68B68D for ; Fri, 24 Jan 2025 17:30:52 +0200 (EET) Received: from smtp102.mailbox.org (smtp102.mailbox.org [10.196.197.102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4YfhbY6lVDz9tnP for ; Fri, 24 Jan 2025 16:30:49 +0100 (CET) Message-ID: Date: Fri, 24 Jan 2025 21:00:46 +0530 MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org References: <20250124115910.3550-1-ingo@datarhei.com> Content-Language: en-US From: Gyan Doshi In-Reply-To: <20250124115910.3550-1-ingo@datarhei.com> Subject: Re: [FFmpeg-devel] [PATCH v1] avformat/hlsenc: fix hls_time not respected X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 2025-01-24 05:29 pm, Ingo Oppermann wrote: > This fixes the criterion when to split the segments based on the elapsed time > for the current segment instead of using the theoretical elapsed time since > start based on hls_time and the number of written segments. > > hls_time is used to define the minimum length of a segment, however this is > not respected in all cases when a stream has variable GOP sizes. > > Imagine a stream starts with a key frame every 10 seconds for e.g. 40 seconds. > After that, key frames will come every second. This will result in segments > that are first 10 seconds, then 1 second for some time and later 2 seconds as > expected. Better to make it flexible like how the segment muxer does it, by having an optional minimum segment duration parameter. Then it's upto the user. See d39b34123d. Also Patchwork warns about the line length in the commit message. Should be <=72 Regards, Gyan > > How to reproduce: > ffmpeg -t 40 -f lavfi -i testsrc2=s=1280x720:r=25 -codec:v libx264 -g 250 part1.mp4 > ffmpeg -t 40 -f lavfi -i testsrc2=s=1280x720:r=25 -codec:v libx264 -g 25 part2.mp4 > echo "file part1.mp4\nfile part2.mp4" > list.txt > ffmpeg -f concat -i list.txt -codec copy part.mp4 > ffmpeg -i part.mp4 -codec copy -f hls -hls_time 2 -hls_list_size 0 -hls_segment_filename 'part_%d.ts' part.m3u8 > cat part.m3u8 > > Signed-off-by: Ingo Oppermann > --- > libavformat/hlsenc.c | 12 +++--------- > 1 file changed, 3 insertions(+), 9 deletions(-) > > diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c > index 6148685f40..2c5d60500d 100644 > --- a/libavformat/hlsenc.c > +++ b/libavformat/hlsenc.c > @@ -2474,7 +2474,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) > HLSContext *hls = s->priv_data; > AVFormatContext *oc = NULL; > AVStream *st = s->streams[pkt->stream_index]; > - int64_t end_pts = 0; > int is_ref_pkt = 1; > int ret = 0, can_split = 1, i, j; > int stream_index = 0; > @@ -2512,14 +2511,9 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) > return AVERROR(ENOMEM); > } > > - end_pts = hls->recording_time * vs->number; > - > if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) { > - /* reset end_pts, hls->recording_time at end of the init hls list */ > - int64_t init_list_dur = hls->init_time * vs->nb_entries; > - int64_t after_init_list_dur = (vs->sequence - hls->start_sequence - vs->nb_entries) * hls->time; > + /* reset hls->recording_time at end of the init hls list */ > hls->recording_time = hls->time; > - end_pts = init_list_dur + after_init_list_dur ; > } > > if (vs->start_pts == AV_NOPTS_VALUE) { > @@ -2560,8 +2554,8 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) > } > > can_split = can_split && (pkt->pts - vs->end_pts > 0); > - if (vs->packets_written && can_split && av_compare_ts(pkt->pts - vs->start_pts, st->time_base, > - end_pts, AV_TIME_BASE_Q) >= 0) { > + if (vs->packets_written && can_split && av_compare_ts(pkt->pts - vs->end_pts, st->time_base, > + hls->recording_time, AV_TIME_BASE_Q) >= 0) { > int64_t new_start_pos; > int byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0); > double cur_duration; > > base-commit: e20ee9f9aec94f8cea1bf4fd8ed3fb096fb205e5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".