From patchwork Mon Jul 15 03:11:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: leozhang X-Patchwork-Id: 13946 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 E320E448823 for ; Mon, 15 Jul 2019 06:11:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C0C8768AABF; Mon, 15 Jul 2019 06:11:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smg-bj-02.qiyi.com (unknown [202.108.14.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C82BA68AABA for ; Mon, 15 Jul 2019 06:11:12 +0300 (EEST) X-AuditID: ca6c0e64-323ff700000057a5-e8-5d2beecdeba4 Received: from mail.iqiyi.com (Unknown_Domain [10.11.69.96]) by smg-bj-02.qiyi.com (Qiyi mail Gateway) with SMTP id D3.1E.22437.DCEEB2D5; Mon, 15 Jul 2019 11:11:09 +0800 (HKT) From: leozhang To: Date: Mon, 15 Jul 2019 11:11:04 +0800 Message-ID: <1563160264-131104-1-git-send-email-leozhang@qiyi.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1562920274-85570-1-git-send-email-leozhang@qiyi.com> References: <1562920274-85570-1-git-send-email-leozhang@qiyi.com> 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+NgFlrFLMWRmVeSWpSXmKPExsXCxe2aoHv2nXaswfR2QYtvn84wOzB6/Fm0 mSWAMYrbJimxpCw4Mz1P3y6BO2Nt7w/2ggaVilO/wxsY30t1MXJySAiYSBxrb2LuYuTiEBLY yCjx7dBVFpAEm4CSxPoVU1lBbBEBWYnV/6awgdjCAmUSD763MYHYLAKqEg0HJzKC2LwCThLT 725ngxiqIDHl4XtmEJsTKH59yWOwGiEBR4kfNx+zQ9QLSpyc+QRsF7OAhMTBFy+YIWrkJJ7+ +sUCMUdRYtXstVB2pMSVlQ/YJzDyz0LSPgtJ+wJGplWMQsW56bpJWboGRnqFmZWZesn5uZsY gcF0KocvZQfjwfnOhxgFOBiVeHg/ZGjHCrEmlhVX5h5ilOBgVhLhXfVfPVaINyWxsiq1KD++ qDQntfgQozQHi5I4799vQCmB9MSS1OzU1ILUIpgsEwcnSDeXlEhxal5KalFiaUlGPCjQ44uB oS7VwLgjujZlQ1VO0bqkGxyvoqOzIziv/bylmZ37rkHmU73d5fAUrttb7pV3zuCsX3+6NsX5 wftT60P8J0gp/eiafuxRd9XLtN9PnfW/NMZH7+3Td7FwvGeXsjG2NXXnkwr+bUF/vhhW5Qeo N8VLfeVh/Ja/46epXU2+zMcndgYVjZurcmX911v9UmIpzkg01GIuKk4EAIrDPbQ9AgAA 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" change history: 1. remove unnecessary cast. 2. add some braces. Please comment, Thanks Signed-off-by: leozhang --- 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. @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]; 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,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];