From patchwork Fri Jul 12 08:31:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: leozhang X-Patchwork-Id: 13909 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A482D44866B for ; Fri, 12 Jul 2019 11:31:36 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 82D2068ACDF; Fri, 12 Jul 2019 11:31:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smg-sh-01.qiyi.com (unknown [101.227.12.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B608168ABC0 for ; Fri, 12 Jul 2019 11:31:29 +0300 (EEST) X-AuditID: 65e30cac-067ff70000007f2a-01-5d2845590487 Received: from mail.iqiyi.com (Unknown_Domain [10.11.69.97]) by smg-sh-01.qiyi.com (Qiyi mail Gateway) with SMTP id EC.D2.32554.955482D5; Fri, 12 Jul 2019 16:31:21 +0800 (HKT) From: leozhang To: Date: Fri, 12 Jul 2019 16:31:14 +0800 Message-ID: <1562920274-85570-1-git-send-email-leozhang@qiyi.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-Originating-IP: [10.39.144.214] X-ClientProxiedBy: BJ-CAS24.iqiyi.pps (10.15.221.33) To EXCH20.iqiyi.pps (10.16.148.50) X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprMLMWRmVeSWpSXmKPExsXCxe2aqBvpqhFrcOyrisW3T2eYHRg9/iza zBLAGMVtk5RYUhacmZ6nb5fAnXH0bit7wWbVihf/7jI3MDbIdDFyckgImEg0vX3M3sXIxSEk sJFR4s7qTjaQBJuAksT6FVNZQWwRAVmJ1f+mgMWFBcokHnxvYwKxWQRUJWbcWcMMYvMKOEos 2fuGBWKogsSUh++h4oISJ2c+AYszC0hIHHzxAiwuJCAn8fTXL6h6RYlVs9dC2ZESV1Y+YJ/A yDsLSfssJO0LGJlWMQoV56brFmfoGhjqFWZWZuol5+duYgSGR+pjnjU7GJ/tcD7EKMDBqMTD e6FWPVaINbGsuDL3EKMEB7OSCO+q/0Ah3pTEyqrUovz4otKc1OJDjNIcLErivIzfgVIC6Ykl qdmpqQWpRTBZJg5OkG4uKZHi1LyU1KLE0pKMeFDoxhcDg1eqgTHH627rpe2hD58u33o7X8nS 4KTk5+lN2Rd098/nl75Wo84pNFFXvPm40oTLaje/rDTXfNIuxzj1+bLbR4z/nw6U85jQfS7x bdH2VX+COB7cWbpt60sb23CBfcvv6it8emYvxxm+0Db6wt9N6Rc/3GVcsmXVe68ZFxY4nN6V rhA0w/uEuqT59qsblViKMxINtZiLihMB4X0U9CYCAAA= Subject: [FFmpeg-devel] dash: add descriptor which is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Reference ISO/IEC 23009-1:2014/Amd.2:2015, a spatial relationship descriptor is defined as a spatial part of a content component (e.g. a region of interest, or a tile) and represented by either an Adaptation Set or a Sub-Representation. Signed-off-by: leozhang --- doc/muxers.texi | 3 +++ libavformat/dashenc.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 36 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. @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..f7ebb1f 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]; 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\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,31 @@ 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; + uint8_t *decode_str; + int decode_size, ret; + + n = strcspn(p, ","); + encode_str = av_strndup(p, n); + decode_size = AV_BASE64_DECODE_SIZE(n); + decode_str = (uint8_t *)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];