[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