[FFmpeg-devel] [PATCH] libavformat/hlsenc: add AVFMT_VARIABLE_FPS flag to mimic mpegtsenc

Aman Gupta ffmpeg at tmm1.net
Fri Dec 8 02:14:40 EET 2017


From: Aman Gupta <aman at tmm1.net>

Previously, using a filter that changed frame_rate/time_base would work
as expected with mpegtsenc, but duplicate frames when used with hlsenc
(which uses mpegtsenc underneath).

For instance, using https://tmm1.s3.amazonaws.com/720p.ts:

    $ ffmpeg -i 720p.ts -c:v libx264 -an -filter:v "yadif=mode=send_field:deint=interlaced" -f mpegts -y single.ts
    $ ffmpeg -i 720p.ts -c:v libx264 -an -filter:v "yadif=mode=send_field:deint=interlaced" -f hls -hls_time 30 -y segment.m3u8

One would expect single.ts and segment0.ts to be identical, however comparing them shows:

    single.ts:   120 fps,  59.94 tbr, 90k tbn, 239.76 tbc
    segment0.ts: 120 fps, 119.88 tbr, 90k tbn, 239.76 tbc

Without AVFMT_VARIABLE_FPS set, ffmpeg.c was duplicating frames in the hlsenc
case and generating segments with double the r_frame_rate.

After this commit, the two muxers generate identical output.
---
 libavformat/hlsenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 7dc8f4237b..d256498244 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -2335,7 +2335,7 @@ AVOutputFormat ff_hls_muxer = {
     .audio_codec    = AV_CODEC_ID_AAC,
     .video_codec    = AV_CODEC_ID_H264,
     .subtitle_codec = AV_CODEC_ID_WEBVTT,
-    .flags          = AVFMT_NOFILE | AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH,
+    .flags          = AVFMT_NOFILE | AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | AVFMT_ALLOW_FLUSH,
     .write_header   = hls_write_header,
     .write_packet   = hls_write_packet,
     .write_trailer  = hls_write_trailer,
-- 
2.14.2



More information about the ffmpeg-devel mailing list