summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Liu <lq@chinaffmpeg.org>2020-09-18 09:53:27 +0800
committerliuqi05 <liuqi05@kuaishou.com>2020-10-20 11:41:44 +0800
commitb5ca8f2c66954614d81579082025f580efc0cffc (patch)
tree4bd8f68d598dc48e558124282cf63642015710fd
parent1ee52b2b6c1f6c9618e435b5ed7608442308efe6 (diff)
avformat/hlsenc: compute video_keyframe_size after write keyframe
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 <lq@chinaffmpeg.org> Signed-off-by: liuqi05 <liuqi05@kuaishou.com>
-rw-r--r--libavformat/hlsenc.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 4471858222..f7eb2411b0 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;
}