Commit d96ebc5e authored by Steven Liu's avatar Steven Liu

avformat/hlsenc: deprecate hls_wrap option

When user use the hls_wrap, there have many problem:
1. some platform refersh the old but usefull segment
2. CDN(Content Delivery Network) Deliver HLS not friendly

The hls_wrap is used to wrap segments for use little space,
now user can use hls_list_size and hls_flags delete_segments
instead it.
Reviewed-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
Reviewed-by: 's avatarCarl Eugen Hoyos <ceffmpeg@gmail.com>
Signed-off-by: 's avatarSteven Liu <lq@chinaffmpeg.org>
parent 96ee6da4
...@@ -442,9 +442,8 @@ parameters. Values containing @code{:} special characters must be ...@@ -442,9 +442,8 @@ parameters. Values containing @code{:} special characters must be
escaped. escaped.
@item hls_wrap @var{wrap} @item hls_wrap @var{wrap}
Set the number after which the segment filename number (the number This is a deprecated option, you can use @code {hls_list_size}
specified in each segment file) wraps. If set to 0 the number will be and @code{hls_flags delete_segments} instead it
never wrapped. Default value is 0.
This option is useful to avoid to fill the disk with many segment This option is useful to avoid to fill the disk with many segment
files, and limits the maximum number of segment files written to disk files, and limits the maximum number of segment files written to disk
......
...@@ -101,7 +101,9 @@ typedef struct HLSContext { ...@@ -101,7 +101,9 @@ typedef struct HLSContext {
float time; // Set by a private option. float time; // Set by a private option.
float init_time; // Set by a private option. float init_time; // Set by a private option.
int max_nb_segments; // Set by a private option. int max_nb_segments; // Set by a private option.
#if FF_API_HLS_WRAP
int wrap; // Set by a private option. int wrap; // Set by a private option.
#endif
uint32_t flags; // enum HLSFlags uint32_t flags; // enum HLSFlags
uint32_t pl_type; // enum PlaylistType uint32_t pl_type; // enum PlaylistType
char *segment_filename; char *segment_filename;
...@@ -566,7 +568,11 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double ...@@ -566,7 +568,11 @@ static int hls_append_segment(struct AVFormatContext *s, HLSContext *hls, double
hls->initial_prog_date_time += en->duration; hls->initial_prog_date_time += en->duration;
hls->segments = en->next; hls->segments = en->next;
if (en && hls->flags & HLS_DELETE_SEGMENTS && 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)) {
#endif
en->next = hls->old_segments; en->next = hls->old_segments;
hls->old_segments = en; hls->old_segments = en;
if ((ret = hls_delete_old_segments(hls)) < 0) if ((ret = hls_delete_old_segments(hls)) < 0)
...@@ -834,7 +840,11 @@ static int hls_start(AVFormatContext *s) ...@@ -834,7 +840,11 @@ static int hls_start(AVFormatContext *s)
sizeof(vtt_oc->filename)); sizeof(vtt_oc->filename));
} else if (c->max_seg_size > 0) { } else if (c->max_seg_size > 0) {
if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename), if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename),
#if FF_API_HLS_WRAP
c->basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) { c->basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) {
#else
c->basename, 'd', c->sequence) < 1) {
#endif
av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s', you can try to use -use_localtime 1 with it\n", c->basename); av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s', you can try to use -use_localtime 1 with it\n", c->basename);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
...@@ -853,7 +863,11 @@ static int hls_start(AVFormatContext *s) ...@@ -853,7 +863,11 @@ static int hls_start(AVFormatContext *s)
if (!filename) if (!filename)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename), if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename),
#if FF_API_HLS_WRAP
filename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) { filename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) {
#else
filename, 'd', c->sequence) < 1) {
#endif
av_log(c, AV_LOG_ERROR, av_log(c, AV_LOG_ERROR,
"Invalid second level segment filename template '%s', " "Invalid second level segment filename template '%s', "
"you can try to remove second_level_segment_index flag\n", "you can try to remove second_level_segment_index flag\n",
...@@ -910,13 +924,21 @@ static int hls_start(AVFormatContext *s) ...@@ -910,13 +924,21 @@ static int hls_start(AVFormatContext *s)
av_free(fn_copy); av_free(fn_copy);
} }
} else if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename), } else if (replace_int_data_in_filename(oc->filename, sizeof(oc->filename),
#if FF_API_HLS_WRAP
c->basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) { c->basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) {
#else
c->basename, 'd', c->sequence) < 1) {
#endif
av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s' you can try to use -use_localtime 1 with it\n", c->basename); av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s' you can try to use -use_localtime 1 with it\n", c->basename);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if( c->vtt_basename) { if( c->vtt_basename) {
if (replace_int_data_in_filename(vtt_oc->filename, sizeof(vtt_oc->filename), if (replace_int_data_in_filename(vtt_oc->filename, sizeof(vtt_oc->filename),
#if FF_API_HLS_WRAP
c->vtt_basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) { c->vtt_basename, 'd', c->wrap ? c->sequence % c->wrap : c->sequence) < 1) {
#else
c->vtt_basename, 'd', c->sequence) < 1) {
#endif
av_log(vtt_oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", c->vtt_basename); av_log(vtt_oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", c->vtt_basename);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
...@@ -1421,7 +1443,9 @@ static const AVOption options[] = { ...@@ -1421,7 +1443,9 @@ static const AVOption options[] = {
{"hls_list_size", "set maximum number of playlist entries", OFFSET(max_nb_segments), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E}, {"hls_list_size", "set maximum number of playlist entries", OFFSET(max_nb_segments), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E},
{"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"hls_vtt_options","set hls vtt list of options for the container format used for hls", OFFSET(vtt_format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, {"hls_vtt_options","set hls vtt list of options for the container format used for hls", OFFSET(vtt_format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"hls_wrap", "set number after which the index wraps", OFFSET(wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E}, #if FF_API_HLS_WRAP
{"hls_wrap", "set number after which the index wraps (will be deprecated)", OFFSET(wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E},
#endif
{"hls_allow_cache", "explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments", OFFSET(allowcache), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, E}, {"hls_allow_cache", "explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments", OFFSET(allowcache), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, E},
{"hls_base_url", "url to prepend to each playlist entry", OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, {"hls_base_url", "url to prepend to each playlist entry", OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
{"hls_segment_filename", "filename template for segment files", OFFSET(segment_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, {"hls_segment_filename", "filename template for segment files", OFFSET(segment_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
......
...@@ -85,6 +85,10 @@ ...@@ -85,6 +85,10 @@
#ifndef FF_API_HTTP_USER_AGENT #ifndef FF_API_HTTP_USER_AGENT
#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 58) #define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 58)
#endif #endif
#ifndef FF_API_HLS_WRAP
#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 58)
#endif
#ifndef FF_API_R_FRAME_RATE #ifndef FF_API_R_FRAME_RATE
#define FF_API_R_FRAME_RATE 1 #define FF_API_R_FRAME_RATE 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment