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]
