From samuelh at rd.bbc.co.uk Fri May 13 09:07:52 2022 From: samuelh at rd.bbc.co.uk (Samuel Hurst) Date: Fri, 13 May 2022 10:07:52 +0100 Subject: [x264-devel] x264 bitrate adjustment latency Message-ID: <6e17fbba-834a-5b18-184d-b70d0e7332cf@rd.bbc.co.uk> Hello, Apologies if this isn't the correct place to ask this question, but I couldn't find a better place and there doesn't seem to be an x264 section on the VideoLAN forum to ask this sort of question, and I was recommended to ask directly here. I've been experimenting with congestion control for live RTP in GStreamer, where the bit rate of the encoder is changed dynamically in respose to network conditions. The issue I've been having is that x264 seems to take a while (1-2 seconds) to react to the bit rate property being updated, which results in the congestion controller panicking and ramping the output of the encoder down further and further as it continues to see congestion from the encoder bursting it's bit rate budget. I have been using the x264enc element in GStreamer [1], which uses the x264 library directly underneath, and seems to wrap several x264 options into it's own interface. It also offers the option to pass other options through to the underlying library directly, but I haven't used that yet. I've been graphing the output to understand the time between the target bit rate being set and the new rate taking effect. I've been producing graphs like the one in [2], which show the configured bit rate in gold, the average bit rate measured every second in red and the size of every encoded frame in blue. Looking at the graph, there's at least a second before the size of each encoded frame starts to trend downwards, which is where I think my problem lies. Do you have any suggestions of settings that I could change to reduce the time that it takes for x264 to start reducing it's bit rate? I've already tried reducing the KeyInt value to as low as 10, but that doesn't seem to help. I have also tried increasing the qpstep parameter, as well as lowering the rc-lookahead and vbv-bufsize parameters, but nothing seems to help. I'm using the version of x264 in the Ubuntu 22.04 repositories [3], which Canonical refer to as version 163, but I'm not sure how that relates to what's in the VideoLAN GitLab repository. I'd appreciate any pointers or help that you can give. Best regards, -Sam [1]: https://gstreamer.freedesktop.org/documentation/x264/index.html [2]: https://www.dropbox.com/s/d9sxya0mr00j5np/x264-buffer-bitrate-test-idr-25-10mb-to-8mb.png?dl=0 [3]: https://packages.ubuntu.com/jammy/libx264-163