@@ -93,6 +93,7 @@ typedef struct {
93
93
ngx_str_t path ;
94
94
ngx_uint_t naming ;
95
95
ngx_uint_t slicing ;
96
+ ngx_uint_t type ;
96
97
ngx_path_t * slot ;
97
98
ngx_msec_t max_audio_delay ;
98
99
size_t audio_buffer_size ;
@@ -111,6 +112,10 @@ typedef struct {
111
112
#define NGX_RTMP_HLS_SLICING_ALIGNED 2
112
113
113
114
115
+ #define NGX_RTMP_HLS_TYPE_LIVE 1
116
+ #define NGX_RTMP_HLS_TYPE_EVENT 2
117
+
118
+
114
119
static ngx_conf_enum_t ngx_rtmp_hls_naming_slots [] = {
115
120
{ ngx_string ("sequential" ), NGX_RTMP_HLS_NAMING_SEQUENTIAL },
116
121
{ ngx_string ("timestamp" ), NGX_RTMP_HLS_NAMING_TIMESTAMP },
@@ -126,6 +131,13 @@ static ngx_conf_enum_t ngx_rtmp_hls_slicing_slots[] = {
126
131
};
127
132
128
133
134
+ static ngx_conf_enum_t ngx_rtmp_hls_type_slots [] = {
135
+ { ngx_string ("live" ), NGX_RTMP_HLS_TYPE_LIVE },
136
+ { ngx_string ("event" ), NGX_RTMP_HLS_TYPE_EVENT },
137
+ { ngx_null_string , 0 }
138
+ };
139
+
140
+
129
141
static ngx_command_t ngx_rtmp_hls_commands [] = {
130
142
131
143
{ ngx_string ("hls" ),
@@ -205,6 +217,13 @@ static ngx_command_t ngx_rtmp_hls_commands[] = {
205
217
offsetof(ngx_rtmp_hls_app_conf_t , slicing ),
206
218
& ngx_rtmp_hls_slicing_slots },
207
219
220
+ { ngx_string ("hls_type" ),
221
+ NGX_RTMP_MAIN_CONF |NGX_RTMP_SRV_CONF |NGX_RTMP_APP_CONF |NGX_CONF_TAKE1 ,
222
+ ngx_conf_set_enum_slot ,
223
+ NGX_RTMP_APP_CONF_OFFSET ,
224
+ offsetof(ngx_rtmp_hls_app_conf_t , type ),
225
+ & ngx_rtmp_hls_type_slots },
226
+
208
227
{ ngx_string ("hls_max_audio_delay" ),
209
228
NGX_RTMP_MAIN_CONF |NGX_RTMP_SRV_CONF |NGX_RTMP_APP_CONF |NGX_CONF_TAKE1 ,
210
229
ngx_conf_set_msec_slot ,
@@ -521,8 +540,11 @@ ngx_rtmp_hls_write_playlist(ngx_rtmp_session_t *s)
521
540
"#EXTM3U\n"
522
541
"#EXT-X-VERSION:3\n"
523
542
"#EXT-X-MEDIA-SEQUENCE:%uL\n"
524
- "#EXT-X-TARGETDURATION:%ui\n" ,
525
- ctx -> frag , max_frag );
543
+ "#EXT-X-TARGETDURATION:%ui\n"
544
+ "%s" ,
545
+ ctx -> frag , max_frag ,
546
+ hacf -> type == NGX_RTMP_HLS_TYPE_EVENT ?
547
+ "#EXT-X-PLAYLIST-TYPE: EVENT\n" : "" );
526
548
527
549
n = ngx_write_fd (fd , buffer , p - buffer );
528
550
if (n < 0 ) {
@@ -2068,6 +2090,7 @@ ngx_rtmp_hls_create_app_conf(ngx_conf_t *cf)
2068
2090
conf -> nested = NGX_CONF_UNSET ;
2069
2091
conf -> naming = NGX_CONF_UNSET_UINT ;
2070
2092
conf -> slicing = NGX_CONF_UNSET_UINT ;
2093
+ conf -> type = NGX_CONF_UNSET_UINT ;
2071
2094
conf -> max_audio_delay = NGX_CONF_UNSET_MSEC ;
2072
2095
conf -> audio_buffer_size = NGX_CONF_UNSET_SIZE ;
2073
2096
conf -> cleanup = NGX_CONF_UNSET ;
@@ -2097,6 +2120,8 @@ ngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)
2097
2120
NGX_RTMP_HLS_NAMING_SEQUENTIAL );
2098
2121
ngx_conf_merge_uint_value (conf -> slicing , prev -> slicing ,
2099
2122
NGX_RTMP_HLS_SLICING_PLAIN );
2123
+ ngx_conf_merge_uint_value (conf -> type , prev -> type ,
2124
+ NGX_RTMP_HLS_TYPE_LIVE );
2100
2125
ngx_conf_merge_msec_value (conf -> max_audio_delay , prev -> max_audio_delay ,
2101
2126
300 );
2102
2127
ngx_conf_merge_size_value (conf -> audio_buffer_size , prev -> audio_buffer_size ,
@@ -2110,7 +2135,9 @@ ngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)
2110
2135
2111
2136
/* schedule cleanup */
2112
2137
2113
- if (conf -> path .len == 0 || !conf -> cleanup ) {
2138
+ if (conf -> path .len == 0 || !conf -> cleanup ||
2139
+ conf -> type == NGX_RTMP_HLS_TYPE_EVENT )
2140
+ {
2114
2141
return NGX_CONF_OK ;
2115
2142
}
2116
2143
0 commit comments