0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-19 20:32:15 +02:00

UI: Implement simple output mode presets for AMD

Closes jp9000/obs-studio#630
This commit is contained in:
Michael Fabian Dirks 2016-09-26 16:29:33 -07:00 committed by jp9000
parent 4d23e84837
commit 857cf00a39
4 changed files with 77 additions and 3 deletions

View File

@ -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"

View File

@ -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);
}

View File

@ -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

View File

@ -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");