From patchwork Thu Sep 8 01:47:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 473 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp595267vsd; Wed, 7 Sep 2016 19:05:51 -0700 (PDT) X-Received: by 10.28.28.70 with SMTP id c67mr6701642wmc.8.1473300351455; Wed, 07 Sep 2016 19:05:51 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 204si6448360wmj.131.2016.09.07.19.05.49; Wed, 07 Sep 2016 19:05:51 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@tmm1-net.20150623.gappssmtp.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A2E5368A1A1; Thu, 8 Sep 2016 05:05:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pa0-f65.google.com (mail-pa0-f65.google.com [209.85.220.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D299168A000 for ; Thu, 8 Sep 2016 05:05:30 +0300 (EEST) Received: by mail-pa0-f65.google.com with SMTP id h5so1685153pao.0 for ; Wed, 07 Sep 2016 19:05:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tmm1-net.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id; bh=USLVRGl1f+PmYJrcqGx/iOAnTn7q/mZ2aORlS0IU+20=; b=oMQm4X8sKTMgum5BuDQ3ajtDZjKWVRd/eHpOFmMDK771s5hqxmVISy1JjRjb7CZ5ym QSSRELzHsCSzjPiW2F6sEXmWT+dNS1ollpXljdguFq68PDAdckJIlOZJGgMvaRNTFr86 gXpLjn6ZtEtLXTV0MHTk3DPAfg7b69tHLP3YshywgNZ4xfhLwfTwi/Aw/GE5MYOsN+Nt Sp0JQZYrM8klRyG4M9khqqkVcpgsBAofq19y0jmmqmVb2akj9EunLhwYaJdjozJPuQxw kQwvpLVWCredQQjY1QFRcT41Tz3G+GrB1//sVcLy3Sf1Kn+kTW/GdEXXO8I+CzQ5nIvH B6pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=USLVRGl1f+PmYJrcqGx/iOAnTn7q/mZ2aORlS0IU+20=; b=h5OcMLlfFx7r/YUe0rnVNzvQmrsU55F2owtq4Z85CCvke/bTKZkcegCZmVw+Ws8lyp w8MMHrF97i4MSSMjFY3ZvNolN9/AWEsWToYgK+zbRxdPxLEqowtlN/2Iwv6p8ulm6u6V +qRixm2JvrpHVLHzleEfcw9nZ9J5+pBXznmfsDhMnTm8VJO2NSHSLu1LvpiB4FWPXwSJ +lHWa4ULOc/AuILj8oTpln0pbVXiKZUYHYCZFz9v4lp0hLGOrJDKnZYsisOvvw2Z2Zft li0lu4RrnNlgP+W5T8ZunzjYwvCsT3IhAFEsO4tZs8Sg2Hoo1wjOThywAcE+9FAyp1HS IaRA== X-Gm-Message-State: AE9vXwO5ScVhLQ7s7suFo03dvkQtmfxUZcs2LT5Qqmml4HWAMTzSOhJRgadi+mgiTDzBcg== X-Received: by 10.66.7.8 with SMTP id f8mr39232066paa.91.1473299275029; Wed, 07 Sep 2016 18:47:55 -0700 (PDT) Received: from localhost.localdomain (p693245-ipngn200506kyoto.kyoto.ocn.ne.jp. [114.171.178.245]) by smtp.gmail.com with ESMTPSA id t17sm42413943pfi.17.2016.09.07.18.47.53 (version=TLS1 cipher=AES128-SHA bits=128/128); Wed, 07 Sep 2016 18:47:54 -0700 (PDT) From: Aman Gupta To: ffmpeg-devel@ffmpeg.org Date: Thu, 8 Sep 2016 10:47:42 +0900 Message-Id: <1473299262-17974-1-git-send-email-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.8.1 Subject: [FFmpeg-devel] [PATCH] avformat/hlsenc: implement initial_offset X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Aman Gupta MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Gupta --- 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. +@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 }, };