[vlc-devel] [PATCH 05/48] hls: Don't reload main playlist

Jean-Paul Saman jpsaman at videolan.org
Tue Jan 10 11:40:04 CET 2012


NACK not reloading the main playlist file sounds like bad idea. Anyway
for sessions based HLS live streaming servers like wowza this has
already been solved.

What did you try to solve here?

Kind regards,

Jean-Paul Saman

On Mon, Jan 9, 2012 at 4:16 PM, Hugo Beauzée-Luyssen <beauze.h at gmail.com> wrote:
> From: Luc Saillard <luc.saillard at sfr.com>
>
> ---
>  modules/stream_filter/httplive.c |   95 ++++++++++++++++++++------------------
>  1 files changed, 50 insertions(+), 45 deletions(-)
>
> diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
> index 1df8b62..b380d05 100644
> --- a/modules/stream_filter/httplive.c
> +++ b/modules/stream_filter/httplive.c
> @@ -89,7 +89,7 @@ typedef struct hls_stream_s
>                                foreach segment of (segment->duration * hls->bandwidth/8) */
>
>     vlc_array_t *segments;  /* list of segments */
> -    vlc_url_t   url;        /* uri to m3u8 */
> +    char        *uri;       /* uri to m3u8 */
>     vlc_mutex_t lock;
>     bool        b_cache;    /* allow caching */
>
> @@ -163,8 +163,6 @@ static void* hls_Reload(void *);
>  static segment_t *segment_GetSegment(hls_stream_t *hls, int wanted);
>  static void segment_Free(segment_t *segment);
>
> -static char *ConstructUrl(vlc_url_t *url);
> -
>  /****************************************************************************
>  *
>  ****************************************************************************/
> @@ -225,7 +223,7 @@ static hls_stream_t *hls_New(vlc_array_t *hls_stream, const int id, const uint64
>     hls->version = 1;  /* default protocol version */
>     hls->b_cache = true;
>     hls->psz_current_key_path = NULL;
> -    vlc_UrlParse(&hls->url, uri, 0);
> +    hls->uri = uri?strdup(uri):NULL;
>     hls->segments = vlc_array_new();
>     vlc_array_append(hls_stream, hls);
>     vlc_mutex_init(&hls->lock);
> @@ -247,8 +245,9 @@ static void hls_Free(hls_stream_t *hls)
>     }
>     if(hls->psz_current_key_path)
>         free(hls->psz_current_key_path);
> +    if(hls->uri)
> +        free(hls->uri);
>
> -    vlc_UrlClean(&hls->url);
>     free(hls);
>     hls = NULL;
>  }
> @@ -268,13 +267,7 @@ static hls_stream_t *hls_Copy(hls_stream_t *src, const bool b_cp_segments)
>     dst->sequence = src->sequence;
>     dst->version = src->version;
>     dst->b_cache = src->b_cache;
> -    char *uri = ConstructUrl(&src->url);
> -    if (uri == NULL)
> -    {
> -        free(dst);
> -        return NULL;
> -    }
> -    vlc_UrlParse(&dst->url, uri, 0);
> +    dst->uri = strdup( src->uri );
>     if (!b_cp_segments)
>         dst->segments = vlc_array_new();
>     vlc_mutex_init(&dst->lock);
> @@ -1306,8 +1299,8 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
>         segment_t *segment = segment_Find(*hls, p->sequence);
>         if (segment)
>         {
> -            assert(p->url.psz_path);
> -            assert(segment->url.psz_path);
> +            assert( p->uri );
> +            assert( segment->uri );
>
>             /* they should be the same */
>             if ((p->sequence != segment->sequence) ||
> @@ -1317,8 +1310,8 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
>                 msg_Warn(s, "existing segment found with different content - resetting");
>                 msg_Warn(s, "- sequence: new=%d, old=%d", p->sequence, segment->sequence);
>                 msg_Warn(s, "- duration: new=%d, old=%d", p->duration, segment->duration);
> -                msg_Warn(s, "- file: new=%s", p->url.psz_path);
> -                msg_Warn(s, "        old=%s", segment->url.psz_path);
> +                msg_Warn(s, "- file: new=%s", p->uri );
> +                msg_Warn(s, "        old=%s", segment->uri );
>
>                 /* Resetting content */
>                 char *psz_url = ConstructUrl(&p->url);
> @@ -1385,44 +1378,56 @@ static int hls_ReloadPlaylist(stream_t *s)
>     if (hls_streams == NULL)
>         return VLC_ENOMEM;
>
> -    msg_Info(s, "Reloading HLS live meta playlist");
> -
> -    if (get_HTTPLiveMetaPlaylist(s, &hls_streams) != VLC_SUCCESS)
> -    {
> -        /* Free hls streams */
> -        for (int i = 0; i < vlc_array_count(hls_streams); i++)
> -        {
> -            hls_stream_t *hls;
> -            hls = (hls_stream_t *)vlc_array_item_at_index(hls_streams, i);
> -            if (hls) hls_Free(hls);
> -        }
> -        vlc_array_destroy(hls_streams);
> -
> -        msg_Err(s, "reloading playlist failed");
> -        return VLC_EGENERIC;
> -    }
> -
> -    /* merge playlists */
> -    int count = vlc_array_count(hls_streams);
> +    int count = vlc_array_count(p_sys->hls_stream);
>     for (int n = 0; n < count; n++)
>     {
> -        hls_stream_t *hls_new = hls_Get(hls_streams, n);
> -        if (hls_new == NULL)
> +        int err;
> +        hls_stream_t *hls = vlc_array_item_at_index(p_sys->hls_stream, n);
> +        if (!hls)
>             continue;
>
> -        hls_stream_t *hls_old = hls_Find(p_sys->hls_stream, hls_new);
> -        if (hls_old == NULL)
> -        {   /* new hls stream - append */
> -            vlc_array_append(p_sys->hls_stream, hls_new);
> -            msg_Info(s, "new HLS stream appended (id=%d, bandwidth=%"PRIu64")",
> -                     hls_new->id, hls_new->bandwidth);
> +        /* create a fake stream, so get_HTTPLivePlaylist() can updated it */
> +        hls_stream_t *hls_new = hls_New(hls_streams, hls->id, hls->bandwidth, hls->uri);
> +        msg_Info(s, "reloading sub-playlist %s", hls->uri);
> +        {
> +            /* Download playlist file from server */
> +            uint8_t *buf = NULL;
> +            ssize_t len = read_M3U8_from_url( s, hls->uri, &buf );
> +            if (len < 0)
> +            {
> +                msg_Err(s, "could not get playlist file at %s", hls_new->uri );
> +                goto fail;
> +            }
> +            /* Parse HLS m3u8 content. */
> +            err = parse_M3U8(s, hls_streams, buf, len);
> +            free(buf);
> +
> +            if (err != VLC_SUCCESS)
> +            {
> +                msg_Err(s, "could not parse playlist file at %s", hls_new->uri );
> +                goto fail;
> +            }
>         }
> -        else if (hls_UpdatePlaylist(s, hls_new, &hls_old) != VLC_SUCCESS)
> +        if (hls_UpdatePlaylist( s, hls_new, &hls ) != VLC_SUCCESS)
> +        {
>             msg_Info(s, "failed updating HLS stream (id=%d, bandwidth=%"PRIu64")",
>                      hls_new->id, hls_new->bandwidth);
> -    }
> +            goto fail;
> +        }
> +        /* Free the temp stream */
> +        vlc_array_destroy(hls_new->segments);
> +        hls_new->segments = NULL;
> +        hls_Free(hls_new);
> +     }
> +
>     vlc_array_destroy(hls_streams);
> +
>     return VLC_SUCCESS;
> +
> +fail:
> +    msg_Err(s, "reloading playlists failed");
> +    vlc_array_destroy(hls_streams);
> +    return VLC_EGENERIC;
>  }
>
>  /****************************************************************************
> --
> 1.7.8.3
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list