[FFmpeg-devel] [PATCH] Add support for unequal duration for VOD playlist

Somsak Sriprayoonsakul somsaks at gmail.com
Thu Apr 26 18:49:11 EEST 2018


Hello,

Do I need to do any other things to get this patch accepted?

Best Regards,

Somsak

somsaks at gmail.com

On Fri, Apr 20, 2018 at 5:05 PM, Somsak Sriprayoonsakul <somsaks at gmail.com>
wrote:

> (Sorry for spamming, forgot the sign off part)
>
> This patch make ffmpeg able to create a single HLS m3u8 with different
> duration in the same manifest for VOD playlist ype.
>
> This has benefit on optimizing HLS stream to start faster, having
> initially shorter duration. The later part of the
> stream could have longer duration, which lower server load (less number
> of files, less
> connection initiation needed on server side which is very significant in
> this HTTPS era).
>
> The similar capability was already exists in ffmpeg hlsenc.c, but only
> for
> live playlist. I just fix it a little bit to make it support VOD
> playlist..
>
> To create such VOD stream
>
> ffmpeg -i input -c:v libx264 -c:a aac \
>   -hls_init_time 2 -hls_time 8 \
>   -hls_list_size 5 -hls_playlist_type vod \
>   -f hls output_vod.m3u8
>
> VOD playlist will use hls_list_size as the intended number of chunk to
> use the hls_init_time.
>
> Signed-off-by: Somsak Sriprayoonsakul <somsaks at gmail.com>
> ---
>  libavformat/hlsenc.c | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index c27a66ea79..b6260b262d 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -1026,26 +1026,28 @@ static int hls_append_segment(struct
> AVFormatContext *s, HLSContext *hls,
>
>      vs->last_segment = en;
>
> -    // EVENT or VOD playlists imply sliding window cannot be used
> -    if (hls->pl_type != PLAYLIST_TYPE_NONE)
> +    // EVENT playlists imply sliding window cannot be used
> +    if ( (hls->pl_type == PLAYLIST_TYPE_EVENT) || (hls->pl_type ==
> PLAYLIST_TYPE_NB) )
>          hls->max_nb_segments = 0;
>
>      if (hls->max_nb_segments && vs->nb_entries >= hls->max_nb_segments) {
> -        en = vs->segments;
> -        vs->initial_prog_date_time += en->duration;
> -        vs->segments = en->next;
> -        if (en && hls->flags & HLS_DELETE_SEGMENTS &&
> +        if( hls->pl_type != PLAYLIST_TYPE_VOD ) {
> +            en = vs->segments;
> +            vs->initial_prog_date_time += en->duration;
> +            vs->segments = en->next;
> +            if (en && hls->flags & HLS_DELETE_SEGMENTS &&
>  #if FF_API_HLS_WRAP
> -                !(hls->flags & HLS_SINGLE_FILE || hls->wrap)) {
> +                    !(hls->flags & HLS_SINGLE_FILE || hls->wrap)) {
>  #else
> -                !(hls->flags & HLS_SINGLE_FILE)) {
> +                    !(hls->flags & HLS_SINGLE_FILE)) {
>  #endif
> -            en->next = vs->old_segments;
> -            vs->old_segments = en;
> -            if ((ret = hls_delete_old_segments(s, hls, vs)) < 0)
> -                return ret;
> -        } else
> -            av_free(en);
> +                en->next = vs->old_segments;
> +                vs->old_segments = en;
> +                if ((ret = hls_delete_old_segments(s, hls, vs)) < 0)
> +                    return ret;
> +            } else
> +                av_free(en);
> +        }
>      } else
>          vs->nb_entries++;
>
> --
> 2.14.1
>
>


More information about the ffmpeg-devel mailing list