[FFmpeg-devel] [PATCH] avformat/hlsenc: add support for microseconds since epoch based sequence number
Marton Balint
cus at passwd.hu
Wed Apr 29 19:29:10 EEST 2020
On Sat, 18 Apr 2020, Marton Balint wrote:
> Sequence numbers of segments should be unique, if an encoder is using shorter
> than 1 second segments and it is restarted, then future segments will be using
> already used sequence numbers if initial sequence number is based on the number
> of seconds since epoch and not microseconds.
Ping.
Thanks,
Marton
>
> Signed-off-by: Marton Balint <cus at passwd.hu>
> ---
> doc/muxers.texi | 3 +++
> libavformat/hlsenc.c | 13 ++++++++++---
> libavformat/version.h | 2 +-
> 3 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/doc/muxers.texi b/doc/muxers.texi
> index e5b8debcb3..cf1c9a8622 100644
> --- a/doc/muxers.texi
> +++ b/doc/muxers.texi
> @@ -640,6 +640,9 @@ Set the starting sequence numbers according to @var{start_number} option value.
> @item epoch
> The start number will be the seconds since epoch (1970-01-01 00:00:00)
>
> + at item epoch_us
> +The start number will be the microseconds since epoch (1970-01-01 00:00:00)
> +
> @item datetime
> The start number will be based on the current date/time as YYYYmmddHHMMSS. e.g. 20161231235759.
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index d75684741f..008a3f3947 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -41,6 +41,7 @@
> #include "libavutil/random_seed.h"
> #include "libavutil/opt.h"
> #include "libavutil/log.h"
> +#include "libavutil/time.h"
> #include "libavutil/time_internal.h"
>
> #include "avformat.h"
> @@ -56,6 +57,8 @@ typedef enum {
> HLS_START_SEQUENCE_AS_START_NUMBER = 0,
> HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH = 1,
> HLS_START_SEQUENCE_AS_FORMATTED_DATETIME = 2, // YYYYMMDDhhmmss
> + HLS_START_SEQUENCE_AS_MICROSECONDS_SINCE_EPOCH = 3,
> + HLS_START_SEQUENCE_LAST, // unused
> } StartSequenceSourceType;
>
> typedef enum {
> @@ -2788,9 +2791,12 @@ static int hls_init(AVFormatContext *s)
> pattern = "%d.m4s";
> }
> if ((hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH) ||
> + (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_MICROSECONDS_SINCE_EPOCH) ||
> (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_FORMATTED_DATETIME)) {
> - time_t t = time(NULL); // we will need it in either case
> - if (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH) {
> + time_t t = time(NULL);
> + if (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_MICROSECONDS_SINCE_EPOCH) {
> + hls->start_sequence = av_gettime();
> + } else if (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH) {
> hls->start_sequence = (int64_t)t;
> } else if (hls->start_sequence_source_type == HLS_START_SEQUENCE_AS_FORMATTED_DATETIME) {
> char b[15];
> @@ -3083,9 +3089,10 @@ static const AVOption options[] = {
> {"event", "EVENT playlist", 0, AV_OPT_TYPE_CONST, {.i64 = PLAYLIST_TYPE_EVENT }, INT_MIN, INT_MAX, E, "pl_type" },
> {"vod", "VOD playlist", 0, AV_OPT_TYPE_CONST, {.i64 = PLAYLIST_TYPE_VOD }, INT_MIN, INT_MAX, E, "pl_type" },
> {"method", "set the HTTP method(default: PUT)", OFFSET(method), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
> - {"hls_start_number_source", "set source of first number in sequence", OFFSET(start_sequence_source_type), AV_OPT_TYPE_INT, {.i64 = HLS_START_SEQUENCE_AS_START_NUMBER }, 0, HLS_START_SEQUENCE_AS_FORMATTED_DATETIME, E, "start_sequence_source_type" },
> + {"hls_start_number_source", "set source of first number in sequence", OFFSET(start_sequence_source_type), AV_OPT_TYPE_INT, {.i64 = HLS_START_SEQUENCE_AS_START_NUMBER }, 0, HLS_START_SEQUENCE_LAST-1, E, "start_sequence_source_type" },
> {"generic", "start_number value (default)", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_START_SEQUENCE_AS_START_NUMBER }, INT_MIN, INT_MAX, E, "start_sequence_source_type" },
> {"epoch", "seconds since epoch", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH }, INT_MIN, INT_MAX, E, "start_sequence_source_type" },
> + {"epoch_us", "microseconds since epoch", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_START_SEQUENCE_AS_MICROSECONDS_SINCE_EPOCH }, INT_MIN, INT_MAX, E, "start_sequence_source_type" },
> {"datetime", "current datetime as YYYYMMDDhhmmss", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_START_SEQUENCE_AS_FORMATTED_DATETIME }, INT_MIN, INT_MAX, E, "start_sequence_source_type" },
> {"http_user_agent", "override User-Agent field in HTTP header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
> {"var_stream_map", "Variant stream map string", OFFSET(var_stream_map), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 18c2f5fec2..719cda6b98 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -33,7 +33,7 @@
> // Also please add any ticket numbers that you believe might be affected here
> #define LIBAVFORMAT_VERSION_MAJOR 58
> #define LIBAVFORMAT_VERSION_MINOR 42
> -#define LIBAVFORMAT_VERSION_MICRO 100
> +#define LIBAVFORMAT_VERSION_MICRO 101
>
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> LIBAVFORMAT_VERSION_MINOR, \
> --
> 2.16.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list