summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorLeo Zhang <leozhang@qiyi.com>2019-07-19 15:43:46 +0800
committerKarthick J <kjeyapal@akamai.com>2019-07-22 07:57:39 +0530
commit116303cd245138370ac684d28e086f30e12e9f6d (patch)
tree0338e58ddb66eb3586994af442f0d1275d0d4089 /libavformat
parent18928e2bb4568cbe5e9061c3e6b63559392af3d2 (diff)
avformat/dashenc: add descriptor which is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015.
Signed-off-by: leozhang <leozhang@qiyi.com>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/dashenc.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index b25afb40aa..ab16750fae 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -68,6 +68,7 @@ typedef struct Segment {
typedef struct AdaptationSet {
char id[10];
+ char *descriptor;
enum AVMediaType media_type;
AVDictionary *metadata;
AVRational min_frame_rate, max_frame_rate;
@@ -552,8 +553,10 @@ static void dash_free(AVFormatContext *s)
int i, j;
if (c->as) {
- for (i = 0; i < c->nb_as; i++)
+ for (i = 0; i < c->nb_as; i++) {
av_dict_free(&c->as[i].metadata);
+ av_freep(&c->as[i].descriptor);
+ }
av_freep(&c->as);
c->nb_as = 0;
}
@@ -748,7 +751,8 @@ static int write_adaptation_set(AVFormatContext *s, AVIOContext *out, int as_ind
role = av_dict_get(as->metadata, "role", NULL, 0);
if (role)
avio_printf(out, "\t\t\t<Role schemeIdUri=\"urn:mpeg:dash:role:2011\" value=\"%s\"/>\n", role->value);
-
+ if (as->descriptor)
+ avio_printf(out, "\t\t\t%s\n", as->descriptor);
for (i = 0; i < s->nb_streams; i++) {
OutputStream *os = &c->streams[i];
char bandwidth_str[64] = {'\0'};
@@ -820,7 +824,7 @@ static int parse_adaptation_sets(AVFormatContext *s)
{
DASHContext *c = s->priv_data;
const char *p = c->adaptation_sets;
- enum { new_set, parse_id, parsing_streams } state;
+ enum { new_set, parse_id, parsing_streams, parse_descriptor } state;
AdaptationSet *as;
int i, n, ret;
@@ -837,6 +841,9 @@ static int parse_adaptation_sets(AVFormatContext *s)
}
// syntax id=0,streams=0,1,2 id=1,streams=3,4 and so on
+ // option id=0,descriptor=descriptor_str,streams=0,1,2 and so on
+ // descriptor is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015
+ // descriptor_str should be a self-closing xml tag.
state = new_set;
while (*p) {
if (*p == ' ') {
@@ -854,7 +861,19 @@ static int parse_adaptation_sets(AVFormatContext *s)
if (*p)
p++;
state = parse_id;
- } else if (state == parse_id && av_strstart(p, "streams=", &p)) {
+ } else if (state == parse_id && av_strstart(p, "descriptor=", &p)) {
+ n = strcspn(p, ">") + 1; //followed by one comma, so plus 1
+ if (n < strlen(p)) {
+ as->descriptor = av_strndup(p, n);
+ } else {
+ av_log(s, AV_LOG_ERROR, "Parse error, descriptor string should be a self-closing xml tag\n");
+ return AVERROR(EINVAL);
+ }
+ p += n;
+ if (*p)
+ p++;
+ state = parse_descriptor;
+ } else if ((state == parse_id || state == parse_descriptor) && av_strstart(p, "streams=", &p)) { //descriptor is optional
state = parsing_streams;
} else if (state == parsing_streams) {
AdaptationSet *as = &c->as[c->nb_as - 1];