[FFmpeg-devel] [PATCH] hlsenc: intialize only on ref_pkt and drop all packets

Miroslav Slugeň thunder.m at email.cz
Mon Feb 13 09:56:19 EET 2017


Dne 12.2.2017 v 23:35 Michael Niedermayer napsal(a):
> 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
>
>
> [...]
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Otherwise patch is ok? Should i just check that stream is subtitles and 
add exception for it?

M.


More information about the ffmpeg-devel mailing list