[FFmpeg-devel] [PATCH] hlsenc: intialize only on ref_pkt and drop all packets
Michael Niedermayer
michael at niedermayer.cc
Mon Feb 13 00:35:31 EET 2017
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 <thunder.m at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170212/812a3fcb/attachment.sig>
More information about the ffmpeg-devel
mailing list