mirror of
https://github.com/LizardByte/Sunshine.git
synced 2025-02-19 03:39:51 +00:00
Fix rate control for AMD cards using VAAPI (#2821)
This commit is contained in:
parent
c92ed6158a
commit
38c13c8fe1
@ -27,6 +27,8 @@ struct sockaddr;
|
|||||||
struct AVFrame;
|
struct AVFrame;
|
||||||
struct AVBufferRef;
|
struct AVBufferRef;
|
||||||
struct AVHWFramesContext;
|
struct AVHWFramesContext;
|
||||||
|
struct AVCodecContext;
|
||||||
|
struct AVDictionary;
|
||||||
|
|
||||||
// Forward declarations of boost classes to avoid having to include boost headers
|
// Forward declarations of boost classes to avoid having to include boost headers
|
||||||
// here, which results in issues with Windows.h and WinSock2.h include order.
|
// here, which results in issues with Windows.h and WinSock2.h include order.
|
||||||
@ -398,6 +400,13 @@ namespace platf {
|
|||||||
virtual void
|
virtual void
|
||||||
init_hwframes(AVHWFramesContext *frames) {};
|
init_hwframes(AVHWFramesContext *frames) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides a hook for allow platform-specific code to adjust codec options.
|
||||||
|
* @note Implementations may set or modify codec options prior to codec initialization.
|
||||||
|
*/
|
||||||
|
virtual void
|
||||||
|
init_codec_options(AVCodecContext *ctx, AVDictionary *options) {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Prepare to derive a context.
|
* @brief Prepare to derive a context.
|
||||||
* @note Implementations may make modifications required before context derivation
|
* @note Implementations may make modifications required before context derivation
|
||||||
|
@ -129,6 +129,16 @@ namespace va {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_codec_options(AVCodecContext *ctx, AVDictionary *options) override {
|
||||||
|
// Don't set the RC buffer size when using H.264 on Intel GPUs. It causes
|
||||||
|
// major encoding quality degradation.
|
||||||
|
auto vendor = vaQueryVendorString(va_display);
|
||||||
|
if (ctx->codec_id != AV_CODEC_ID_H264 || (vendor && !strstr(vendor, "Intel"))) {
|
||||||
|
ctx->rc_buffer_size = ctx->bit_rate * ctx->framerate.den / ctx->framerate.num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx_buf) override {
|
set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx_buf) override {
|
||||||
this->hwframe.reset(frame);
|
this->hwframe.reset(frame);
|
||||||
|
@ -859,6 +859,7 @@ namespace video {
|
|||||||
std::make_optional<encoder_t::option_t>("qp"s, &config::video.qp),
|
std::make_optional<encoder_t::option_t>("qp"s, &config::video.qp),
|
||||||
"h264_vaapi"s,
|
"h264_vaapi"s,
|
||||||
},
|
},
|
||||||
|
// RC buffer size will be set in platform code if supported
|
||||||
LIMITED_GOP_SIZE | PARALLEL_ENCODING | SINGLE_SLICE_ONLY | NO_RC_BUF_LIMIT
|
LIMITED_GOP_SIZE | PARALLEL_ENCODING | SINGLE_SLICE_ONLY | NO_RC_BUF_LIMIT
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -1610,6 +1611,9 @@ namespace video {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allow the encoding device a final opportunity to set/unset or override any options
|
||||||
|
encode_device->init_codec_options(ctx.get(), options);
|
||||||
|
|
||||||
if (auto status = avcodec_open2(ctx.get(), codec, &options)) {
|
if (auto status = avcodec_open2(ctx.get(), codec, &options)) {
|
||||||
char err_str[AV_ERROR_MAX_STRING_SIZE] { 0 };
|
char err_str[AV_ERROR_MAX_STRING_SIZE] { 0 };
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user