[FFmpeg-devel] [PATCH] avformat/hlsenc: implement initial_offset

Steven Liu lingjiujianke at gmail.com
Thu Sep 8 05:27:43 EEST 2016


2016-09-08 9:47 GMT+08:00 Aman Gupta <ffmpeg at tmm1.net>:

> From: Aman Gupta <aman at tmm1.net>
>
> ---
>  doc/muxers.texi      |  4 ++++
>  libavformat/hlsenc.c | 13 +++++++++++--
>  2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/doc/muxers.texi b/doc/muxers.texi
> index fd7ee50..e88dbf8 100644
> --- a/doc/muxers.texi
> +++ b/doc/muxers.texi
> @@ -389,6 +389,10 @@ to @var{wrap}.
>  Start the playlist sequence number from @var{number}. Default value is
>  0.
>
> + at item initial_offset @var{offset}
> +Specify timestamp offset to apply to the output packet timestamps. The
> +argument must be a time duration specification, and defaults to 0.
> +
>  @item hls_allow_cache @var{allowcache}
>  Explicitly set whether the client MAY (1) or MUST NOT (0) cache media
> segments.
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index 1846d9d..be58db8 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -90,6 +90,7 @@ typedef struct HLSContext {
>      uint32_t pl_type;      // enum PlaylistType
>      char *segment_filename;
>
> +    int64_t initial_offset; ///< initial timestamps offset, expressed in
> microseconds
>      int use_localtime;      ///< flag to expand filename with localtime
>      int use_localtime_mkdir;///< flag to mkdir dirname in timebased
> filename
>      int allowcache;
> @@ -795,7 +796,7 @@ static int hls_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>      HLSContext *hls = s->priv_data;
>      AVFormatContext *oc = NULL;
>      AVStream *st = s->streams[pkt->stream_index];
> -    int64_t end_pts = hls->recording_time * hls->number;
> +    int64_t end_pts = hls->recording_time * hls->number, offset;
>      int is_ref_pkt = 1;
>      int ret, can_split = 1;
>      int stream_index = 0;
> @@ -871,7 +872,14 @@ static int hls_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>              return ret;
>      }
>
> -    ret = ff_write_chained(oc, stream_index, pkt, s, 0);
> +    /* compute new timestamps */
> +    offset = av_rescale_q(hls->initial_offset, AV_TIME_BASE_Q,
> st->time_base);
> +    if (pkt->pts != AV_NOPTS_VALUE)
> +        pkt->pts += offset;
> +    if (pkt->dts != AV_NOPTS_VALUE)
> +        pkt->dts += offset;
> +
> +    ret = ff_write_chained(oc, stream_index, pkt, s, hls->initial_offset
> ? 1 : 0);
>
>      return ret;
>  }
> @@ -939,6 +947,7 @@ 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", OFFSET(method), AV_OPT_TYPE_STRING,
> {.str = NULL},  0, 0,    E},
> +    {"initial_offset", "set initial timestamp offset",
> OFFSET(initial_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, -INT64_MAX,
> INT64_MAX, E },
>
>      { NULL },
>  };
> --
> 2.8.1
>
>
LGTM


More information about the ffmpeg-devel mailing list