Files
ffmpeg_build/contrib/ffmpeg-hlsbitrate.patch
Jan Stabenow 82a2e97175 Add ff v5.1.2
2022-11-04 00:55:10 +01:00

90 lines
3.1 KiB
Diff

From df74cdced975a6f13fdc24e43e75a7f9b571c661 Mon Sep 17 00:00:00 2001
From: Ingo Oppermann <ingo@datarhei.com>
Date: Tue, 25 Oct 2022 10:43:45 +0200
Subject: [PATCH v2] Calculate bandwidth estimate (ffmpeg 5.1)
---
libavformat/hlsenc.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 6f49ae1a..da7c3f21 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -124,6 +124,7 @@ typedef struct VariantStream {
AVIOContext *out;
AVIOContext *out_single_file;
int packets_written;
+ uint64_t bytes_written;
int init_range_length;
uint8_t *temp_buffer;
uint8_t *init_buffer;
@@ -138,6 +139,8 @@ typedef struct VariantStream {
double dpp; // duration per packet
int64_t start_pts;
int64_t end_pts;
+ int64_t scaled_start_pts;
+ int64_t scaled_cur_pts;
int64_t video_lastpos;
int64_t video_keyframe_pos;
int64_t video_keyframe_size;
@@ -1482,6 +1485,16 @@ static int create_master_playlist(AVFormatContext *s,
bandwidth += get_stream_bit_rate(vid_st);
if (aud_st)
bandwidth += get_stream_bit_rate(aud_st);
+
+ if (bandwidth == 0) {
+ // Estimate bandwidth
+ bandwidth = (int)round((double)vs->bytes_written / (av_q2d(AV_TIME_BASE_Q) * (vs->scaled_cur_pts - vs->scaled_start_pts)) * 8);
+
+ // Reset counters
+ vs->bytes_written = 0;
+ vs->scaled_start_pts = vs->scaled_cur_pts;
+ }
+
bandwidth += bandwidth / 10;
ccgroup = NULL;
@@ -2443,6 +2456,19 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
return AVERROR(ENOMEM);
}
+ if (vs->scaled_start_pts == AV_NOPTS_VALUE) {
+ vs->scaled_start_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ }
+
+ if (vs->scaled_cur_pts == AV_NOPTS_VALUE) {
+ vs->scaled_cur_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ } else {
+ int64_t pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q);
+ if (pts > vs->scaled_cur_pts) {
+ vs->scaled_cur_pts = pts;
+ }
+ }
+
end_pts = hls->recording_time * vs->number;
if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) {
@@ -2663,6 +2689,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
}
vs->packets_written++;
+ vs->bytes_written += (uint64_t)pkt->size;
if (oc->pb) {
ret = ff_write_chained(oc, stream_index, pkt, s, 0);
vs->video_keyframe_size += pkt->size;
@@ -2956,6 +2983,8 @@ static int hls_init(AVFormatContext *s)
vs->sequence = hls->start_sequence;
vs->start_pts = AV_NOPTS_VALUE;
vs->end_pts = AV_NOPTS_VALUE;
+ vs->scaled_start_pts = AV_NOPTS_VALUE;
+ vs->scaled_cur_pts = AV_NOPTS_VALUE;
vs->current_segment_final_filename_fmt[0] = '\0';
vs->initial_prog_date_time = initial_program_date_time;
base-commit: 2bca71f4986725d7cf0d441e2f82a790d0a0c717
--
2.32.1 (Apple Git-133)