Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH v2] avformat/hlsenc: fix hls_time not respected
@ 2025-01-27  9:09 Ingo Oppermann
  2025-01-28 14:10 ` Michael Niedermayer
  0 siblings, 1 reply; 3+ messages in thread
From: Ingo Oppermann @ 2025-01-27  9:09 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Ingo Oppermann

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. 30 seconds. After that, key frames will come every second. This
will result in segments that are first 10 seconds (as expected), then
1 second for some time (not as expected) and later 2 seconds (as
expected).

How to reproduce:
ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 250 part1.mp4
ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 25 part2.mp4
echo "file part1.mp4\nfile part2.mp4" > list.txt
ffmpeg -f concat -i list.txt -codec copy \
    -f hls -hls_time 2 -hls_list_size 0 parts.m3u8
cat parts.m3u8

Signed-off-by: Ingo Oppermann <ingo@datarhei.com>
---
 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: f632ab53d98168b9b731cf5696547c26059c0822
-- 
2.39.5 (Apple Git-154)

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [FFmpeg-devel] [PATCH v2] avformat/hlsenc: fix hls_time not respected
  2025-01-27  9:09 [FFmpeg-devel] [PATCH v2] avformat/hlsenc: fix hls_time not respected Ingo Oppermann
@ 2025-01-28 14:10 ` Michael Niedermayer
  2025-01-28 14:37   ` Ingo Oppermann
  0 siblings, 1 reply; 3+ messages in thread
From: Michael Niedermayer @ 2025-01-28 14:10 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 1955 bytes --]

On Mon, Jan 27, 2025 at 10:09:30AM +0100, 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. 30 seconds. After that, key frames will come every second. This
> will result in segments that are first 10 seconds (as expected), then
> 1 second for some time (not as expected) and later 2 seconds (as
> expected).
> 
> How to reproduce:
> ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 250 part1.mp4
> ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 25 part2.mp4
> echo "file part1.mp4\nfile part2.mp4" > list.txt
> ffmpeg -f concat -i list.txt -codec copy \
>     -f hls -hls_time 2 -hls_list_size 0 parts.m3u8
> cat parts.m3u8
> 
> Signed-off-by: Ingo Oppermann <ingo@datarhei.com>
> ---
>  libavformat/hlsenc.c | 12 +++---------
>  1 file changed, 3 insertions(+), 9 deletions(-)

this breaks / needs to update
fate-hls-init-time

--- ./tests/ref/fate/hls-init-time	2025-01-28 13:58:16.733614814 +0100
+++ tests/data/fate/hls-init-time	2025-01-28 15:09:03.869138579 +0100
@@ -3,310 +3,308 @@
 #codec_id 0: pcm_s16le
 #sample_rate 0: 44100
 #channel_layout_name 0: mono
-0,          0,          0,     1152,     2304, 0x28123557
-0,       1152,       1152,     1152,     2304, 0x838c7e81
-0,       2304,       2304,     1152,     2304, 0x4fb8704c
-0,       3456,       3456,     1152,     2304, 0x5f787f9e
...

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The misfortune of the wise is better than the prosperity of the fool.
-- Epicurus

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [FFmpeg-devel] [PATCH v2] avformat/hlsenc: fix hls_time not respected
  2025-01-28 14:10 ` Michael Niedermayer
@ 2025-01-28 14:37   ` Ingo Oppermann
  0 siblings, 0 replies; 3+ messages in thread
From: Ingo Oppermann @ 2025-01-28 14:37 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


> On 28 Jan 2025, at 15:10, Michael Niedermayer <michael@niedermayer.cc> wrote:
> 
> On Mon, Jan 27, 2025 at 10:09:30AM +0100, 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. 30 seconds. After that, key frames will come every second. This
>> will result in segments that are first 10 seconds (as expected), then
>> 1 second for some time (not as expected) and later 2 seconds (as
>> expected).
>> 
>> How to reproduce:
>> ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 250 part1.mp4
>> ffmpeg -t 30 -f lavfi -i testsrc2 -codec:v libx264 -g 25 part2.mp4
>> echo "file part1.mp4\nfile part2.mp4" > list.txt
>> ffmpeg -f concat -i list.txt -codec copy \
>>    -f hls -hls_time 2 -hls_list_size 0 parts.m3u8
>> cat parts.m3u8
>> 
>> Signed-off-by: Ingo Oppermann <ingo@datarhei.com>
>> ---
>> libavformat/hlsenc.c | 12 +++---------
>> 1 file changed, 3 insertions(+), 9 deletions(-)
> 
> this breaks / needs to update
> fate-hls-init-time
> 
> --- ./tests/ref/fate/hls-init-time 2025-01-28 13:58:16.733614814 +0100
> +++ tests/data/fate/hls-init-time 2025-01-28 15:09:03.869138579 +0100
> @@ -3,310 +3,308 @@
> #codec_id 0: pcm_s16le
> #sample_rate 0: 44100
> #channel_layout_name 0: mono
> -0,          0,          0,     1152,     2304, 0x28123557
> -0,       1152,       1152,     1152,     2304, 0x838c7e81
> -0,       2304,       2304,     1152,     2304, 0x4fb8704c
> -0,       3456,       3456,     1152,     2304, 0x5f787f9e
> ...
> 

As suggested by Gyan, I'll rework the patch in order to not change the default behaviour. Currently it overrules hls_init_time as well.

> [...]
> 
> -- 
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> 
> The misfortune of the wise is better than the prosperity of the fool.
> -- Epicurus
> _______________________________________________
> 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".


_______________________________________________
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".

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-01-28 14:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-27  9:09 [FFmpeg-devel] [PATCH v2] avformat/hlsenc: fix hls_time not respected Ingo Oppermann
2025-01-28 14:10 ` Michael Niedermayer
2025-01-28 14:37   ` Ingo Oppermann

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git