From 857cf00a39b7be4dbbe2b6a0cfe6378116c7b042 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Mon, 26 Sep 2016 16:29:33 -0700 Subject: [PATCH] UI: Implement simple output mode presets for AMD Closes jp9000/obs-studio#630 --- UI/data/locale/en-US.ini | 1 + UI/window-basic-main-outputs.cpp | 64 ++++++++++++++++++++++++++++++-- UI/window-basic-main.hpp | 1 + UI/window-basic-settings.cpp | 14 +++++++ 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 6c698a1b7..3d6f196bd 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -421,6 +421,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless quality warning!" Basic.Settings.Output.Simple.Warn.MultipleQSV="Warning: You cannot use multiple separate QSV encoders when streaming and recording at the same time. If you want to stream and record at the same time, please change either the recording encoder or the stream encoder." Basic.Settings.Output.Simple.Encoder.Software="Software (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 low CPU usage preset, increases file size)" Basic.Settings.Output.VideoBitrate="Video Bitrate" diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 9a864df0a..b703a4fb4 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -161,9 +161,11 @@ struct SimpleOutput : BasicOutputHandler { int CalcCRF(int crf); + void UpdateStreamingSettings_amd(obs_data_t *settings, int bitrate); void UpdateRecordingSettings_x264_crf(int crf); void UpdateRecordingSettings_qsv11(int crf); void UpdateRecordingSettings_nvenc(int cqp); + void UpdateRecordingSettings_amd_cqp(int cqp); void UpdateRecordingSettings(); void UpdateRecordingAudioSettings(); virtual void Update() override; @@ -254,6 +256,8 @@ void SimpleOutput::LoadRecordingPreset() lowCPUx264 = true; } else if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) { LoadRecordingPreset_h264("obs_qsv11"); + } else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) { + LoadRecordingPreset_h264("amd_amf_h264"); } else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) { LoadRecordingPreset_h264("ffmpeg_nvenc"); } @@ -278,6 +282,8 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) "StreamEncoder"); if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) LoadStreamingPreset_h264("obs_qsv11"); + else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) + LoadStreamingPreset_h264("amd_amf_h264"); else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) LoadStreamingPreset_h264("ffmpeg_nvenc"); else @@ -343,12 +349,19 @@ void SimpleOutput::Update() const char *presetType; const char *preset; - if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) + if (strcmp(encoder, SIMPLE_ENCODER_QSV) == 0) { presetType = "QSVPreset"; - else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) + + } else if (strcmp(encoder, SIMPLE_ENCODER_AMD) == 0) { + presetType = "AMDPreset"; + UpdateStreamingSettings_amd(h264Settings, videoBitrate); + + } else if (strcmp(encoder, SIMPLE_ENCODER_NVENC) == 0) { presetType = "NVENCPreset"; - else + + } else { presetType = "Preset"; + } preset = config_get_string(main->Config(), "SimpleOutput", presetType); @@ -485,6 +498,48 @@ void SimpleOutput::UpdateRecordingSettings_nvenc(int cqp) obs_data_release(settings); } +void SimpleOutput::UpdateStreamingSettings_amd(obs_data_t *settings, + int bitrate) +{ + int bits = bitrate * 1000; + obs_data_set_int(settings, "AMF.H264.Usage", 0); + obs_data_set_int(settings, "AMF.H264.QualityPreset", 2); + obs_data_set_int(settings, "AMF.H264.ProfileLevel", 51); + obs_data_set_int(settings, "AMF.H264.FillerData", 1); + obs_data_set_int(settings, "AMF.H264.FrameSkipping", -1); + obs_data_set_int(settings, "AMF.H264.BPicture.Pattern", 2); + obs_data_set_int(settings, "AMF.H264.BPicture.Reference", 1); + obs_data_set_int(settings, "AMF.H264.Bitrate.Target", bits); + obs_data_set_int(settings, "AMF.H264.Bitrate.Peak", bits); + obs_data_set_int(settings, "AMF.H264Advanced.VBVBuffer.Size", bits); + obs_data_set_string(settings, "profile", "high"); +} + +void SimpleOutput::UpdateRecordingSettings_amd_cqp(int cqp) +{ + obs_data_t *settings = obs_data_create(); + + obs_data_set_int(settings, "AMF.H264.Usage", 0); + obs_data_set_int(settings, "AMF.H264.QualityPreset", 2); + obs_data_set_int(settings, "AMF.H264.ProfileLevel", 51); + obs_data_set_int(settings, "AMF.H264.FillerData", 0); + obs_data_set_int(settings, "AMF.H264.FrameSkipping", 0); + obs_data_set_int(settings, "AMF.H264.QP.Minimum", 0); + obs_data_set_int(settings, "AMF.H264.QP.Maximum", 51); + obs_data_set_int(settings, "AMF.H264.QP.IFrame", cqp); + obs_data_set_int(settings, "AMF.H264.QP.PFrame", cqp); + obs_data_set_int(settings, "AMF.H264.QP.BFrame", cqp); + obs_data_set_int(settings, "AMF.H264.BPicture.Pattern", 3); + obs_data_set_int(settings, "AMF.H264.BPicture.Reference", 1); + obs_data_set_int(settings, "keyint_sec", 1); + obs_data_set_string(settings, "rate_control", "CQP"); + obs_data_set_string(settings, "profile", "high"); + + obs_encoder_update(h264Recording, settings); + + obs_data_release(settings); +} + void SimpleOutput::UpdateRecordingSettings() { bool ultra_hq = (videoQuality == "HQ"); @@ -496,6 +551,9 @@ void SimpleOutput::UpdateRecordingSettings() } else if (videoEncoder == SIMPLE_ENCODER_QSV) { UpdateRecordingSettings_qsv11(crf); + } else if (videoEncoder == SIMPLE_ENCODER_AMD) { + UpdateRecordingSettings_amd_cqp(crf); + } else if (videoEncoder == SIMPLE_ENCODER_NVENC) { UpdateRecordingSettings_nvenc(crf); } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index da1faaa01..93c41ea91 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -54,6 +54,7 @@ class QNetworkReply; #define SIMPLE_ENCODER_X264_LOWCPU "x264_lowcpu" #define SIMPLE_ENCODER_QSV "qsv" #define SIMPLE_ENCODER_NVENC "nvenc" +#define SIMPLE_ENCODER_AMD "amd" #define PREVIEW_EDGE_SIZE 10 diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 73d3ab58f..aab5c16fe 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -2467,6 +2467,8 @@ void OBSBasicSettings::SaveOutputSettings() presetType = "QSVPreset"; else if (encoder == SIMPLE_ENCODER_NVENC) presetType = "NVENCPreset"; + else if (encoder == SIMPLE_ENCODER_AMD) + presetType = "AMDPreset"; else presetType = "Preset"; @@ -3246,6 +3248,10 @@ void OBSBasicSettings::FillSimpleRecordingValues() ui->simpleOutRecEncoder->addItem( ENCODER_STR("Hardware.NVENC"), QString(SIMPLE_ENCODER_NVENC)); + if (EncoderAvailable("amd_amf_h264")) + ui->simpleOutRecEncoder->addItem( + ENCODER_STR("Hardware.AMD"), + QString(SIMPLE_ENCODER_AMD)); #undef ADD_QUALITY } @@ -3262,6 +3268,10 @@ void OBSBasicSettings::FillSimpleStreamingValues() ui->simpleOutStrEncoder->addItem( ENCODER_STR("Hardware.NVENC"), QString(SIMPLE_ENCODER_NVENC)); + if (EncoderAvailable("amd_amf_h264")) + ui->simpleOutStrEncoder->addItem( + ENCODER_STR("Hardware.AMD"), + QString(SIMPLE_ENCODER_AMD)); #undef ENCODER_STR } @@ -3322,6 +3332,10 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged() defaultPreset = "default"; preset = curNVENCPreset; + } else if (encoder == SIMPLE_ENCODER_AMD) { + /* none */ + defaultPreset = ""; + } else { ui->simpleOutPreset->addItem("ultrafast", "ultrafast"); ui->simpleOutPreset->addItem("superfast", "superfast");