[FFmpeg-devel] [PATCH] avformat/hls: Reduce memory footprint by using dynamic allocated url/key

Schenk, Michael Michael.Schenk at albistechnologies.com
Fri Apr 11 08:22:53 CEST 2014



> -----Original Message-----
> From: ffmpeg-devel-bounces at ffmpeg.org [mailto:ffmpeg-devel-
> bounces at ffmpeg.org] On Behalf Of Anssi Hannula
> Sent: Donnerstag, 10. April 2014 23:34
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH] avformat/hls: Reduce memory footprint
> by using dynamic allocated url/key
> 
> 09.04.2014 08:44, Schenk, Michael kirjoitti:
> > Hi!
> 
> Hi,

Hi,

> 
> > many thanks for your help. I hope this time the patch (format) is correctly.
> >
> > Feedback welcome
> 
> Feedback below:
> 
> > 0001-reduce-memory-by-using-dynamic-allocated-url-key.patch
> >
> >
> > From 31b3fc2923c4c31ccf2f385e38eba1b33336ddf1 Mon Sep 17 00:00:00
> 2001
> > From: Michael Schenk <michael.schenk at albistechnologies.com>
> > Date: Wed, 9 Apr 2014 07:39:37 +0200
> > Subject: [PATCH] reduce memory by using dynamic allocated url/key
> >
> > ---
> >  libavformat/hls.c | 38 +++++++++++++++++++++++++++++++++-----
> >  1 file changed, 33 insertions(+), 5 deletions(-)
> >
> > diff --git a/libavformat/hls.c b/libavformat/hls.c index
> > 0b4b58d..5907260 100644
> > --- a/libavformat/hls.c
> > +++ b/libavformat/hls.c
> > @@ -68,8 +68,8 @@ struct segment {
> >      int64_t duration;
> >      int64_t url_offset;
> >      int64_t size;
> > -    char url[MAX_URL_SIZE];
> > -    char key[MAX_URL_SIZE];
> > +    char *url;
> > +    char *key;
> >      enum KeyType key_type;
> >      uint8_t iv[16];
> >  };
> > @@ -192,8 +192,13 @@ static int read_chomp_line(AVIOContext *s, char
> > *buf, int maxlen)  static void free_segment_list(struct playlist *pls)
> > {
> >      int i;
> > -    for (i = 0; i < pls->n_segments; i++)
> > +
> > +    for (i = 0; i < pls->n_segments; i++) {
> > +        av_free(pls->segments[i]->key);
> > +        av_free(pls->segments[i]->url);
> >          av_free(pls->segments[i]);
> > +    }
> > +
> >      av_freep(&pls->segments);
> >      pls->n_segments = 0;
> >  }
> > @@ -504,6 +509,11 @@ static int parse_playlist(HLSContext *c, const char
> *url,
> >      int64_t seg_size = -1;
> >      uint8_t *new_url = NULL;
> >      struct variant_info variant_info;
> > +    char tmp_key_url[MAX_URL_SIZE];
> > +    char tmp_url[MAX_URL_SIZE];
> > +    int tmp_len;
> > +
> > +    key[0] = '\0';
> 
> Isn't key already an empty string?
> 
> >      if (!in) {
> >          AVDictionary *opts = NULL;
> > @@ -624,8 +634,26 @@ static int parse_playlist(HLSContext *c, const char
> *url,
> >                      memset(seg->iv, 0, sizeof(seg->iv));
> >                      AV_WB32(seg->iv + 12, seq);
> >                  }
> > -                ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
> > -                ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
> > +
> > +                seg->key = seg->url = NULL;
> 
> No need to set seg->url to NULL here, it is set always below.
> 
> > +                tmp_len = strlen(key);
> > +
> > +                if (tmp_len != 0) {
> 
> You can replace this check with "if (key_type != KEY_NONE)".
> 
> > +                    ff_make_absolute_url(tmp_key_url, sizeof(tmp_key_url), url,
> key);
> > +                    tmp_len = strlen(tmp_key_url);
> > +                    seg->key = av_malloc(tmp_len + 1);
> > +                    strcpy(seg->key, tmp_key_url);
> 
> Use av_strdup :)
> 
> > +                } else {
> > +                    seg->key = av_malloc(sizeof(char));
> > +                    seg->key[0] = '\0';
> 
> You can drop this allocation altogether if you check for KEY_NONE above, since
> seg->key is never accessed if key_type == KEY_NONE.
> You can also move "seg->key = NULL" here from above.
> 
> > +                }
> > +
> > +                ff_make_absolute_url(tmp_url, sizeof(tmp_url), url, line);
> > +                tmp_len = strlen(tmp_url);
> > +                seg->url = av_malloc(tmp_len + 1);
> > +                strcpy(seg->url, tmp_url);
> 
> Same for av_strdup here.
> 
> Also, you are missing return value checks for the allocation, you'll need to fail
> with AVERROR(ENOMEM) in that case.
> 
> >                  dynarray_add(&pls->segments, &pls->n_segments, seg);
> >                  is_segment = 0;
> >
> 
> Thanks for looking into this.
> 
> --
> Anssi Hannula
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Many thanks for the feedback. Please find attached a revised version of the patch based on your feedback.

Feedback welcome!

Michael Schenk



-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-reduce-memory-by-using-dynamic-allocated-url-key-rev.patch
Type: application/octet-stream
Size: 2679 bytes
Desc: 0001-reduce-memory-by-using-dynamic-allocated-url-key-rev.patch
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140411/b4276370/attachment.obj>


More information about the ffmpeg-devel mailing list