This patch will fix cutting hls segments into exactly same length.
Because it will intialize only on first ref_packet, which is video
frame, not audio frame (old behavior)
It will also drop all packets without PTS, drop all packets before
initialization and drop all packets before first intialization packet PTS.
Now it should be possible to create segments at exactly same length if
we use new -force_key_frames hls:time_in_seconds parameter.
This is required to support adaptive HLS.
--
Miroslav Slugeň
>From a59a7dbe6fdcab64c1402adb8f11cc31400f4516 Mon Sep 17 00:00:00 2001
From: Miroslav Slugen <thunde...@email.cz>
Date: Sun, 12 Feb 2017 19:25:54 +0100
Subject: [PATCH 1/1] hlsenc: intialize only on ref_pkt and drop all packets
before initialized
---
libavformat/hlsenc.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index ad5205a..226dd89 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -1278,10 +1278,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
oc = hls->avf;
stream_index = pkt->stream_index;
}
- if (hls->start_pts == AV_NOPTS_VALUE) {
- hls->start_pts = pkt->pts;
- hls->end_pts = pkt->pts;
- }
if (hls->has_video) {
can_split = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
@@ -1292,6 +1288,11 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
is_ref_pkt = can_split = 0;
if (is_ref_pkt) {
+ if (hls->start_pts == AV_NOPTS_VALUE) {
+ hls->start_pts = pkt->pts;
+ hls->end_pts = pkt->pts;
+ }
+
if (hls->new_start) {
hls->new_start = 0;
hls->duration = (double)(pkt->pts - hls->end_pts)
@@ -1371,6 +1372,21 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
}
}
+ if (pkt->pts == AV_NOPTS_VALUE) {
+ av_log(s, AV_LOG_WARNING, "packet has no PTS, dropping packet from stream: %d\n", pkt->stream_index);
+ return 0;
+ }
+
+ if (hls->start_pts == AV_NOPTS_VALUE) {
+ av_log(s, AV_LOG_WARNING, "stream not initialized yet, dropping packet from stream: %d\n", pkt->stream_index);
+ return 0;
+ }
+
+ if (pkt->pts + pkt->duration <= hls->start_pts) {
+ av_log(s, AV_LOG_WARNING, "packet has PTS < START PTS (%"PRId64" < %"PRId64"), dropping packet from stream: %d\n", pkt->pts, hls->start_pts, pkt->stream_index);
+ return 0;
+ }
+
ret = ff_write_chained(oc, stream_index, pkt, s, 0);
return ret;
--
2.1.4
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel