From patchwork Thu Jun 11 04:43:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20274 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 5447D448CDE for ; Thu, 11 Jun 2020 07:43:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4106D68B3FD; Thu, 11 Jun 2020 07:43:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8C4B168AD72 for ; Thu, 11 Jun 2020 07:43:32 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1591850614; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-Id: Date: Subject: To: From: Sender; bh=3ylldiNFiV6t+Np1KIa0+ANtdKwVBfmw5i0MfTcOfC8=; b=A7MVPXAV3FMYL2uSoOIqTlIHZtzWVQU4QLPRCMQFIICiM0HU8uhwfTwNe0G5+WUKQBAOiRWC 8nxLyMR2d4pV783EznOx/1AyYSYM7bTh5A+edGFJx2eObyoBySZElz20Xdm64EDpaW2Y4zmL 34c7FVnxo6VRnnDNxaDYH9mfXpU= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n12.prod.us-west-2.postgun.com with SMTP id 5ee1b6684c9690533a296542 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 11 Jun 2020 04:43:20 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Jun 2020 23:43:11 -0500 Message-Id: <20200611044312.38981-4-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200611044312.38981-1-rcombs@rcombs.me> References: <20200611044312.38981-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/5] lavf/dashdec: improve memory handling 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" - Fixes a couple leaks - Adds an av_freep equivalent for libxml buffers - Avoids some redundant copying --- libavformat/dashdec.c | 44 +++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index c94ce2caca..378c892b87 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -147,9 +147,6 @@ typedef struct DASHContext { uint64_t period_duration; uint64_t period_start; - /* AdaptationSet Attribute */ - char *adaptationset_lang; - int is_live; AVIOInterruptCB *interrupt_callback; char *allowed_extensions; @@ -162,6 +159,15 @@ typedef struct DASHContext { } DASHContext; +static void xml_freep(void* arg) +{ + void *val; + + memcpy(&val, arg, sizeof(val)); + memcpy(arg, &(void *){ NULL }, sizeof(val)); + xmlFree(val); +} + static int ishttp(char *url) { const char *proto_name = avio_find_protocol_name(url); @@ -362,6 +368,8 @@ static void free_representation(struct representation *pls) avformat_close_input(&pls->ctx); } + xml_freep(&pls->lang); + av_freep(&pls->url_template); av_freep(&pls); } @@ -878,15 +886,9 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, ret = AVERROR(ENOMEM); goto end; } - if (c->adaptationset_lang) { - rep->lang = av_strdup(c->adaptationset_lang); - if (!rep->lang) { - av_log(s, AV_LOG_ERROR, "alloc language memory failure\n"); - av_freep(&rep); - ret = AVERROR(ENOMEM); - goto end; - } - } + + rep->lang = xmlGetProp(adaptationset_node, "lang"); + rep->parent = s; representation_segmenttemplate_node = find_child_node_by_name(representation_node, "SegmentTemplate"); representation_baseurl_node = find_child_node_by_name(representation_node, "BaseURL"); @@ -965,7 +967,8 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, xmlFree(startnumber_val); } if (adaptationset_supplementalproperty_node) { - if (!av_strcasecmp(xmlGetProp(adaptationset_supplementalproperty_node,"schemeIdUri"), "http://dashif.org/guidelines/last-segment-number")) { + char *schemeIdUri = xmlGetProp(adaptationset_supplementalproperty_node, "schemeIdUri"); + if (!av_strcasecmp(schemeIdUri, "http://dashif.org/guidelines/last-segment-number")) { val = xmlGetProp(adaptationset_supplementalproperty_node,"value"); if (!val) { av_log(s, AV_LOG_ERROR, "Missing value attribute in adaptationset_supplementalproperty_node\n"); @@ -974,6 +977,7 @@ static int parse_manifest_representation(AVFormatContext *s, const char *url, xmlFree(val); } } + xmlFree(schemeIdUri); } fragment_timeline_node = find_child_node_by_name(representation_segmenttemplate_node, "SegmentTimeline"); @@ -1120,13 +1124,10 @@ end: static int parse_manifest_adaptationset_attr(AVFormatContext *s, xmlNodePtr adaptationset_node) { - DASHContext *c = s->priv_data; - if (!adaptationset_node) { av_log(s, AV_LOG_WARNING, "Cannot get AdaptationSet\n"); return AVERROR(EINVAL); } - c->adaptationset_lang = xmlGetProp(adaptationset_node, "lang"); return 0; } @@ -1139,7 +1140,6 @@ 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 adaptationset_baseurl_node = NULL; @@ -1182,7 +1182,6 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, } err: - av_freep(&c->adaptationset_lang); return ret; } @@ -2157,6 +2156,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 (rep->lang) { + av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0); + xml_freep(&rep->lang); + } } for (i = 0; i < c->n_audios; i++) { rep = c->audios[i]; @@ -2168,7 +2171,7 @@ static int dash_read_header(AVFormatContext *s) av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0); if (rep->lang) { av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0); - av_freep(&rep->lang); + xml_freep(&rep->lang); } } for (i = 0; i < c->n_subtitles; i++) { @@ -2179,7 +2182,7 @@ static int dash_read_header(AVFormatContext *s) av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0); if (rep->lang) { av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0); - av_freep(&rep->lang); + xml_freep(&rep->lang); } } } @@ -2282,6 +2285,7 @@ static int dash_close(AVFormatContext *s) DASHContext *c = s->priv_data; free_audio_list(c); free_video_list(c); + free_subtitle_list(c); av_dict_free(&c->avio_opts); av_freep(&c->base_url); return 0;