avformat/hlsenc: use AV_OPT_TYPE_DURATION

Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
pull/371/head
Limin Wang 4 years ago
parent 3c41d0bfd6
commit 38caef3876
  1. 15
      doc/muxers.texi
  2. 18
      libavformat/hlsenc.c

@ -609,14 +609,21 @@ segmentation.
This muxer supports the following options: This muxer supports the following options:
@table @option @table @option
@item hls_init_time @var{seconds} @item hls_init_time @var{duration}
Set the initial target segment length in seconds. Default value is @var{0}. Set the initial target segment length. Default value is @var{0}.
@var{duration} must be a time duration specification,
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
Segment will be cut on the next key frame after this time has passed on the first m3u8 list. Segment will be cut on the next key frame after this time has passed on the first m3u8 list.
After the initial playlist is filled @command{ffmpeg} will cut segments After the initial playlist is filled @command{ffmpeg} will cut segments
at duration equal to @code{hls_time} at duration equal to @code{hls_time}
@item hls_time @var{seconds} @item hls_time @var{duration}
Set the target segment length in seconds. Default value is 2. Set the target segment length. Default value is 2.
@var{duration} must be a time duration specification,
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
Segment will be cut on the next key frame after this time has passed. Segment will be cut on the next key frame after this time has passed.
@item hls_list_size @var{size} @item hls_list_size @var{size}

@ -196,8 +196,8 @@ typedef struct HLSContext {
int64_t start_sequence; int64_t start_sequence;
uint32_t start_sequence_source_type; // enum StartSequenceSourceType uint32_t start_sequence_source_type; // enum StartSequenceSourceType
float time; // Set by a private option. int64_t time; // Set by a private option.
float init_time; // Set by a private option. int64_t 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.
int hls_delete_threshold; // Set by a private option. int hls_delete_threshold; // Set by a private option.
#if FF_API_HLS_WRAP #if FF_API_HLS_WRAP
@ -2458,9 +2458,9 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) { if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) {
/* reset end_pts, hls->recording_time at end of the init hls list */ /* reset end_pts, hls->recording_time at end of the init hls list */
int64_t init_list_dur = hls->init_time * vs->nb_entries * AV_TIME_BASE; int64_t init_list_dur = hls->init_time * vs->nb_entries;
int64_t after_init_list_dur = (vs->sequence - hls->start_sequence - vs->nb_entries) * (hls->time * AV_TIME_BASE); int64_t after_init_list_dur = (vs->sequence - hls->start_sequence - vs->nb_entries) * hls->time;
hls->recording_time = hls->time * AV_TIME_BASE; hls->recording_time = hls->time;
end_pts = init_list_dur + after_init_list_dur ; end_pts = init_list_dur + after_init_list_dur ;
} }
@ -2945,7 +2945,7 @@ static int hls_init(AVFormatContext *s)
av_log(hls, AV_LOG_DEBUG, "start_number evaluated to %"PRId64"\n", hls->start_sequence); av_log(hls, AV_LOG_DEBUG, "start_number evaluated to %"PRId64"\n", hls->start_sequence);
} }
hls->recording_time = (hls->init_time ? hls->init_time : hls->time) * AV_TIME_BASE; hls->recording_time = hls->init_time ? hls->init_time : hls->time;
if (hls->flags & HLS_SPLIT_BY_TIME && hls->flags & HLS_INDEPENDENT_SEGMENTS) { if (hls->flags & HLS_SPLIT_BY_TIME && hls->flags & HLS_INDEPENDENT_SEGMENTS) {
// Independent segments cannot be guaranteed when splitting by time // Independent segments cannot be guaranteed when splitting by time
@ -3098,7 +3098,7 @@ static int hls_init(AVFormatContext *s)
av_log(s, AV_LOG_WARNING, "append_list mode does not support hls_init_time," av_log(s, AV_LOG_WARNING, "append_list mode does not support hls_init_time,"
" hls_init_time value will have no effect\n"); " hls_init_time value will have no effect\n");
hls->init_time = 0; hls->init_time = 0;
hls->recording_time = hls->time * AV_TIME_BASE; hls->recording_time = hls->time;
} }
} }
@ -3114,8 +3114,8 @@ static int hls_init(AVFormatContext *s)
#define E AV_OPT_FLAG_ENCODING_PARAM #define E AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = { static const AVOption options[] = {
{"start_number", "set first number in the sequence", OFFSET(start_sequence),AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, E}, {"start_number", "set first number in the sequence", OFFSET(start_sequence),AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX, E},
{"hls_time", "set segment length in seconds", OFFSET(time), AV_OPT_TYPE_FLOAT, {.dbl = 2}, 0, FLT_MAX, E}, {"hls_time", "set segment length", OFFSET(time), AV_OPT_TYPE_DURATION, {.i64 = 2000000}, 0, INT64_MAX, E},
{"hls_init_time", "set segment length in seconds at init list", OFFSET(init_time), AV_OPT_TYPE_FLOAT, {.dbl = 0}, 0, FLT_MAX, E}, {"hls_init_time", "set segment length at init list", OFFSET(init_time), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_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_list_size", "set maximum number of playlist entries", OFFSET(max_nb_segments), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E},
{"hls_delete_threshold", "set number of unreferenced segments to keep before deleting", OFFSET(hls_delete_threshold), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, E}, {"hls_delete_threshold", "set number of unreferenced segments to keep before deleting", OFFSET(hls_delete_threshold), AV_OPT_TYPE_INT, {.i64 = 1}, 1, INT_MAX, E},
{"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, E}, {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, E},

Loading…
Cancel
Save