EncodePipelineVAAPI: Force VBR with adaptive bitrate (#1768)

This commit is contained in:
David Rosca 2023-08-05 12:20:51 +02:00 committed by GitHub
parent fd23f81661
commit c1821aa75d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 6 deletions

View File

@ -108,6 +108,12 @@ void Settings::Load() {
m_overrideGripThreshold = config.get("override_grip_threshold").get<bool>();
m_gripThreshold = config.get("grip_threshold").get<double>();
m_constantBitrate = v.get("session_settings")
.get("video")
.get("bitrate")
.get("mode")
.get("variant").get<std::string>() == "ConstantMbps";
Info("Render Target: %d %d\n", m_renderWidth, m_renderHeight);
Info("Refresh Rate: %d\n", m_refreshRate);
m_loaded = true;

View File

@ -84,4 +84,6 @@ class Settings {
float m_triggerThreshold;
bool m_overrideGripThreshold;
float m_gripThreshold;
bool m_constantBitrate;
};

View File

@ -2,6 +2,7 @@
#include "ALVR-common/packet_types.h"
#include "ffmpeg_helper.h"
#include "alvr_server/Settings.h"
#include "alvr_server/Logger.h"
#include <chrono>
extern "C" {
@ -179,7 +180,12 @@ alvr::EncodePipelineVAAPI::EncodePipelineVAAPI(Renderer *render, VkContext &vk_c
break;
case ALVR_CBR:
default:
av_opt_set(encoder_ctx->priv_data, "rc_mode", "CBR", 0);
if (settings.m_constantBitrate) {
av_opt_set(encoder_ctx->priv_data, "rc_mode", "CBR", 0);
} else {
Info("Forcing VBR rate control with adaptive bitrate");
av_opt_set(encoder_ctx->priv_data, "rc_mode", "VBR", 0);
}
break;
}
@ -338,15 +344,11 @@ void alvr::EncodePipelineVAAPI::SetParams(FfiDynamicEncoderParams params)
if (!params.updated) {
return;
}
if (Settings::Instance().m_codec == ALVR_CODEC_H265) {
// hevc doesn't work well with adaptive bitrate/fps
params.framerate = Settings::Instance().m_refreshRate;
}
encoder_ctx->bit_rate = params.bitrate_bps;
encoder_ctx->framerate = AVRational{int(params.framerate * 1000), 1000};
encoder_ctx->rc_buffer_size = encoder_ctx->bit_rate / params.framerate * 1.1;
encoder_ctx->rc_max_rate = encoder_ctx->bit_rate;
encoder_ctx->rc_initial_buffer_occupancy = encoder_ctx->rc_buffer_size / 4 * 3;
encoder_ctx->rc_initial_buffer_occupancy = encoder_ctx->rc_buffer_size;
if (Settings::Instance().m_amdBitrateCorruptionFix) {
RequestIDR();