Commit 1036a1b8 authored by Marton Balint's avatar Marton Balint

lavf/segment: add support for specifying clock time offset

Reviewed-by: 's avatarStefano Sabatini <stefasab@gmail.com>
Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent b340bd8a
...@@ -1100,6 +1100,16 @@ to create files at 12:00 o'clock, 12:15, 12:30, etc. ...@@ -1100,6 +1100,16 @@ to create files at 12:00 o'clock, 12:15, 12:30, etc.
Default value is "0". Default value is "0".
@item segment_clocktime_offset @var{duration}
Delay the segment splitting times with the specified duration when using
@option{segment_atclocktime}.
For example with @option{segment_time} set to "900" and
@option{segment_clocktime_offset} set to "300" this makes it possible to
create files at 12:05, 12:20, 12:35, etc.
Default value is "0".
@item segment_time_delta @var{delta} @item segment_time_delta @var{delta}
Specify the accuracy time when selecting the start time for a Specify the accuracy time when selecting the start time for a
segment, expressed as a duration specification. Default value is "0". segment, expressed as a duration specification. Default value is "0".
......
...@@ -82,6 +82,7 @@ typedef struct SegmentContext { ...@@ -82,6 +82,7 @@ typedef struct SegmentContext {
int list_size; ///< number of entries for the segment list file int list_size; ///< number of entries for the segment list file
int use_clocktime; ///< flag to cut segments at regular clock time int use_clocktime; ///< flag to cut segments at regular clock time
int64_t clocktime_offset; //< clock offset for cutting the segments at regular clock time
int64_t last_val; ///< remember last time for wrap around detection int64_t last_val; ///< remember last time for wrap around detection
int64_t last_cut; ///< remember last cut int64_t last_cut; ///< remember last cut
int cut_pending; int cut_pending;
...@@ -633,6 +634,13 @@ static int seg_write_header(AVFormatContext *s) ...@@ -633,6 +634,13 @@ static int seg_write_header(AVFormatContext *s)
seg->time_str); seg->time_str);
return ret; return ret;
} }
if (seg->use_clocktime) {
if (seg->time <= 0) {
av_log(s, AV_LOG_ERROR, "Invalid negative segment_time with segment_atclocktime option set\n");
return AVERROR(EINVAL);
}
seg->clocktime_offset = seg->time - (seg->clocktime_offset % seg->time);
}
} }
if (seg->format_options_str) { if (seg->format_options_str) {
...@@ -775,7 +783,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -775,7 +783,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
time_t sec = avgt / 1000000; time_t sec = avgt / 1000000;
localtime_r(&sec, &ti); localtime_r(&sec, &ti);
usecs = (int64_t)(ti.tm_hour * 3600 + ti.tm_min * 60 + ti.tm_sec) * 1000000 + (avgt % 1000000); usecs = (int64_t)(ti.tm_hour * 3600 + ti.tm_min * 60 + ti.tm_sec) * 1000000 + (avgt % 1000000);
wrapped_val = usecs % seg->time; wrapped_val = (usecs + seg->clocktime_offset) % seg->time;
if (seg->last_cut != usecs && wrapped_val < seg->last_val) { if (seg->last_cut != usecs && wrapped_val < seg->last_val) {
seg->cut_pending = 1; seg->cut_pending = 1;
seg->last_cut = usecs; seg->last_cut = usecs;
...@@ -926,6 +934,7 @@ static const AVOption options[] = { ...@@ -926,6 +934,7 @@ static const AVOption options[] = {
{ "hls", "Apple HTTP Live Streaming compatible", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_M3U8 }, INT_MIN, INT_MAX, E, "list_type" }, { "hls", "Apple HTTP Live Streaming compatible", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_M3U8 }, INT_MIN, INT_MAX, E, "list_type" },
{ "segment_atclocktime", "set segment to be cut at clocktime", OFFSET(use_clocktime), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E}, { "segment_atclocktime", "set segment to be cut at clocktime", OFFSET(use_clocktime), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E},
{ "segment_clocktime_offset", "set segment clocktime offset", OFFSET(clocktime_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 86400000000LL, E},
{ "segment_time", "set segment duration", OFFSET(time_str),AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E }, { "segment_time", "set segment duration", OFFSET(time_str),AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
{ "segment_time_delta","set approximation value used for the segment times", OFFSET(time_delta), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 0, E }, { "segment_time_delta","set approximation value used for the segment times", OFFSET(time_delta), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 0, E },
{ "segment_times", "set segment split time points", OFFSET(times_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E }, { "segment_times", "set segment split time points", OFFSET(times_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
......
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