This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new e7696357de avformat/dashdec: export LCEVC Stream Groups when the
manifest reports the relevant dependency
e7696357de is described below
commit e7696357de6402ad097f031abb72bd68d5deea49
Author: James Almer <[email protected]>
AuthorDate: Mon Mar 23 14:07:42 2026 -0300
Commit: James Almer <[email protected]>
CommitDate: Tue Apr 7 10:04:55 2026 -0300
avformat/dashdec: export LCEVC Stream Groups when the manifest reports the
relevant dependency
Signed-off-by: James Almer <[email protected]>
---
libavformat/dashdec.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++-
libavformat/version.h | 2 +-
2 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 9a2ea78149..9902f68d0e 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -87,6 +87,8 @@ struct representation {
char *id;
char *lang;
int bandwidth;
+ char *dependencyid;
+ char *codecs;
AVRational framerate;
AVStream *assoc_stream; /* demuxer stream associated with this
representation */
@@ -365,6 +367,8 @@ static void free_representation(struct representation *pls)
av_freep(&pls->url_template);
av_freep(&pls->lang);
+ av_freep(&pls->dependencyid);
+ av_freep(&pls->codecs);
av_freep(&pls->id);
av_freep(&pls);
}
@@ -908,6 +912,8 @@ static int parse_manifest_representation(AVFormatContext
*s, const char *url,
xmlNodePtr baseurl_nodes[4];
xmlNodePtr representation_node = node;
char *rep_bandwidth_val;
+ char *rep_codecs_val;
+ char *rep_dependencyid_val;
enum AVMediaType type = AVMEDIA_TYPE_UNKNOWN;
// try get information from representation
@@ -942,6 +948,10 @@ static int parse_manifest_representation(AVFormatContext
*s, const char *url,
representation_baseurl_node = find_child_node_by_name(representation_node,
"BaseURL");
representation_segmentlist_node =
find_child_node_by_name(representation_node, "SegmentList");
rep_bandwidth_val = xmlGetProp(representation_node, "bandwidth");
+ rep_dependencyid_val = xmlGetProp(representation_node, "dependencyId");
+ rep_codecs_val = xmlGetProp(representation_node, "codecs");
+ if (!rep_codecs_val)
+ rep_codecs_val = xmlGetProp(adaptionset_node, "codecs");
val = xmlGetProp(representation_node, "id");
if (val) {
rep->id = av_strdup(val);
@@ -1094,6 +1104,20 @@ static int parse_manifest_representation(AVFormatContext
*s, const char *url,
if (rep->fragment_duration > 0 && !rep->fragment_timescale)
rep->fragment_timescale = 1;
rep->bandwidth = rep_bandwidth_val ? atoi(rep_bandwidth_val) : 0;
+ if (rep_dependencyid_val) {
+ rep->dependencyid = av_strdup(rep_dependencyid_val);
+ if (!rep->dependencyid) {
+ xmlFree(rep_dependencyid_val);
+ goto enomem;
+ }
+ }
+ if (rep_codecs_val) {
+ rep->codecs = av_strdup(rep_codecs_val);
+ if (!rep->codecs) {
+ xmlFree(rep_codecs_val);
+ goto enomem;
+ }
+ }
rep->framerate = av_make_q(0, 0);
if (type == AVMEDIA_TYPE_VIDEO) {
char *rep_framerate_val = xmlGetProp(representation_node, "frameRate");
@@ -1122,6 +1146,10 @@ static int parse_manifest_representation(AVFormatContext
*s, const char *url,
end:
if (rep_bandwidth_val)
xmlFree(rep_bandwidth_val);
+ if (rep_dependencyid_val)
+ xmlFree(rep_dependencyid_val);
+ if (rep_codecs_val)
+ xmlFree(rep_codecs_val);
return ret;
enomem:
@@ -2051,7 +2079,7 @@ static int dash_read_header(AVFormatContext *s)
AVProgram *program;
int ret = 0;
int stream_index = 0;
- int i;
+ int i, j;
c->interrupt_callback = &s->interrupt_callback;
@@ -2157,6 +2185,38 @@ static int dash_read_header(AVFormatContext *s)
move_metadata(rep->assoc_stream, "language", &rep->lang);
}
+ /* Create stream groups if needed */
+ for (i = 0; i < c->n_videos; i++) {
+ struct representation *ref;
+ rep = c->videos[i];
+ if (!rep->dependencyid)
+ continue;
+ for (j = 0; j < c->n_videos; j++) {
+ if (j == i)
+ continue;
+ ref = c->videos[j];
+ const AVDictionaryEntry *id =
av_dict_get(ref->assoc_stream->metadata, "id", NULL, AV_DICT_MATCH_CASE);
+ if (!strcmp(rep->dependencyid, id->value))
+ break;
+ }
+ if (j >= c->n_videos || !av_strstart(rep->codecs, "lvc1", NULL) ||
+ rep->assoc_stream->codecpar->codec_id != AV_CODEC_ID_LCEVC)
+ continue;
+ AVStreamGroup *stg = avformat_stream_group_create(s,
AV_STREAM_GROUP_PARAMS_LCEVC, NULL);
+ if (!stg)
+ return AVERROR(ENOMEM);
+ stg->params.lcevc->width = rep->assoc_stream->codecpar->width;
+ stg->params.lcevc->height = rep->assoc_stream->codecpar->height;
+ ret = avformat_stream_group_add_stream(stg, ref->assoc_stream);
+ if (ret < 0)
+ return ret;
+ ret = avformat_stream_group_add_stream(stg, rep->assoc_stream);
+ if (ret < 0)
+ return ret;
+ stg->id = stg->index;
+ stg->params.lcevc->lcevc_index = stg->nb_streams - 1;
+ }
+
return 0;
}
diff --git a/libavformat/version.h b/libavformat/version.h
index cd62aaf1ca..ff831498b3 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
#include "version_major.h"
#define LIBAVFORMAT_VERSION_MINOR 13
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MICRO 102
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]