[FFmpeg-devel] [PATCH] Add support for HLS PLAYLIST types EVENT and VOD

Adam Kent adam at semicircular.net
Wed Dec 16 04:17:23 CET 2015


Adds HLS flags to emit the X-PLAYLIST-TYPE tag to the top of generated
M3U8 files.

See the spec:
https://tools.ietf.org/html/draft-pantos-http-live-streaming-18#section-4.3.3.5

There was also an FFMPEG trac ticket #4571 that had this as a wishlist item:
https://trac.ffmpeg.org/ticket/4571

---
 doc/muxers.texi      | 6 ++++++
 libavformat/hlsenc.c | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/doc/muxers.texi b/doc/muxers.texi
index b6d8823..cbbf23e 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -368,6 +368,12 @@ Will produce the playlist, @file{out.m3u8}, and a single segment file,
 @item hls_flags delete_segments
 Segment files removed from the playlist are deleted after a period of time
 equal to the duration of the segment plus the duration of the playlist.
+
+ at item hls_flags event
+Emit #EXT-X-PLAYLIST-TYPE:EVENT at the top of the M3U8 file.
+
+ at item hls_flags vod
+Emit #EXT-X-PLAYLIST-TYPE:VOD at the top of the M3U8 file.
 @end table
 
 @anchor{ico}
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index adcf7df..8db2088 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -61,6 +61,8 @@ typedef enum HLSFlags {
     HLS_ROUND_DURATIONS = (1 << 2),
     HLS_DISCONT_START = (1 << 3),
     HLS_OMIT_ENDLIST = (1 << 4),
+    HLS_EVENT_PLAYLIST = (1 << 5),
+    HLS_VOD_PLAYLIST = (1 << 6),
 } HLSFlags;
 
 typedef struct HLSContext {
@@ -411,6 +413,11 @@ static int hls_window(AVFormatContext *s, int last)
     }
     avio_printf(out, "#EXT-X-TARGETDURATION:%d\n", target_duration);
     avio_printf(out, "#EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence);
+    if (hls->flags & HLS_EVENT_PLAYLIST) {
+        avio_printf(out, "#EXT-X-PLAYLIST-TYPE:EVENT\n");
+    } else if (hls->flags & HLS_VOD_PLAYLIST) {
+        avio_printf(out, "#EXT-X-PLAYLIST-TYPE:VOD\n");
+    }
 
     av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n",
            sequence);
@@ -874,6 +881,8 @@ static const AVOption options[] = {
     {"round_durations", "round durations in m3u8 to whole numbers", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_ROUND_DURATIONS }, 0, UINT_MAX,   E, "flags"},
     {"discont_start", "start the playlist with a discontinuity tag", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DISCONT_START }, 0, UINT_MAX,   E, "flags"},
     {"omit_endlist", "Do not append an endlist when ending stream", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_OMIT_ENDLIST }, 0, UINT_MAX,   E, "flags"},
+    {"event", "set playlist type as 'EVENT'", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_EVENT_PLAYLIST }, 0, UINT_MAX,   E, "flags"},
+    {"vod", "set playlist type as 'VOD'", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_VOD_PLAYLIST }, 0, UINT_MAX,   E, "flags"},
     { "use_localtime", "set filename expansion with strftime at segment creation", OFFSET(use_localtime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
     {"method", "set the HTTP method", OFFSET(method), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,    E},
 
-- 
2.1.4



More information about the ffmpeg-devel mailing list