[FFmpeg-devel] [PATCH] avformat/dashdec: fix memleak for commit commit e134c203
Nicolas George
george at nsup.org
Thu Mar 19 01:42:08 EET 2020
Steven Liu (12020-03-17):
> These member will be used for get more correct information of the MPD
>
> Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
> ---
> 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);
> + }
Please don't use copy-paste when coding. Whenever you might want it,
make a helper function.
> + 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);
> + }
These don't seem to support the special values accepted by
av_parse_video_rate().
> + 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);
> + }
Helper function.
> +
> + 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);
> + }
> }
> }
>
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20200319/fbd52c86/attachment.sig>
More information about the ffmpeg-devel
mailing list