PR #25070 opened by Kacper Michajłow (kasper93)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25070
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25070.patch

This is mostly for fuzzed inputs, I'm not aware of playlists that has 1000 
variants for example...


From 985a3fe08e27a5aad3ca549d346a5edf57b0683b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Wed, 14 Oct 2026 10:16:49 +0200
Subject: [PATCH 1/5] avformat: skip the program lookup in av_new_program() for
 monotonic ids
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Track whether the program ids are strictly increasing, like
avpriv_new_chapter() does, and skip the scan of the existing programs
when the new id is above the last one.

Fixes: Timeout (7s -> 240ms)
Fixes: clusterfuzz-testcase-ffmpeg_dem_HLS_fuzzer-5202060644253696
Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavformat/avformat.c | 13 ++++++++++---
 libavformat/internal.h |  5 +++++
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/libavformat/avformat.c b/libavformat/avformat.c
index 17c0534de2..e8ebb89097 100644
--- a/libavformat/avformat.c
+++ b/libavformat/avformat.c
@@ -296,14 +296,21 @@ const char *avformat_stream_group_name(enum 
AVStreamGroupParamsType type)
 
 AVProgram *av_new_program(AVFormatContext *ac, int id)
 {
+    FFFormatContext *const si = ffformatcontext(ac);
     AVProgram *program = NULL;
     int ret;
 
     av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
 
-    for (unsigned i = 0; i < ac->nb_programs; i++)
-        if (ac->programs[i]->id == id)
-            program = ac->programs[i];
+    if (!ac->nb_programs) {
+        si->program_ids_monotonic = 1;
+    } else if (!si->program_ids_monotonic || ac->programs[ac->nb_programs - 
1]->id >= id) {
+        for (unsigned i = 0; i < ac->nb_programs; i++)
+            if (ac->programs[i]->id == id)
+                program = ac->programs[i];
+        if (!program)
+            si->program_ids_monotonic = 0;
+    }
 
     if (!program) {
         program = av_mallocz(sizeof(*program));
diff --git a/libavformat/internal.h b/libavformat/internal.h
index b77292a532..53dc7b939b 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -119,6 +119,11 @@ typedef struct FFFormatContext {
 
     int missing_streams;
 
+    /**
+     * Set if program ids are strictly monotonic.
+     */
+    int program_ids_monotonic;
+
     /**
      * Shared libcurl event loop, created on demand on the first use. Freed on
      * context free. This allows to share libcurl state across URLContexts,
-- 
2.52.0


From 954458938fc23d6b09e5082539281ed5262383e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Wed, 14 Oct 2026 10:16:49 +0200
Subject: [PATCH 2/5] avformat/hls: look playlists up by URL in a tree
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Keep the playlists in an AVTree keyed by URL, so new_playlist() finds a
playlist shared by several variants or renditions in logarithmic time
instead of comparing the URL with every known playlist.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavformat/hls.c | 48 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index 506c8c0f49..4e98a0fcb1 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -39,6 +39,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/dict.h"
 #include "libavutil/time.h"
+#include "libavutil/tree.h"
 #include "avformat.h"
 #include "demux.h"
 #include "internal.h"
@@ -225,6 +226,7 @@ typedef struct HLSContext {
     struct variant **variants;
     int n_playlists;
     struct playlist **playlists;
+    struct AVTreeNode *playlists_by_url;
     int n_renditions;
     struct rendition **renditions;
 
@@ -309,6 +311,8 @@ static void free_playlist_list(HLSContext *c)
     }
     av_freep(&c->playlists);
     c->n_playlists = 0;
+    av_tree_destroy(c->playlists_by_url);
+    c->playlists_by_url = NULL;
 }
 
 static void free_variant_list(HLSContext *c)
@@ -332,29 +336,43 @@ static void free_rendition_list(HLSContext *c)
     c->n_renditions = 0;
 }
 
+static int cmp_url_playlist(const void *key, const void *b)
+{
+    const struct playlist *pls = b;
+    return strcmp(key, pls->url);
+}
+
+static int cmp_playlist_url(const void *a, const void *b)
+{
+    const struct playlist *pa = a, *pb = b;
+    return strcmp(pa->url, pb->url);
+}
+
 static struct playlist *new_playlist(HLSContext *c, const char *url,
                                      const char *base)
 {
     struct playlist *pls;
+    struct AVTreeNode *node;
     char abs_url[MAX_URL_SIZE];
 
     ff_make_absolute_url(abs_url, sizeof(abs_url), base, url);
     if (!abs_url[0])
         return NULL;
 
-    for (int i = 0; i < c->n_playlists; i++) {
-        if (!strcmp(c->playlists[i]->url, abs_url))
-            return c->playlists[i];
-    }
+    /* the same URL in several variants or renditions shares one playlist */
+    pls = av_tree_find(c->playlists_by_url, abs_url, cmp_url_playlist, NULL);
+    if (pls)
+        return pls;
+
+    pls  = av_mallocz(sizeof(struct playlist));
+    node = av_tree_node_alloc();
+    if (!pls || !node)
+        goto fail;
 
-    pls = av_mallocz(sizeof(struct playlist));
-    if (!pls)
-        return NULL;
     pls->pkt = av_packet_alloc();
-    if (!pls->pkt) {
-        av_free(pls);
-        return NULL;
-    }
+    if (!pls->pkt)
+        goto fail;
+
     av_strlcpy(pls->url, abs_url, sizeof(pls->url));
     pls->ts_offset = AV_NOPTS_VALUE;
     pls->seek_timestamp = AV_NOPTS_VALUE;
@@ -364,8 +382,16 @@ static struct playlist *new_playlist(HLSContext *c, const 
char *url,
     pls->id3_mpegts_timestamp = AV_NOPTS_VALUE;
     pls->timed_id3_stream_index = -1;
 
+    av_tree_insert(&c->playlists_by_url, pls, cmp_playlist_url, &node);
     dynarray_add(&c->playlists, &c->n_playlists, pls);
     return pls;
+
+fail:
+    if (pls)
+        av_packet_free(&pls->pkt);
+    av_free(pls);
+    av_free(node);
+    return NULL;
 }
 
 struct variant_info {
-- 
2.52.0


From 659160fbebdcb0382b411b0ef978367201add395 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Wed, 14 Oct 2026 10:31:54 +0200
Subject: [PATCH 3/5] avformat/hls: associate renditions with variants through
 rendition groups
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Keep the renditions of each TYPE and GROUP-ID in a rendition group found
through an AVTree, so a variant adds the playlists of its groups without
scanning all renditions, and the in-stream renditions of a group are
added to a main Media Playlist once rather than once per variant that
shares it.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavformat/hls.c | 145 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 129 insertions(+), 16 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index 4e98a0fcb1..d6731a3e6c 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -90,6 +90,8 @@ struct segment {
 };
 
 struct rendition;
+struct rendition_group;
+struct variant;
 
 enum PlaylistType {
     PLS_TYPE_UNSPECIFIED,
@@ -177,6 +179,11 @@ struct playlist {
     int n_renditions;
     struct rendition **renditions;
 
+    /* The last variant this playlist was added to and the last rendition
+     * group whose renditions were added to it. */
+    struct variant *last_variant;
+    struct rendition_group *last_group;
+
     /* Media Initialization Sections (EXT-X-MAP) associated with this
      * playlist, if any. */
     int n_init_sections;
@@ -201,7 +208,6 @@ struct playlist {
 struct rendition {
     enum AVMediaType type;
     struct playlist *playlist;
-    char group_id[MAX_FIELD_LEN];
     char language[MAX_FIELD_LEN];
     char name[MAX_FIELD_LEN];
     int disposition;
@@ -219,6 +225,27 @@ struct variant {
     char subtitles_group[MAX_FIELD_LEN];
 };
 
+/*
+ * The renditions with the same TYPE and GROUP-ID, which variants reference
+ * by the group id.
+ */
+struct rendition_group {
+    enum AVMediaType type;
+    char id[MAX_FIELD_LEN];
+
+    /* playlists of the external renditions */
+    int n_playlists;
+    struct playlist **playlists;
+
+    /* renditions that are part of the variant main Media Playlists */
+    int n_renditions;
+    struct rendition **renditions;
+
+    /* variants that reference the group */
+    int n_variants;
+    struct variant **variants;
+};
+
 typedef struct HLSContext {
     AVClass *class;
     AVFormatContext *ctx;
@@ -229,6 +256,9 @@ typedef struct HLSContext {
     struct AVTreeNode *playlists_by_url;
     int n_renditions;
     struct rendition **renditions;
+    int n_rendition_groups;
+    struct rendition_group **rendition_groups;
+    struct AVTreeNode *rendition_groups_by_id;
 
     int64_t cur_seq_no;
     int m3u8_hold_counters;
@@ -334,6 +364,16 @@ static void free_rendition_list(HLSContext *c)
         av_freep(&c->renditions[i]);
     av_freep(&c->renditions);
     c->n_renditions = 0;
+    for (i = 0; i < c->n_rendition_groups; i++) {
+        av_freep(&c->rendition_groups[i]->playlists);
+        av_freep(&c->rendition_groups[i]->renditions);
+        av_freep(&c->rendition_groups[i]->variants);
+        av_freep(&c->rendition_groups[i]);
+    }
+    av_freep(&c->rendition_groups);
+    c->n_rendition_groups = 0;
+    av_tree_destroy(c->rendition_groups_by_id);
+    c->rendition_groups_by_id = NULL;
 }
 
 static int cmp_url_playlist(const void *key, const void *b)
@@ -548,9 +588,53 @@ struct rendition_info {
     char characteristics[MAX_CHARACTERISTICS_LEN];
 };
 
+static int cmp_rendition_group(const void *a, const void *b)
+{
+    const struct rendition_group *ga = a, *gb = b;
+
+    if (ga->type != gb->type)
+        return FFDIFFSIGN(ga->type, gb->type);
+    return strcmp(ga->id, gb->id);
+}
+
+static struct rendition_group *find_rendition_group(HLSContext *c,
+                                                    enum AVMediaType type,
+                                                    const char *id)
+{
+    struct rendition_group key = { .type = type };
+
+    av_strlcpy(key.id, id, sizeof(key.id));
+    return av_tree_find(c->rendition_groups_by_id, &key, cmp_rendition_group, 
NULL);
+}
+
+static struct rendition_group *new_rendition_group(HLSContext *c,
+                                                   enum AVMediaType type,
+                                                   const char *id)
+{
+    struct rendition_group *group = find_rendition_group(c, type, id);
+    struct AVTreeNode *node;
+
+    if (group)
+        return group;
+
+    group = av_mallocz(sizeof(*group));
+    node  = av_tree_node_alloc();
+    if (!group || !node) {
+        av_free(group);
+        av_free(node);
+        return NULL;
+    }
+    group->type = type;
+    av_strlcpy(group->id, id, sizeof(group->id));
+    av_tree_insert(&c->rendition_groups_by_id, group, cmp_rendition_group, 
&node);
+    dynarray_add(&c->rendition_groups, &c->n_rendition_groups, group);
+    return group;
+}
+
 static struct rendition *new_rendition(HLSContext *c, struct rendition_info 
*info,
                                       const char *url_base)
 {
+    struct rendition_group *group;
     struct rendition *rend;
     enum AVMediaType type = AVMEDIA_TYPE_UNKNOWN;
     char *characteristic;
@@ -579,6 +663,10 @@ static struct rendition *new_rendition(HLSContext *c, 
struct rendition_info *inf
         return NULL;
     }
 
+    group = new_rendition_group(c, type, info->group_id);
+    if (!group)
+        return NULL;
+
     rend = av_mallocz(sizeof(struct rendition));
     if (!rend)
         return NULL;
@@ -586,7 +674,6 @@ static struct rendition *new_rendition(HLSContext *c, 
struct rendition_info *inf
     dynarray_add(&c->renditions, &c->n_renditions, rend);
 
     rend->type = type;
-    strcpy(rend->group_id, info->group_id);
     strcpy(rend->language, info->language);
     strcpy(rend->name, info->name);
 
@@ -602,6 +689,10 @@ static struct rendition *new_rendition(HLSContext *c, 
struct rendition_info *inf
                          &rend->playlist->n_renditions, rend);
         }
     }
+    if (rend->playlist)
+        dynarray_add(&group->playlists, &group->n_playlists, rend->playlist);
+    else
+        dynarray_add(&group->renditions, &group->n_renditions, rend);
 
     if (info->assoc_language[0]) {
         size_t langlen = strlen(rend->language);
@@ -2019,23 +2110,43 @@ restart:
 static void add_renditions_to_variant(HLSContext *c, struct variant *var,
                                       enum AVMediaType type, const char 
*group_id)
 {
-    int i;
+    struct rendition_group *group = find_rendition_group(c, type, group_id);
 
-    for (i = 0; i < c->n_renditions; i++) {
-        struct rendition *rend = c->renditions[i];
+    if (!group)
+        return;
 
-        if (rend->type == type && !strcmp(rend->group_id, group_id)) {
+    dynarray_add(&group->variants, &group->n_variants, var);
 
-            if (rend->playlist)
-                /* rendition is an external playlist
-                 * => add the playlist to the variant */
-                dynarray_add(&var->playlists, &var->n_playlists, 
rend->playlist);
-            else
-                /* rendition is part of the variant main Media Playlist
-                 * => add the rendition to the main Media Playlist */
-                dynarray_add(&var->playlists[0]->renditions,
-                             &var->playlists[0]->n_renditions,
-                             rend);
+    /* add the playlists of the external renditions to the variant */
+    for (int i = 0; i < group->n_playlists; i++) {
+        struct playlist *pls = group->playlists[i];
+
+        if (pls->last_variant != var) {
+            pls->last_variant = var;
+            dynarray_add(&var->playlists, &var->n_playlists, pls);
+        }
+    }
+}
+
+/* The renditions without a playlist are part of the main Media Playlist of
+ * every variant that references their group. */
+static void add_renditions_to_playlists(HLSContext *c, enum AVMediaType type)
+{
+    for (int i = 0; i < c->n_rendition_groups; i++) {
+        struct rendition_group *group = c->rendition_groups[i];
+
+        if (group->type != type)
+            continue;
+
+        for (int j = 0; j < group->n_variants; j++) {
+            struct playlist *pls = group->variants[j]->playlists[0];
+
+            if (pls->last_group == group)
+                continue;
+            pls->last_group = group;
+
+            for (int k = 0; k < group->n_renditions; k++)
+                dynarray_add(&pls->renditions, &pls->n_renditions, 
group->renditions[k]);
         }
     }
 }
@@ -2405,6 +2516,8 @@ static int hls_read_header(AVFormatContext *s)
         if (var->subtitles_group[0])
             add_renditions_to_variant(c, var, AVMEDIA_TYPE_SUBTITLE, 
var->subtitles_group);
     }
+    add_renditions_to_playlists(c, AVMEDIA_TYPE_AUDIO);
+    add_renditions_to_playlists(c, AVMEDIA_TYPE_VIDEO);
 
     /* Create a program for each variant */
     for (i = 0; i < c->n_variants; i++) {
-- 
2.52.0


From 2312f59c8073eeea1bdf52ce042f301cef580c6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Wed, 14 Oct 2026 10:39:20 +0200
Subject: [PATCH 4/5] avformat/hls: keep the rendition dispositions when a
 stream is updated
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add the dispositions of the subdemuxer stream to the ones set from the
EXT-X-MEDIA attributes instead of replacing them.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavformat/hls.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index d6731a3e6c..0fa8b5d6c7 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -2336,8 +2336,8 @@ static int set_stream_info_from_input_stream(AVStream 
*st, struct playlist *pls,
     else
         avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, 
ist->time_base.den);
 
-    // copy disposition
-    st->disposition = ist->disposition;
+    // add the dispositions of the subdemuxer stream to the rendition ones
+    st->disposition |= ist->disposition;
 
     av_dict_copy(&st->metadata, ist->metadata, 0);
 
-- 
2.52.0


From ca0d83681425b4e3b2864dfa9448c4dfab09dcfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]>
Date: Wed, 14 Oct 2026 10:53:50 +0200
Subject: [PATCH 5/5] tests/fate/demux: add an HLS test with a shared Media
 Playlist and renditions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Two variants share one Media Playlist, an in-stream audio rendition group
and a WebVTT subtitle rendition, so the streams are created once, each
program lists both streams and the rendition attributes end up on the
streams.

Signed-off-by: Kacper Michajłow <[email protected]>
---
 tests/fate/demux.mak                       | 17 ++++++++++
 tests/ref/fate/hls-shared-renditions-demux | 37 ++++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 tests/ref/fate/hls-shared-renditions-demux

diff --git a/tests/fate/demux.mak b/tests/fate/demux.mak
index 1b6da35cdb..1e81ff32e0 100644
--- a/tests/fate/demux.mak
+++ b/tests/fate/demux.mak
@@ -213,6 +213,23 @@ fate-hls-self-variant-demux: 
tests/data/hls-self-variant.m3u8
 fate-hls-self-variant-demux: CLEANFILES = tests/data/hls-self-variant.m3u8
 fate-hls-self-variant-demux: CMD = ffprobe_demux 
$(TARGET_PATH)/tests/data/hls-self-variant.m3u8
 
+tests/data/hls-shared-renditions.m3u8: TAG = GEN
+tests/data/hls-shared-renditions.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+       $(M)$(TARGET_EXEC) $(TARGET_PATH)/$< -nostdin \
+        -f lavfi -i "aevalsrc=0:s=16000:d=2" -c:a mp2fixed -flags +bitexact 
-muxdelay 0 -muxpreload 0 \
+        -f hls -hls_time 2 -hls_list_size 0 \
+        -hls_segment_filename 
$(TARGET_PATH)/tests/data/hls-shared-renditions-a%d.ts \
+        $(TARGET_PATH)/tests/data/hls-shared-renditions-a.m3u8 2>/dev/null
+       $(Q)printf 
'#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2,\nhls-shared-renditions-s0.vtt\n#EXT-X-ENDLIST\n'
 > tests/data/hls-shared-renditions-s.m3u8
+       $(Q)printf 'WEBVTT\n\n00:00.500 --> 00:01.500\nfirst\n' > 
tests/data/hls-shared-renditions-s0.vtt
+       $(Q)printf 
'#EXTM3U\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="g",NAME="German",LANGUAGE="de",URI="hls-shared-renditions-s.m3u8"\n#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="g",NAME="English",LANGUAGE="en",DEFAULT=YES\n#EXT-X-STREAM-INF:BANDWIDTH=64000,AUDIO="g",SUBTITLES="g"\nhls-shared-renditions-a.m3u8\n#EXT-X-STREAM-INF:BANDWIDTH=128000,AUDIO="g",SUBTITLES="g"\nhls-shared-renditions-a.m3u8\n'
 > $@
+
+FATE_HLS_SHARED_RENDITIONS-$(call FILTERDEMDECENCMUX, AEVALSRC ARESAMPLE, HLS 
MPEGTS WEBVTT, MP3FLOAT PCM_F64LE, MP2FIXED, HLS MPEGTS, LAVFI_INDEV 
MPEGAUDIO_PARSER) += fate-hls-shared-renditions-demux
+FATE_FFMPEG_FFPROBE += $(FATE_HLS_SHARED_RENDITIONS-yes)
+fate-hls-shared-renditions-demux: tests/data/hls-shared-renditions.m3u8
+fate-hls-shared-renditions-demux: CLEANFILES = 
tests/data/hls-shared-renditions*.m3u8 tests/data/hls-shared-renditions-*.ts 
tests/data/hls-shared-renditions-*.vtt
+fate-hls-shared-renditions-demux: CMD = ffprobe_demux 
$(TARGET_PATH)/tests/data/hls-shared-renditions.m3u8 -show_programs
+
 FATE_SAMPLES_DEMUX-$(call PARSERDEM, JPEGXS, IMAGE_JPEGXS_PIPE, 
CONCAT_PROTOCOL) += fate-jxs-concat-demux
 fate-jxs-concat-demux: CMD = framecrc "-i 
concat:$(TARGET_SAMPLES)/jxs/lena.jxs|$(TARGET_SAMPLES)/jxs/lena.jxs -c:v copy"
 
diff --git a/tests/ref/fate/hls-shared-renditions-demux 
b/tests/ref/fate/hls-shared-renditions-demux
new file mode 100644
index 0000000000..0a128bb79a
--- /dev/null
+++ b/tests/ref/fate/hls-shared-renditions-demux
@@ -0,0 +1,37 @@
+packet|codec_type=audio|stream_index=1|pts=0|pts_time=0.000000|dts=0|dts_time=0.000000|duration=3240|duration_time=0.036000|size=1440|pos=564|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=6480|pts_time=0.072000|dts=6480|dts_time=0.072000|duration=6480|duration_time=0.072000|size=1440|pos=2068|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=12960|pts_time=0.144000|dts=12960|dts_time=0.144000|duration=6480|duration_time=0.072000|size=1440|pos=3572|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=19440|pts_time=0.216000|dts=19440|dts_time=0.216000|duration=6480|duration_time=0.072000|size=1440|pos=5076|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=25920|pts_time=0.288000|dts=25920|dts_time=0.288000|duration=6480|duration_time=0.072000|size=1440|pos=6580|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=32400|pts_time=0.360000|dts=32400|dts_time=0.360000|duration=6480|duration_time=0.072000|size=1440|pos=8084|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=38880|pts_time=0.432000|dts=38880|dts_time=0.432000|duration=6480|duration_time=0.072000|size=1440|pos=9588|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=45360|pts_time=0.504000|dts=45360|dts_time=0.504000|duration=6480|duration_time=0.072000|size=1440|pos=11092|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=51840|pts_time=0.576000|dts=51840|dts_time=0.576000|duration=6480|duration_time=0.072000|size=1440|pos=12596|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=58320|pts_time=0.648000|dts=58320|dts_time=0.648000|duration=6480|duration_time=0.072000|size=1440|pos=14100|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=64800|pts_time=0.720000|dts=64800|dts_time=0.720000|duration=6480|duration_time=0.072000|size=1440|pos=15604|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=71280|pts_time=0.792000|dts=71280|dts_time=0.792000|duration=6480|duration_time=0.072000|size=1440|pos=17108|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=77760|pts_time=0.864000|dts=77760|dts_time=0.864000|duration=6480|duration_time=0.072000|size=1440|pos=18612|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=84240|pts_time=0.936000|dts=84240|dts_time=0.936000|duration=6480|duration_time=0.072000|size=1440|pos=20116|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=90720|pts_time=1.008000|dts=90720|dts_time=1.008000|duration=6480|duration_time=0.072000|size=1440|pos=21620|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=97200|pts_time=1.080000|dts=97200|dts_time=1.080000|duration=6480|duration_time=0.072000|size=1440|pos=23124|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=103680|pts_time=1.152000|dts=103680|dts_time=1.152000|duration=6480|duration_time=0.072000|size=1440|pos=24628|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=110160|pts_time=1.224000|dts=110160|dts_time=1.224000|duration=6480|duration_time=0.072000|size=1440|pos=26132|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=116640|pts_time=1.296000|dts=116640|dts_time=1.296000|duration=6480|duration_time=0.072000|size=1440|pos=27636|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=123120|pts_time=1.368000|dts=123120|dts_time=1.368000|duration=6480|duration_time=0.072000|size=1440|pos=29140|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=129600|pts_time=1.440000|dts=129600|dts_time=1.440000|duration=6480|duration_time=0.072000|size=1440|pos=30644|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=136080|pts_time=1.512000|dts=136080|dts_time=1.512000|duration=6480|duration_time=0.072000|size=1440|pos=32148|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=142560|pts_time=1.584000|dts=142560|dts_time=1.584000|duration=6480|duration_time=0.072000|size=1440|pos=33652|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=149040|pts_time=1.656000|dts=149040|dts_time=1.656000|duration=6480|duration_time=0.072000|size=1440|pos=35156|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=155520|pts_time=1.728000|dts=155520|dts_time=1.728000|duration=6480|duration_time=0.072000|size=1440|pos=36660|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=162000|pts_time=1.800000|dts=162000|dts_time=1.800000|duration=6480|duration_time=0.072000|size=1440|pos=38164|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=168480|pts_time=1.872000|dts=168480|dts_time=1.872000|duration=6480|duration_time=0.072000|size=1440|pos=39668|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+packet|codec_type=audio|stream_index=1|pts=174960|pts_time=1.944000|dts=174960|dts_time=1.944000|duration=6480|duration_time=0.072000|size=1440|pos=41172|flags=K__|data_hash=CRC32:cb00dd5b|side_datum/mpegts_stream_id:side_data_type=MPEGTS
 Stream ID|side_datum/mpegts_stream_id:id=192
+program|program_id=0|program_num=0|nb_streams=2|pmt_pid=0|pcr_pid=0|tag:variant_bitrate=64000
+stream|index=0|codec_name=webvtt|profile=unknown|level=-99|codec_type=subtitle|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=N/A|height=N/A|id=0x0|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=N/A|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=de|tag:comment=German
+stream|index=1|codec_name=mp2|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|mime_codec_string=mp4a.40.33|sample_fmt=fltp|sample_rate=16000|channels=1|channel_layout=mono|bits_per_sample=0|initial_padding=0|id=0x1|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=160000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=28|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=en|tag:comment=English
+program|program_id=1|program_num=0|nb_streams=2|pmt_pid=0|pcr_pid=0|tag:variant_bitrate=128000
+stream|index=0|codec_name=webvtt|profile=unknown|level=-99|codec_type=subtitle|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=N/A|height=N/A|id=0x0|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=N/A|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=de|tag:comment=German
+stream|index=1|codec_name=mp2|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|mime_codec_string=mp4a.40.33|sample_fmt=fltp|sample_rate=16000|channels=1|channel_layout=mono|bits_per_sample=0|initial_padding=0|id=0x1|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=160000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=28|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=en|tag:comment=English
+stream|index=0|codec_name=webvtt|profile=unknown|level=-99|codec_type=subtitle|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=N/A|height=N/A|id=0x0|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=N/A|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=de|tag:comment=German
+stream|index=1|codec_name=mp2|profile=unknown|level=-99|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|mime_codec_string=mp4a.40.33|sample_fmt=fltp|sample_rate=16000|channels=1|channel_layout=mono|bits_per_sample=0|initial_padding=0|id=0x1|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=160000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=28|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=en|tag:comment=English
+format|filename=hls-shared-renditions.m3u8|nb_streams=2|nb_programs=2|nb_stream_groups=0|format_name=hls|start_time=0.000000|duration=2.016000|size=365|bit_rate=1448|probe_score=100
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to