From patchwork Fri Sep 18 01:53:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 22464 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E58EF4481E6 for ; Fri, 18 Sep 2020 04:53:43 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C4E2768BAB9; Fri, 18 Sep 2020 04:53:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpproxy21.qq.com (smtpbg704.qq.com [203.205.195.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9B0D68B607 for ; Fri, 18 Sep 2020 04:53:36 +0300 (EEST) X-QQ-mid: bizesmtp4t1600394010t0rm21es2 Received: from localhost (unknown [103.107.216.230]) by esmtp6.qq.com (ESMTP) with id ; Fri, 18 Sep 2020 09:53:29 +0800 (CST) X-QQ-SSF: 01100000002000Z0Z000B00A0000000 X-QQ-FEAT: rbnskG11UlBQg9MKsRhARV71OKcdtg54d//ETxNF3Nh4bghrQiIB4hS6e9zL/ MhPLImknRgOquzPUfx+Mov90vPtLeoGTY08iRbomIsv4LzmG0MjymnDur5yLCuXErPv7lJF kJ+XeZzJH50GZMLB6slK+fXo/281eyDK98kINd2mJbK8LBn/Zp0EfZUJ0SDdIcpTroW/DH/ Dy87YR4YHlQU5lgqudcXycrJTN3e/P5Mxmq3x1DBXdI0FmbxYjro4kqwnFj+2OeEkQb4Oa8 qQpNoFcuGnyXb8Ij8Awo8Z0CX6IalLpfUgXQ== X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 18 Sep 2020 09:53:27 +0800 Message-Id: <20200918015327.63915-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybgforeign:qybgforeign5 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [PATCH] avformat/hlsenc: compute video_keyframe_size after write keyframe 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: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" fix ticket: 8636 When write keyframe and the keyframe is the frist packet of the segment, then compute the size of the keyframe which have been write into segment first packet. and set the start position of the segment, should not use avio_tell(vs->out) to get the keyframe position, because it can be set to 0 if close at above of the workflow, that maybe inaccurate, but the start_pos can be used here, because start_pos is set after write the previous packet. Signed-off-by: Steven Liu --- libavformat/hlsenc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index cb31d6aed7..8687d7c12c 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -2572,13 +2572,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) vs->packets_written++; if (oc->pb) { + int64_t keyframe_pre_pos = avio_tell(oc->pb); ret = ff_write_chained(oc, stream_index, pkt, s, 0); - vs->video_keyframe_size += pkt->size; - if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && (pkt->flags & AV_PKT_FLAG_KEY)) { - vs->video_keyframe_size = avio_tell(oc->pb); - } else { - vs->video_keyframe_pos = avio_tell(vs->out); + if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && + (pkt->flags & AV_PKT_FLAG_KEY) && !keyframe_pre_pos) { + av_write_frame(oc, NULL); /* Flush any buffered data */ + vs->video_keyframe_size = avio_tell(oc->pb) - keyframe_pre_pos; } + vs->video_keyframe_pos = vs->start_pos; if (hls->ignore_io_errors) ret = 0; }