On Sun, Feb 12, 2017 at 07:31:43PM +0100, Miroslav Slugeň wrote: > 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ň > > > > > > > > > >
> hlsenc.c | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) > 7f784939c938c7697be2178647828a36815fc731 > 0001-hlsenc-intialize-only-on-ref_pkt-and-drop-all-packet.patch > 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; > + } This triggers for subtitle streams, for example: ./ffmpeg -i matrixbench_mpeg2.mpg -i fate-suite/sub/MovText_capability_tester.mp4 -f hls -hls_segment_filename /tmp/file.%d.ts -t 10 /tmp/file.m3u8 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB You can kill me, but you cannot change the truth.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel