[FFmpeg-devel] avformat/hlsplaylist: Support FRAME-RATE attribute
Arzet Ro
arzeth0 at gmail.com
Sun Aug 15 18:07:11 EEST 2021
https://datatracker.ietf.org/doc/html/rfc8216#page-31
Signed-off-by: Arzet Ro <arzeth0 at gmail.com>
---
libavformat/hlsplaylist.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c
index 0e1dcc087f..c3ec86f2ab 100644
--- a/libavformat/hlsplaylist.c
+++ b/libavformat/hlsplaylist.c
@@ -81,9 +81,32 @@ void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth,
}
avio_printf(out, "#EXT-X-STREAM-INF:BANDWIDTH=%d", bandwidth);
- if (st && st->codecpar->width > 0 && st->codecpar->height > 0)
+ if (st && st->codecpar->width > 0 && st->codecpar->height > 0) {
avio_printf(out, ",RESOLUTION=%dx%d", st->codecpar->width,
st->codecpar->height);
+ if (st->avg_frame_rate.num > 0) {
+ // In an ideal world #EXT-X-VERSION should be >=7 if we want FRAME-RATE
+ // according to
+ // https://developer.apple.com/documentation/http_live_streaming/about_the_ext-x-version_tag
+ // But we can ignore that because:
+ // https://datatracker.ietf.org/doc/html/rfc8216#section-6.3.1
+ // "To support forward compatibility, when parsing Playlists,
+ // clients MUST ignore any attribute/value pair
+ // with an unrecognized AttributeName.".
+
+
+ // https://datatracker.ietf.org/doc/html/rfc8216#page-31
+ // "The value is a decimal-floating-point describing the maximum frame
+ // rate for all the video in the Variant Stream, rounded to three
+ // decimal places."
+
+ // Also, iOS and tvOS refuse to play the content if VIDEO-RANGE is
+ // present but FRAME-RATE is missing.
+ // Although at this moment
+ // VIDEO-RANGE attribute is not implemented in FFmpeg.
+ avio_printf(out, ",FRAME-RATE=%.3f", av_q2d(st->avg_frame_rate));
+ }
+ }
if (codecs && codecs[0])
avio_printf(out, ",CODECS=\"%s\"", codecs);
if (agroup && agroup[0])
--
2.32.0
More information about the ffmpeg-devel
mailing list