[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