From patchwork Mon Mar 16 16:47:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 18248 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 C82D1449D30 for ; Mon, 16 Mar 2020 18:47:34 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9BCBB68B51A; Mon, 16 Mar 2020 18:47:34 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpproxy21.qq.com (smtpbg704.qq.com [203.205.195.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1BE7B68B501 for ; Mon, 16 Mar 2020 18:47:26 +0200 (EET) X-QQ-mid: bizesmtp2t1584377224t5hz50exs Received: from localhost (unknown [222.129.175.219]) by esmtp6.qq.com (ESMTP) with id ; Tue, 17 Mar 2020 00:47:03 +0800 (CST) X-QQ-SSF: 01100000002000K0ZTF0B00A0000000 X-QQ-FEAT: Tf10PgKjoHzMvq8egFI+XjHZ2HGXv/PrC0Vp17dXp/UUZqgWRYDGEW0dGS/nX LdLUg+EWMpgE/LJB4NE+h53aPp+adSIIhQh9zB5+ThQRUAUa7l9SRiKvuzMnN1XBeYIVXeI I8V3aQj5D/cwdjY78u7ozzclZhDTRAxts/1zWGoeirVU12tcn/FKrDIniCkdtrp91gqth4q mj8PMhfMnChjK6EsZC15t+r1Dk9dzj2U71oisElIRp5h7ffI9lhllaLArfl8CMlhJHzQybB Uc1180stJt6P6i0cX5Aiah/NJ24m6RH1BOgk/3+yMBgA4NAjnmFGDekqE= X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Tue, 17 Mar 2020 00:47:01 +0800 Message-Id: <20200316164701.81967-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybgforeign:qybgforeign7 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH] avformat/dashdec: fix memleak for commit commit e134c203 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" These member will be used for get more correct information of the MPD Signed-off-by: Steven Liu --- libavformat/dashdec.c | 134 +++++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 27 deletions(-) diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index 5bbe5d3985..27d44c2633 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -122,19 +122,17 @@ struct representation { typedef struct DASHContext { const AVClass *class; char *base_url; - char *adaptionset_contenttype_val; - char *adaptionset_par_val; - char *adaptionset_lang_val; - char *adaptionset_minbw_val; - char *adaptionset_maxbw_val; - char *adaptionset_minwidth_val; - char *adaptionset_maxwidth_val; - char *adaptionset_minheight_val; - char *adaptionset_maxheight_val; - char *adaptionset_minframerate_val; - char *adaptionset_maxframerate_val; - char *adaptionset_segmentalignment_val; - char *adaptionset_bitstreamswitching_val; + char *adaptionset_lang; + int64_t adaptionset_minbw; + int64_t adaptionset_maxbw; + int64_t adaptionset_minwidth; + int64_t adaptionset_maxwidth; + int64_t adaptionset_minheight; + int64_t adaptionset_maxheight; + AVRational adaptionset_minframerate; + AVRational adaptionset_maxframerate; + int adaptionset_segmentalignment; + int adaptionset_bitstreamswitching; int n_videos; struct representation **videos; @@ -1116,6 +1114,90 @@ end: return ret; } +static int parse_manifest_adaptationset_attr(AVFormatContext *s, xmlNodePtr adaptionset_node) +{ + int ret = 0; + DASHContext *c = s->priv_data; + char *adaptionset_minbw_val = NULL; + char *adaptionset_maxbw_val = NULL; + char *adaptionset_minwidth_val = NULL; + char *adaptionset_maxwidth_val = NULL; + char *adaptionset_minheight_val = NULL; + char *adaptionset_maxheight_val = NULL; + char *adaptionset_minframerate_val = NULL; + char *adaptionset_maxframerate_val = NULL; + char *adaptionset_segmentalignment_val = NULL; + char *adaptionset_bitstreamswitching_val = NULL; + + if (!adaptionset_node) { + av_log(s, AV_LOG_WARNING, "Cannot get AdaptionSet\n"); + return AVERROR(EINVAL); + } + + c->adaptionset_lang = xmlGetProp(adaptionset_node, "lang"); + + adaptionset_minbw_val = xmlGetProp(adaptionset_node, "minBandwidth"); + if (adaptionset_minbw_val) { + c->adaptionset_minbw = (int64_t) strtoll(adaptionset_minbw_val, NULL, 10); + xmlFree(adaptionset_minbw_val); + } + adaptionset_maxbw_val = xmlGetProp(adaptionset_node, "maxBandwidth"); + if (adaptionset_maxbw_val) { + c->adaptionset_maxbw = (int64_t) strtoll(adaptionset_maxbw_val, NULL, 10); + xmlFree(adaptionset_maxbw_val); + } + adaptionset_minwidth_val = xmlGetProp(adaptionset_node, "minWidth"); + if (adaptionset_minwidth_val) { + c->adaptionset_minwidth = (int64_t) strtoll(adaptionset_minwidth_val, NULL, 10); + xmlFree(adaptionset_minwidth_val); + } + adaptionset_maxwidth_val = xmlGetProp(adaptionset_node, "maxWidth"); + if (adaptionset_maxwidth_val) { + c->adaptionset_maxwidth = (int64_t) strtoll(adaptionset_maxwidth_val, NULL, 10); + xmlFree(adaptionset_maxwidth_val); + } + adaptionset_minheight_val = xmlGetProp(adaptionset_node, "minHeight"); + if (adaptionset_minheight_val) { + c->adaptionset_minheight = (int64_t) strtoll(adaptionset_maxwidth_val, NULL, 10); + xmlFree(adaptionset_minheight_val); + } + adaptionset_maxheight_val = xmlGetProp(adaptionset_node, "maxHeight"); + if (adaptionset_maxheight_val) { + c->adaptionset_maxheight = (int64_t) strtoll(adaptionset_maxheight_val, NULL, 10); + xmlFree(adaptionset_maxheight_val); + } + adaptionset_minframerate_val = xmlGetProp(adaptionset_node, "minFrameRate"); + if (adaptionset_minframerate_val) { + ret = av_parse_video_rate(&c->adaptionset_minframerate, adaptionset_minframerate_val); + xmlFree(adaptionset_minframerate_val); + if (ret < 0) + av_log(s, AV_LOG_VERBOSE, "Ignoring invalid min frame rate '%s'\n", adaptionset_minframerate_val); + } + adaptionset_maxframerate_val = xmlGetProp(adaptionset_node, "maxFrameRate"); + if (adaptionset_maxframerate_val) { + ret = av_parse_video_rate(&c->adaptionset_maxframerate, adaptionset_maxframerate_val); + xmlFree(adaptionset_maxframerate_val); + if (ret < 0) + av_log(s, AV_LOG_VERBOSE, "Ignoring invalid max frame rate '%s'\n", adaptionset_maxframerate_val); + } + adaptionset_segmentalignment_val = xmlGetProp(adaptionset_node, "segmentAlignment"); + if (adaptionset_segmentalignment_val) { + c->adaptionset_segmentalignment = 0; + if (!av_strcasecmp(adaptionset_segmentalignment_val, "true")) + c->adaptionset_segmentalignment = 1; + xmlFree(adaptionset_segmentalignment_val); + } + adaptionset_bitstreamswitching_val = xmlGetProp(adaptionset_node, "bitstreamSwitching"); + if (adaptionset_bitstreamswitching_val) { + c->adaptionset_bitstreamswitching = 0; + if (!av_strcasecmp(adaptionset_bitstreamswitching_val, "true")) + c->adaptionset_bitstreamswitching = 1; + xmlFree(adaptionset_bitstreamswitching_val); + } + + return ret; +} + static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, xmlNodePtr adaptionset_node, xmlNodePtr mpd_baseurl_node, @@ -1124,26 +1206,16 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, xmlNodePtr period_segmentlist_node) { int ret = 0; - DASHContext *c = s->priv_data; xmlNodePtr fragment_template_node = NULL; xmlNodePtr content_component_node = NULL; xmlNodePtr adaptionset_baseurl_node = NULL; xmlNodePtr adaptionset_segmentlist_node = NULL; xmlNodePtr adaptionset_supplementalproperty_node = NULL; xmlNodePtr node = NULL; - c->adaptionset_contenttype_val = xmlGetProp(adaptionset_node, "contentType"); - c->adaptionset_par_val = xmlGetProp(adaptionset_node, "par"); - c->adaptionset_lang_val = xmlGetProp(adaptionset_node, "lang"); - c->adaptionset_minbw_val = xmlGetProp(adaptionset_node, "minBandwidth"); - c->adaptionset_maxbw_val = xmlGetProp(adaptionset_node, "maxBandwidth"); - c->adaptionset_minwidth_val = xmlGetProp(adaptionset_node, "minWidth"); - c->adaptionset_maxwidth_val = xmlGetProp(adaptionset_node, "maxWidth"); - c->adaptionset_minheight_val = xmlGetProp(adaptionset_node, "minHeight"); - c->adaptionset_maxheight_val = xmlGetProp(adaptionset_node, "maxHeight"); - c->adaptionset_minframerate_val = xmlGetProp(adaptionset_node, "minFrameRate"); - c->adaptionset_maxframerate_val = xmlGetProp(adaptionset_node, "maxFrameRate"); - c->adaptionset_segmentalignment_val = xmlGetProp(adaptionset_node, "segmentAlignment"); - c->adaptionset_bitstreamswitching_val = xmlGetProp(adaptionset_node, "bitstreamSwitching"); + + ret = parse_manifest_adaptationset_attr(s, adaptionset_node); + if (ret < 0) + return ret; node = xmlFirstElementChild(adaptionset_node); while (node) { @@ -2148,6 +2220,10 @@ static int dash_read_header(AVFormatContext *s) av_dict_set_int(&rep->assoc_stream->metadata, "variant_bitrate", rep->bandwidth, 0); if (rep->id[0]) av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0); + if (c->adaptionset_lang) { + av_dict_set(&rep->assoc_stream->metadata, "lang", c->adaptionset_lang, 0); + xmlFree(c->adaptionset_lang); + } } for (i = 0; i < c->n_subtitles; i++) { rep = c->subtitles[i]; @@ -2155,6 +2231,10 @@ static int dash_read_header(AVFormatContext *s) rep->assoc_stream = s->streams[rep->stream_index]; if (rep->id[0]) av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0); + if (c->adaptionset_lang) { + av_dict_set(&rep->assoc_stream->metadata, "lang", c->adaptionset_lang, 0); + xmlFree(c->adaptionset_lang); + } } }