From patchwork Tue Jan 10 20:40:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 2178 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp445950vsb; Tue, 10 Jan 2017 12:41:01 -0800 (PST) X-Received: by 10.28.52.201 with SMTP id b192mr2863185wma.118.1484080861186; Tue, 10 Jan 2017 12:41:01 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id gk8si2581639wjb.257.2017.01.10.12.41.00; Tue, 10 Jan 2017 12:41:01 -0800 (PST) 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=@gmail.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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BF99868A5EA; Tue, 10 Jan 2017 22:40:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C319668A5CD for ; Tue, 10 Jan 2017 22:40:43 +0200 (EET) Received: by mail-wm0-f67.google.com with SMTP id l2so32573483wml.2 for ; Tue, 10 Jan 2017 12:40:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=259KFCL9V8RH2TyZD6YrsffxxrEek4FFcXtH2pXSocM=; b=T9+Y03u3LynNZqLvYuZiB0ARGJQBwq3WcGqm09ndn5rvBI54NKbmrdOKx4i5k/4uaS sPtJ3ssq/DYNkBMpNgtNCvVhzF5uTEa81XkxYljqlQd2DUebZzB8sMTDEdH/nwXI+s/E xMEYBoRt59zzdOxOkAQc+JbjPlxDXLruKUdGJUG08yKt6fEnTigwME+D0/ejHLavyful WAy+iiaBh7ukzRapg3AAeK7X6SjaTWRarmny+st/R7lreH70h/0RgwGAqLnDxi8OpJVv GpWg4CxVVFiYNGtfcjKvJC94QzOvJwiIy0hMUO0wY9Ubd1T/4ETjAH1KwYDE7LHFCbqy gZhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=259KFCL9V8RH2TyZD6YrsffxxrEek4FFcXtH2pXSocM=; b=TwWcvJ5xRMbVnbY6ZHTgH67aclo5OpdUdOj+x8I1yQmE+6Lw4eGP8MU3dvKWR23KIQ QBEarojytUlSTMix3ww47xeAzMYStUisiTIn+F0z58u9ql+bwN/HG9rIqnLBKdMWELPb j92kXnLfuEJsG6aYz/t+CtPhg4Hz5GiioWLa3p9Nq0O+PKdDf9CBA8dbDnEJ3857UwN1 vcx5w+wnAlzR+ovzH8tGS3UOTsfxh1LA9Zry1TzwZ6J/m73IiGRz1PNaRk1RfuEJmrkB O2LdiowFj3LqOBXusM//SHBWY+UGpN53ciRq9iflXAmXOPsLxrS3YR90/8agstgZ3Lu8 zRDQ== X-Gm-Message-State: AIkVDXKciJ/Smnl1eULZDqCYwTyzcr9X3umBLNN/m1XQTZO2Q0rGmbNPIb+xFQGHzpPAhrVCZO8kPFmvyydR0Q== X-Received: by 10.223.169.112 with SMTP id u103mr3098025wrc.166.1484080850837; Tue, 10 Jan 2017 12:40:50 -0800 (PST) MIME-Version: 1.0 Received: by 10.194.171.106 with HTTP; Tue, 10 Jan 2017 12:40:49 -0800 (PST) In-Reply-To: References: <20170109170604.26801-1-lq@chinaffmpeg.org> From: Steven Liu Date: Wed, 11 Jan 2017 04:40:49 +0800 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: Re: [FFmpeg-devel] [PATCH] avformat/hlsenc: fix hls start and tail segment duration problem 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 2017-01-10 8:05 GMT+08:00 Steven Liu : > > > 2017-01-10 1:06 GMT+08:00 Steven Liu : > >> fix ticket: #6067 >> >> Signed-off-by: Steven Liu >> --- >> libavformat/hlsenc.c | 16 ++++++++++++---- >> 1 file changed, 12 insertions(+), 4 deletions(-) >> >> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c >> index eeb450a..0fcb699 100644 >> --- a/libavformat/hlsenc.c >> +++ b/libavformat/hlsenc.c >> @@ -103,6 +103,7 @@ typedef struct HLSContext { >> int64_t recording_time; >> int has_video; >> int has_subtitle; >> + double dpp; // duration per packet >> int64_t start_pts; >> int64_t end_pts; >> double duration; // last segment duration computed so far, in >> seconds >> @@ -1216,10 +1217,16 @@ static int hls_write_packet(AVFormatContext *s, >> AVPacket *pkt) >> if (pkt->pts == AV_NOPTS_VALUE) >> is_ref_pkt = can_split = 0; >> >> - if (is_ref_pkt) >> - hls->duration = (double)(pkt->pts - hls->end_pts) >> - * st->time_base.num / >> st->time_base.den; >> + if (is_ref_pkt) { >> + if (!hls->start_pos) { >> + hls->duration = (double)(pkt->pts - hls->end_pts) >> + * st->time_base.num / >> st->time_base.den; >> + hls->dpp = (double)(pkt->duration) * st->time_base.num / >> st->time_base.den; >> + } else { >> + hls->duration += (double)(pkt->duration) * st->time_base.num >> / st->time_base.den; >> + } >> >> + } >> if (can_split && av_compare_ts(pkt->pts - hls->start_pts, >> st->time_base, >> end_pts, AV_TIME_BASE_Q) >= 0) { >> int64_t new_start_pos; >> @@ -1289,7 +1296,8 @@ static int hls_write_trailer(struct AVFormatContext >> *s) >> if (oc->pb) { >> hls->size = avio_tell(hls->avf->pb) - hls->start_pos; >> ff_format_io_close(s, &oc->pb); >> - hls_append_segment(s, hls, hls->duration, hls->start_pos, >> hls->size); >> + /* after av_write_trailer, then duration + 1 duration per packet >> */ >> + hls_append_segment(s, hls, hls->duration + hls->dpp, >> hls->start_pos, hls->size); >> } >> >> if (vtt_oc) { >> -- >> 2.10.1.382.ga23ca1b.dirty >> >> >> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > > update patch. > > fix ticket: #6067 Tested-by: Pero Signed-off-by: Steven Liu --- libavformat/hlsenc.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) seconds @@ -418,6 +420,7 @@ static int hls_mux_init(AVFormatContext *s) st->time_base = s->streams[i]->time_base; } hls->start_pos = 0; + hls->new_start = 1; return 0; } @@ -1216,10 +1219,18 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) if (pkt->pts == AV_NOPTS_VALUE) is_ref_pkt = can_split = 0; - if (is_ref_pkt) - hls->duration = (double)(pkt->pts - hls->end_pts) - * st->time_base.num / st->time_base.den; + if (is_ref_pkt) { + if (hls->new_start) { + hls->new_start = 0; + hls->duration = (double)(pkt->pts - hls->end_pts) + * st->time_base.num / st->time_base.den; + hls->dpp = (double)(pkt->duration) * st->time_base.num / st->time_base.den; + av_log(s, AV_LOG_ERROR, "hls->dpp = [%lf]\n", hls->dpp); + } else { + hls->duration += (double)(pkt->duration) * st->time_base.num / st->time_base.den; + } + } if (can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base, end_pts, AV_TIME_BASE_Q) >= 0) { int64_t new_start_pos; @@ -1289,7 +1300,8 @@ static int hls_write_trailer(struct AVFormatContext *s) if (oc->pb) { hls->size = avio_tell(hls->avf->pb) - hls->start_pos; ff_format_io_close(s, &oc->pb); - hls_append_segment(s, hls, hls->duration, hls->start_pos, hls->size); + /* after av_write_trailer, then duration + 1 duration per packet */ + hls_append_segment(s, hls, hls->duration + hls->dpp, hls->start_pos, hls->size); } if (vtt_oc) { diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index eeb450a..3d2d41a 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -103,6 +103,8 @@ typedef struct HLSContext { int64_t recording_time; int has_video; int has_subtitle; + int new_start; + double dpp; // duration per packet int64_t start_pts; int64_t end_pts; double duration; // last segment duration computed so far, in