[FFmpeg-devel] dash: add descriptor which is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015.

Jeyapal, Karthick kjeyapal at akamai.com
Wed Jul 17 05:46:31 EEST 2019


On 7/15/19 8:41 AM, leozhang wrote:
> change history:
> 1. remove unnecessary cast.
> 2. add some braces.
>
> Please comment, Thanks
Thanks for sending the patch. Please find some of my comments inlined below.
>
> Signed-off-by: leozhang <leozhang at qiyi.com>
> ---
>  doc/muxers.texi       |  3 +++
>  libavformat/dashenc.c | 35 ++++++++++++++++++++++++++++++++---
>  2 files changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/doc/muxers.texi b/doc/muxers.texi
> index b109297..ac06ad2 100644
> --- a/doc/muxers.texi
> +++ b/doc/muxers.texi
> @@ -275,6 +275,9 @@ of the adaptation sets and a,b,c,d and e are the indices of the mapped streams.
>  To map all video (or audio) streams to an AdaptationSet, "v" (or "a") can be used as stream identifier instead of IDs.
>  
>  When no assignment is defined, this defaults to an AdaptationSet for each stream.
> +
> +Optional syntax is "id=x,descriptor=descriptor_str,streams=a,b,c id=y,streams=d,e" and so on, descriptor is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015.
> +And descriptor_str must be a properly formatted XML element, which is encoded by base64.
Two comments:
1. Please provide an example here. So that it is easier for people to understand
2. Why do we need this to be base64 encoded? What is the use-case where a normal string doesn't work?
>  @item timeout @var{timeout}
>  Set timeout for socket I/O operations. Applicable only for HTTP output.
>  @item index_correction @var{index_correction}
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index b25afb4..a48031c 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -34,6 +34,7 @@
>  #include "libavutil/rational.h"
>  #include "libavutil/time.h"
>  #include "libavutil/time_internal.h"
> +#include "libavutil/base64.h"
>  
>  #include "avc.h"
>  #include "avformat.h"
> @@ -68,6 +69,7 @@ typedef struct Segment {
>  
>  typedef struct AdaptationSet {
>      char id[10];
> +    char descriptor[1024];
Please change this char * and allocate it dynamically. I understand there are some legacy code in dashenc using this 1024 length.
But at least new code should follow dynamic allocation.
>      enum AVMediaType media_type;
>      AVDictionary *metadata;
>      AVRational min_frame_rate, max_frame_rate;
> @@ -748,7 +750,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 (strlen(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 +823,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 +840,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 must be a properly formatted XML element, encoded by base64.
>      state = new_set;
>      while (*p) {
>          if (*p == ' ') {
> @@ -854,7 +860,30 @@ 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)) {
> +            char *encode_str, *decode_str;
> +            int decode_size, ret;
> +
> +            n = strcspn(p, ",");
> +            encode_str = av_strndup(p, n);
> +            decode_size = AV_BASE64_DECODE_SIZE(n);
> +            decode_str = av_mallocz(decode_size);
> +            if (decode_str) {
> +                ret = av_base64_decode(decode_str, encode_str, decode_size);
> +                if (ret >= 0)
> +                    snprintf(as->descriptor, sizeof(as->descriptor), "%.*s", decode_size, decode_str);
> +                else
> +                    av_log(s, AV_LOG_WARNING, "descriptor string is invalid base64 encode\n");
> +            } else {
> +                av_log(s, AV_LOG_WARNING, "av_mallocz failed, will not parse descriptor\n");
> +            }
> +            p += n;
> +            if (*p)
> +                p++;
> +            state = parse_descriptor;
> +            av_freep(&encode_str);
> +            av_freep(&decode_str);
> +        } 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];
Regards,
Karthick



More information about the ffmpeg-devel mailing list