UI: Update simple output to use new AMD encoder

master
jp9000 2022-07-21 13:02:21 -07:00 committed by Jim
parent 4e140d2ffe
commit 2b957c9368
6 changed files with 56 additions and 78 deletions

View File

@ -904,6 +904,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless quality warning!"
Basic.Settings.Output.Simple.Encoder.Software="Software (x264)" Basic.Settings.Output.Simple.Encoder.Software="Software (x264)"
Basic.Settings.Output.Simple.Encoder.Hardware.QSV.H264="Hardware (QSV, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV.H264="Hardware (QSV, H.264)"
Basic.Settings.Output.Simple.Encoder.Hardware.AMD.H264="Hardware (AMD, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.AMD.H264="Hardware (AMD, H.264)"
Basic.Settings.Output.Simple.Encoder.Hardware.AMD.HEVC="Hardware (AMD, HEVC)"
Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.H264="Hardware (NVENC, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.H264="Hardware (NVENC, H.264)"
Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.HEVC="Hardware (NVENC, HEVC)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC.HEVC="Hardware (NVENC, HEVC)"
Basic.Settings.Output.Simple.Encoder.Hardware.Apple.H264="Hardware (Apple, H.264)" Basic.Settings.Output.Simple.Encoder.Hardware.Apple.H264="Hardware (Apple, H.264)"

View File

@ -994,7 +994,7 @@ void AutoConfig::TestHardwareEncoding()
hardwareEncodingAvailable = nvencAvailable = true; hardwareEncodingAvailable = nvencAvailable = true;
else if (strcmp(id, "obs_qsv11") == 0) else if (strcmp(id, "obs_qsv11") == 0)
hardwareEncodingAvailable = qsvAvailable = true; hardwareEncodingAvailable = qsvAvailable = true;
else if (strcmp(id, "amd_amf_h264") == 0) else if (strcmp(id, "h264_texture_amf") == 0)
hardwareEncodingAvailable = vceAvailable = true; hardwareEncodingAvailable = vceAvailable = true;
} }
} }

View File

@ -275,7 +275,6 @@ struct SimpleOutput : BasicOutputHandler {
int CalcCRF(int crf); int CalcCRF(int crf);
void UpdateStreamingSettings_amd(obs_data_t *settings, int bitrate);
void UpdateRecordingSettings_x264_crf(int crf); void UpdateRecordingSettings_x264_crf(int crf);
void UpdateRecordingSettings_qsv11(int crf); void UpdateRecordingSettings_qsv11(int crf);
void UpdateRecordingSettings_nvenc(int cqp); void UpdateRecordingSettings_nvenc(int cqp);
@ -384,7 +383,11 @@ void SimpleOutput::LoadRecordingPreset()
} else if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) {
LoadRecordingPreset_Lossy("obs_qsv11"); LoadRecordingPreset_Lossy("obs_qsv11");
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) {
LoadRecordingPreset_Lossy("amd_amf_h264"); LoadRecordingPreset_Lossy("h264_texture_amf");
#ifdef ENABLE_HEVC
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD_HEVC) == 0) {
LoadRecordingPreset_Lossy("h265_texture_amf");
#endif
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) {
const char *id = EncoderAvailable("jim_nvenc") const char *id = EncoderAvailable("jim_nvenc")
? "jim_nvenc" ? "jim_nvenc"
@ -421,7 +424,11 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
LoadStreamingPreset_Lossy("obs_qsv11"); LoadStreamingPreset_Lossy("obs_qsv11");
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) {
LoadStreamingPreset_Lossy("amd_amf_h264"); LoadStreamingPreset_Lossy("h264_texture_amf");
#ifdef ENABLE_HEVC
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD_HEVC) == 0) {
LoadStreamingPreset_Lossy("h265_texture_amf");
#endif
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) {
const char *id = EncoderAvailable("jim_nvenc") ? "jim_nvenc" const char *id = EncoderAvailable("jim_nvenc") ? "jim_nvenc"
@ -534,7 +541,11 @@ void SimpleOutput::Update()
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) {
presetType = "AMDPreset"; presetType = "AMDPreset";
UpdateStreamingSettings_amd(videoSettings, videoBitrate);
#ifdef ENABLE_HEVC
} else if (strcmp(encoder, SIMPLE_ENCODER_AMD_HEVC) == 0) {
presetType = "AMDPreset";
#endif
} else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) { } else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) {
presetType = "NVENCPreset"; presetType = "NVENCPreset";
@ -702,46 +713,13 @@ void SimpleOutput::UpdateRecordingSettings_apple(int quality)
obs_encoder_update(videoRecording, settings); obs_encoder_update(videoRecording, settings);
} }
void SimpleOutput::UpdateStreamingSettings_amd(obs_data_t *settings,
int bitrate)
{
// Static Properties
obs_data_set_int(settings, "Usage", 0);
obs_data_set_int(settings, "Profile", 100); // High
// Rate Control Properties
obs_data_set_int(settings, "RateControlMethod", 3);
obs_data_set_int(settings, "Bitrate.Target", bitrate);
obs_data_set_int(settings, "FillerData", 1);
obs_data_set_int(settings, "VBVBuffer", 1);
obs_data_set_int(settings, "VBVBuffer.Size", bitrate);
// Picture Control Properties
obs_data_set_double(settings, "KeyframeInterval", 2.0);
obs_data_set_int(settings, "BFrame.Pattern", 0);
}
void SimpleOutput::UpdateRecordingSettings_amd_cqp(int cqp) void SimpleOutput::UpdateRecordingSettings_amd_cqp(int cqp)
{ {
OBSDataAutoRelease settings = obs_data_create(); OBSDataAutoRelease settings = obs_data_create();
obs_data_set_string(settings, "rate_control", "CQP");
// Static Properties obs_data_set_string(settings, "profile", "high");
obs_data_set_int(settings, "Usage", 0); obs_data_set_string(settings, "preset", "hq");
obs_data_set_int(settings, "Profile", 100); // High obs_data_set_int(settings, "cqp", cqp);
// Rate Control Properties
obs_data_set_int(settings, "RateControlMethod", 0);
obs_data_set_int(settings, "QP.IFrame", cqp);
obs_data_set_int(settings, "QP.PFrame", cqp);
obs_data_set_int(settings, "QP.BFrame", cqp);
obs_data_set_int(settings, "VBVBuffer", 1);
obs_data_set_int(settings, "VBVBuffer.Size", 100000);
// Picture Control Properties
obs_data_set_double(settings, "KeyframeInterval", 2.0);
obs_data_set_int(settings, "BFrame.Pattern", 0);
// Update and release
obs_encoder_update(videoRecording, settings); obs_encoder_update(videoRecording, settings);
} }
@ -759,6 +737,11 @@ void SimpleOutput::UpdateRecordingSettings()
} else if (videoEncoder == SIMPLE_ENCODER_AMD) { } else if (videoEncoder == SIMPLE_ENCODER_AMD) {
UpdateRecordingSettings_amd_cqp(crf); UpdateRecordingSettings_amd_cqp(crf);
#ifdef ENABLE_HEVC
} else if (videoEncoder == SIMPLE_ENCODER_AMD_HEVC) {
UpdateRecordingSettings_amd_cqp(crf);
#endif
} else if (videoEncoder == SIMPLE_ENCODER_NVENC) { } else if (videoEncoder == SIMPLE_ENCODER_NVENC) {
UpdateRecordingSettings_nvenc(crf); UpdateRecordingSettings_nvenc(crf);

View File

@ -819,6 +819,7 @@ void OBSBasic::CheckForSimpleModeX264Fallback()
bool amd_supported = false; bool amd_supported = false;
bool nve_supported = false; bool nve_supported = false;
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
bool amd_hevc_supported = false;
bool nve_hevc_supported = false; bool nve_hevc_supported = false;
#endif #endif
bool apple_supported = false; bool apple_supported = false;
@ -834,6 +835,8 @@ void OBSBasic::CheckForSimpleModeX264Fallback()
else if (strcmp(id, "ffmpeg_nvenc") == 0) else if (strcmp(id, "ffmpeg_nvenc") == 0)
nve_supported = true; nve_supported = true;
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
else if (strcmp(id, "h265_texture_amf") == 0)
amd_hevc_supported = true;
else if (strcmp(id, "ffmpeg_hevc_nvenc") == 0) else if (strcmp(id, "ffmpeg_hevc_nvenc") == 0)
nve_hevc_supported = true; nve_hevc_supported = true;
#endif #endif
@ -857,6 +860,12 @@ void OBSBasic::CheckForSimpleModeX264Fallback()
return false; return false;
} }
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
} else if (strcmp(name, SIMPLE_ENCODER_AMD_HEVC) == 0) {
if (!amd_hevc_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_NVENC_HEVC) == 0) { } else if (strcmp(name, SIMPLE_ENCODER_NVENC_HEVC) == 0) {
if (!nve_hevc_supported) { if (!nve_hevc_supported) {
changed = true; changed = true;

View File

@ -66,10 +66,9 @@ class OBSBasicStats;
#define SIMPLE_ENCODER_X264_LOWCPU "x264_lowcpu" #define SIMPLE_ENCODER_X264_LOWCPU "x264_lowcpu"
#define SIMPLE_ENCODER_QSV "qsv" #define SIMPLE_ENCODER_QSV "qsv"
#define SIMPLE_ENCODER_NVENC "nvenc" #define SIMPLE_ENCODER_NVENC "nvenc"
#ifdef ENABLE_HEVC
#define SIMPLE_ENCODER_NVENC_HEVC "nvenc_hevc" #define SIMPLE_ENCODER_NVENC_HEVC "nvenc_hevc"
#endif
#define SIMPLE_ENCODER_AMD "amd" #define SIMPLE_ENCODER_AMD "amd"
#define SIMPLE_ENCODER_AMD_HEVC "amd_hevc"
#define SIMPLE_ENCODER_APPLE_H264 "apple_h264" #define SIMPLE_ENCODER_APPLE_H264 "apple_h264"
#define PREVIEW_EDGE_SIZE 10 #define PREVIEW_EDGE_SIZE 10

View File

@ -3561,6 +3561,8 @@ void OBSBasicSettings::SaveOutputSettings()
else if (encoder == SIMPLE_ENCODER_NVENC) else if (encoder == SIMPLE_ENCODER_NVENC)
presetType = "NVENCPreset"; presetType = "NVENCPreset";
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
else if (encoder == SIMPLE_ENCODER_AMD_HEVC)
presetType = "AMDPreset";
else if (encoder == SIMPLE_ENCODER_NVENC_HEVC) else if (encoder == SIMPLE_ENCODER_NVENC_HEVC)
presetType = "NVENCPreset"; presetType = "NVENCPreset";
#endif #endif
@ -4796,12 +4798,16 @@ void OBSBasicSettings::FillSimpleRecordingValues()
ENCODER_STR("Hardware.NVENC.H264"), ENCODER_STR("Hardware.NVENC.H264"),
QString(SIMPLE_ENCODER_NVENC)); QString(SIMPLE_ENCODER_NVENC));
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
if (EncoderAvailable("h265_texture_amf"))
ui->simpleOutRecEncoder->addItem(
ENCODER_STR("Hardware.AMD.HEVC"),
QString(SIMPLE_ENCODER_AMD_HEVC));
if (EncoderAvailable("ffmpeg_hevc_nvenc")) if (EncoderAvailable("ffmpeg_hevc_nvenc"))
ui->simpleOutRecEncoder->addItem( ui->simpleOutRecEncoder->addItem(
ENCODER_STR("Hardware.NVENC.HEVC"), ENCODER_STR("Hardware.NVENC.HEVC"),
QString(SIMPLE_ENCODER_NVENC_HEVC)); QString(SIMPLE_ENCODER_NVENC_HEVC));
#endif #endif
if (EncoderAvailable("amd_amf_h264")) if (EncoderAvailable("h264_texture_amf"))
ui->simpleOutRecEncoder->addItem( ui->simpleOutRecEncoder->addItem(
ENCODER_STR("Hardware.AMD.H264"), ENCODER_STR("Hardware.AMD.H264"),
QString(SIMPLE_ENCODER_AMD)); QString(SIMPLE_ENCODER_AMD));
@ -4829,12 +4835,16 @@ void OBSBasicSettings::FillSimpleStreamingValues()
ENCODER_STR("Hardware.NVENC.H264"), ENCODER_STR("Hardware.NVENC.H264"),
QString(SIMPLE_ENCODER_NVENC)); QString(SIMPLE_ENCODER_NVENC));
#ifdef ENABLE_HEVC #ifdef ENABLE_HEVC
if (EncoderAvailable("h265_texture_amf"))
ui->simpleOutStrEncoder->addItem(
ENCODER_STR("Hardware.AMD.HEVC"),
QString(SIMPLE_ENCODER_AMD_HEVC));
if (EncoderAvailable("ffmpeg_hevc_nvenc")) if (EncoderAvailable("ffmpeg_hevc_nvenc"))
ui->simpleOutStrEncoder->addItem( ui->simpleOutStrEncoder->addItem(
ENCODER_STR("Hardware.NVENC.HEVC"), ENCODER_STR("Hardware.NVENC.HEVC"),
QString(SIMPLE_ENCODER_NVENC_HEVC)); QString(SIMPLE_ENCODER_NVENC_HEVC));
#endif #endif
if (EncoderAvailable("amd_amf_h264")) if (EncoderAvailable("h264_texture_amf"))
ui->simpleOutStrEncoder->addItem( ui->simpleOutStrEncoder->addItem(
ENCODER_STR("Hardware.AMD.H264"), ENCODER_STR("Hardware.AMD.H264"),
QString(SIMPLE_ENCODER_AMD)); QString(SIMPLE_ENCODER_AMD));
@ -4905,9 +4915,12 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged()
defaultPreset = "balanced"; defaultPreset = "balanced";
preset = curQSVPreset; preset = curQSVPreset;
} else if (encoder == SIMPLE_ENCODER_NVENC) { } else if (encoder == SIMPLE_ENCODER_NVENC ||
obs_properties_t *props = encoder == SIMPLE_ENCODER_NVENC_HEVC) {
obs_get_encoder_properties("ffmpeg_nvenc"); const char *name = encoder == SIMPLE_ENCODER_NVENC
? "ffmpeg_nvenc"
: "ffmpeg_hevc_nvenc";
obs_properties_t *props = obs_get_encoder_properties(name);
obs_property_t *p = obs_properties_get(props, "preset"); obs_property_t *p = obs_properties_get(props, "preset");
size_t num = obs_property_list_item_count(p); size_t num = obs_property_list_item_count(p);
@ -4931,35 +4944,8 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged()
defaultPreset = "default"; defaultPreset = "default";
preset = curNVENCPreset; preset = curNVENCPreset;
#ifdef ENABLE_HEVC } else if (encoder == SIMPLE_ENCODER_AMD ||
} else if (encoder == SIMPLE_ENCODER_NVENC_HEVC) { encoder == SIMPLE_ENCODER_AMD_HEVC) {
obs_properties_t *props =
obs_get_encoder_properties("ffmpeg_hevc_nvenc");
obs_property_t *p = obs_properties_get(props, "preset");
size_t num = obs_property_list_item_count(p);
for (size_t i = 0; i < num; i++) {
const char *name = obs_property_list_item_name(p, i);
const char *val = obs_property_list_item_string(p, i);
/* bluray is for ideal bluray disc recording settings,
* not streaming */
if (strcmp(val, "bd") == 0)
continue;
/* lossless should of course not be used to stream */
if (astrcmp_n(val, "lossless", 8) == 0)
continue;
ui->simpleOutPreset->addItem(QT_UTF8(name), val);
}
obs_properties_destroy(props);
defaultPreset = "default";
preset = curNVENCPreset;
#endif
} else if (encoder == SIMPLE_ENCODER_AMD) {
ui->simpleOutPreset->addItem("Speed", "speed"); ui->simpleOutPreset->addItem("Speed", "speed");
ui->simpleOutPreset->addItem("Balanced", "balanced"); ui->simpleOutPreset->addItem("Balanced", "balanced");
ui->simpleOutPreset->addItem("Quality", "quality"); ui->simpleOutPreset->addItem("Quality", "quality");