mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-05-07 15:19:55 +09:00
Only use global quality parameter for amd/intel hardware encoding
This commit is contained in:
@@ -332,7 +332,7 @@ static AVCodecContext* create_audio_codec_context(int fps, AudioCodec audio_code
|
|||||||
static AVCodecContext *create_video_codec_context(AVPixelFormat pix_fmt,
|
static AVCodecContext *create_video_codec_context(AVPixelFormat pix_fmt,
|
||||||
VideoQuality video_quality,
|
VideoQuality video_quality,
|
||||||
int fps, const AVCodec *codec, bool low_latency, gsr_gpu_vendor vendor, FramerateMode framerate_mode,
|
int fps, const AVCodec *codec, bool low_latency, gsr_gpu_vendor vendor, FramerateMode framerate_mode,
|
||||||
bool hdr, gsr_color_range color_range, float keyint) {
|
bool hdr, gsr_color_range color_range, float keyint, bool use_software_video_encoder) {
|
||||||
|
|
||||||
AVCodecContext *codec_context = avcodec_alloc_context3(codec);
|
AVCodecContext *codec_context = avcodec_alloc_context3(codec);
|
||||||
|
|
||||||
@@ -422,6 +422,7 @@ static AVCodecContext *create_video_codec_context(AVPixelFormat pix_fmt,
|
|||||||
|
|
||||||
// 8 bit / 10 bit = 80%, and increase it even more
|
// 8 bit / 10 bit = 80%, and increase it even more
|
||||||
const float quality_multiply = hdr ? (8.0f/10.0f * 0.7f) : 1.0f;
|
const float quality_multiply = hdr ? (8.0f/10.0f * 0.7f) : 1.0f;
|
||||||
|
if(!use_software_video_encoder && vendor != GSR_GPU_VENDOR_NVIDIA) {
|
||||||
if(codec_context->codec_id == AV_CODEC_ID_AV1 || codec_context->codec_id == AV_CODEC_ID_H264 || codec_context->codec_id == AV_CODEC_ID_HEVC) {
|
if(codec_context->codec_id == AV_CODEC_ID_AV1 || codec_context->codec_id == AV_CODEC_ID_H264 || codec_context->codec_id == AV_CODEC_ID_HEVC) {
|
||||||
switch(video_quality) {
|
switch(video_quality) {
|
||||||
case VideoQuality::MEDIUM:
|
case VideoQuality::MEDIUM:
|
||||||
@@ -468,6 +469,7 @@ static AVCodecContext *create_video_codec_context(AVPixelFormat pix_fmt,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
av_opt_set_int(codec_context->priv_data, "b_ref_mode", 0, 0);
|
av_opt_set_int(codec_context->priv_data, "b_ref_mode", 0, 0);
|
||||||
//av_opt_set_int(codec_context->priv_data, "cbr", true, 0);
|
//av_opt_set_int(codec_context->priv_data, "cbr", true, 0);
|
||||||
@@ -539,7 +541,7 @@ static bool vaapi_create_codec_context(AVCodecContext *video_codec_context, cons
|
|||||||
|
|
||||||
static bool check_if_codec_valid_for_hardware(const AVCodec *codec, gsr_gpu_vendor vendor, const char *card_path) {
|
static bool check_if_codec_valid_for_hardware(const AVCodec *codec, gsr_gpu_vendor vendor, const char *card_path) {
|
||||||
// Do not use AV_PIX_FMT_CUDA because we dont want to do full check with hardware context
|
// Do not use AV_PIX_FMT_CUDA because we dont want to do full check with hardware context
|
||||||
AVCodecContext *codec_context = create_video_codec_context(vendor == GSR_GPU_VENDOR_NVIDIA ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_VAAPI, VideoQuality::VERY_HIGH, 60, codec, false, vendor, FramerateMode::CONSTANT, false, GSR_COLOR_RANGE_LIMITED, 2);
|
AVCodecContext *codec_context = create_video_codec_context(vendor == GSR_GPU_VENDOR_NVIDIA ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_VAAPI, VideoQuality::VERY_HIGH, 60, codec, false, vendor, FramerateMode::CONSTANT, false, GSR_COLOR_RANGE_LIMITED, 2, false);
|
||||||
if(!codec_context)
|
if(!codec_context)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -2563,7 +2565,7 @@ int main(int argc, char **argv) {
|
|||||||
const bool hdr = video_codec_is_hdr(video_codec);
|
const bool hdr = video_codec_is_hdr(video_codec);
|
||||||
const bool low_latency_recording = is_livestream || is_output_piped;
|
const bool low_latency_recording = is_livestream || is_output_piped;
|
||||||
|
|
||||||
AVCodecContext *video_codec_context = create_video_codec_context(get_pixel_format(egl.gpu_info.vendor, use_software_video_encoder), quality, fps, video_codec_f, low_latency_recording, egl.gpu_info.vendor, framerate_mode, hdr, color_range, keyint);
|
AVCodecContext *video_codec_context = create_video_codec_context(get_pixel_format(egl.gpu_info.vendor, use_software_video_encoder), quality, fps, video_codec_f, low_latency_recording, egl.gpu_info.vendor, framerate_mode, hdr, color_range, keyint, use_software_video_encoder);
|
||||||
if(replay_buffer_size_secs == -1)
|
if(replay_buffer_size_secs == -1)
|
||||||
video_stream = create_stream(av_format_context, video_codec_context);
|
video_stream = create_stream(av_format_context, video_codec_context);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user