Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions frontend/data/locale/en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1053,6 +1053,7 @@ Basic.Settings.Output.Simple.Warn.Lossless="Warning: Lossless quality generates
Basic.Settings.Output.Simple.Warn.Lossless.Msg="Are you sure you want to use lossless quality?"
Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless quality warning!"
Basic.Settings.Output.Simple.Encoder.Software="Software (x264)"
Basic.Settings.Output.Simple.Encoder.Software.OpenH264="Software (OpenH264)"
Basic.Settings.Output.Simple.Encoder.Hardware.QSV.H264="Hardware (QSV, H.264)"
Basic.Settings.Output.Simple.Encoder.Hardware.QSV.AV1="Hardware (QSV, AV1)"
Basic.Settings.Output.Simple.Encoder.Hardware.AMD.H264="Hardware (AMD, H.264)"
Expand Down
15 changes: 13 additions & 2 deletions frontend/settings/OBSBasicSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3343,6 +3343,11 @@ void OBSBasicSettings::SaveOutputSettings()
do. This only exists to make sure that the x264 preset doesn't
get overwritten with empty data. */
presetType = "ApplePreset";
else if (encoder == SIMPLE_ENCODER_OPENH264)
/* The OpenH264 encoder does not have presets like the other encoders
do. This only exists to make sure that the x264 preset doesn't
get overwritten with empty data. */
presetType = "OpenH264Preset";
else
presetType = "Preset";

Expand Down Expand Up @@ -4714,8 +4719,11 @@ void OBSBasicSettings::FillSimpleRecordingValues()
ADD_QUALITY("HQ");
ADD_QUALITY("Lossless");

ui->simpleOutRecEncoder->addItem(ENCODER_STR("Software"), QString(SIMPLE_ENCODER_X264));
ui->simpleOutRecEncoder->addItem(ENCODER_STR("SoftwareLowCPU"), QString(SIMPLE_ENCODER_X264_LOWCPU));
ui->simpleOutRecEncoder->addItem(ENCODER_STR("Software.OpenH264"), QString(SIMPLE_ENCODER_OPENH264));
if (EncoderAvailable("obs_x264")) {
ui->simpleOutRecEncoder->addItem(ENCODER_STR("Software"), QString(SIMPLE_ENCODER_X264));
ui->simpleOutRecEncoder->addItem(ENCODER_STR("SoftwareLowCPU"), QString(SIMPLE_ENCODER_X264_LOWCPU));
}
if (EncoderAvailable("obs_qsv11"))
ui->simpleOutRecEncoder->addItem(ENCODER_STR("Hardware.QSV.H264"), QString(SIMPLE_ENCODER_QSV));
if (EncoderAvailable("obs_qsv11_av1"))
Expand Down Expand Up @@ -4864,6 +4872,9 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged()

defaultPreset = "balanced";
preset = curAMDAV1Preset;
} else if (encoder == SIMPLE_ENCODER_OPENH264) {
ui->simpleOutPreset->setVisible(false);
ui->simpleOutPresetLabel->setVisible(false);
} else {

#define PRESET_STR(val) QString(Str("Basic.Settings.Output.EncoderPreset." val)).arg(val)
Expand Down
12 changes: 9 additions & 3 deletions frontend/settings/OBSBasicSettings_Stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1471,7 +1471,9 @@ static QString get_adv_fallback(const QString &enc)
return "com.apple.videotoolbox.videoencoder.ave.avc";
if (enc == "obs_qsv11_av1")
return "obs_qsv11";
return "obs_x264";
if (EncoderAvailable("obs_x264"))
return "obs_x264";
return "ffmpeg_openh264";
}

static QString get_adv_audio_fallback(const QString &enc)
Expand Down Expand Up @@ -1500,7 +1502,9 @@ static QString get_simple_fallback(const QString &enc)
return SIMPLE_ENCODER_APPLE_H264;
if (enc == SIMPLE_ENCODER_QSV_AV1)
return SIMPLE_ENCODER_QSV;
return SIMPLE_ENCODER_X264;
if (EncoderAvailable("obs_x264"))
return SIMPLE_ENCODER_X264;
return SIMPLE_ENCODER_OPENH264;
}

bool OBSBasicSettings::ServiceSupportsCodecCheck()
Expand Down Expand Up @@ -1675,7 +1679,9 @@ void OBSBasicSettings::ResetEncoders(bool streamOnly)

#define ENCODER_STR(str) QTStr("Basic.Settings.Output.Simple.Encoder." str)

ui->simpleOutStrEncoder->addItem(ENCODER_STR("Software"), QString(SIMPLE_ENCODER_X264));
ui->simpleOutStrEncoder->addItem(ENCODER_STR("Software.OpenH264"), QString(SIMPLE_ENCODER_OPENH264));
if (service_supports_encoder(vcodecs, "obs_x264"))
ui->simpleOutStrEncoder->addItem(ENCODER_STR("Software"), QString(SIMPLE_ENCODER_X264));
#ifdef _WIN32
if (service_supports_encoder(vcodecs, "obs_qsv11"))
ui->simpleOutStrEncoder->addItem(ENCODER_STR("Hardware.QSV.H264"), QString(SIMPLE_ENCODER_QSV));
Expand Down
6 changes: 4 additions & 2 deletions frontend/utility/SimpleOutput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,9 @@ void SimpleOutput::LoadStreamingPreset_Lossy(const char *encoderId)
/* mistakes have been made to lead us to this. */
const char *get_simple_output_encoder(const char *encoder)
{
if (strcmp(encoder, SIMPLE_ENCODER_X264) == 0) {
if (strcmp(encoder, SIMPLE_ENCODER_OPENH264) == 0) {
return "ffmpeg_openh264";
} else if (strcmp(encoder, SIMPLE_ENCODER_X264) == 0) {
return "obs_x264";
} else if (strcmp(encoder, SIMPLE_ENCODER_X264_LOWCPU) == 0) {
return "obs_x264";
Expand Down Expand Up @@ -112,7 +114,7 @@ const char *get_simple_output_encoder(const char *encoder)
#endif
}

return "obs_x264";
return "ffmpeg_openh264";
}

void SimpleOutput::LoadRecordingPreset()
Expand Down
13 changes: 10 additions & 3 deletions frontend/widgets/OBSBasic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,8 @@ static const double scaled_vals[] = {1.0, 1.25, (1.0 / 0.75), 1.5, (1.0 / 0.6),
#define DEFAULT_CONTAINER "hybrid_mp4"
#endif

extern bool EncoderAvailable(const char *encoder);

bool OBSBasic::InitBasicConfigDefaults()
{
QList<QScreen *> screens = QGuiApplication::screens();
Expand Down Expand Up @@ -680,7 +682,9 @@ bool OBSBasic::InitBasicConfigDefaults()
config_set_default_bool(activeConfiguration, "AdvOut", "UseRescale", false);
config_set_default_uint(activeConfiguration, "AdvOut", "TrackIndex", 1);
config_set_default_uint(activeConfiguration, "AdvOut", "VodTrackIndex", 2);
config_set_default_string(activeConfiguration, "AdvOut", "Encoder", "obs_x264");

bool useX264 = EncoderAvailable("obs_x264");
config_set_default_string(activeConfiguration, "AdvOut", "Encoder", (useX264 ? "obs_x264" : "ffmpeg_openh264"));

config_set_default_string(activeConfiguration, "AdvOut", "RecType", "Standard");

Expand Down Expand Up @@ -796,10 +800,13 @@ void OBSBasic::InitBasicConfigDefaults2()
bool oldEncDefaults = config_get_bool(App()->GetUserConfig(), "General", "Pre23Defaults");
bool useNV = EncoderAvailable("ffmpeg_nvenc") && !oldEncDefaults;

bool useX264 = EncoderAvailable("obs_x264");
const char *h264_fallback = (useX264 ? SIMPLE_ENCODER_X264 : SIMPLE_ENCODER_OPENH264);

config_set_default_string(activeConfiguration, "SimpleOutput", "StreamEncoder",
useNV ? SIMPLE_ENCODER_NVENC : SIMPLE_ENCODER_X264);
useNV ? SIMPLE_ENCODER_NVENC : h264_fallback);
config_set_default_string(activeConfiguration, "SimpleOutput", "RecEncoder",
useNV ? SIMPLE_ENCODER_NVENC : SIMPLE_ENCODER_X264);
useNV ? SIMPLE_ENCODER_NVENC : h264_fallback);

const char *aac_default = "ffmpeg_aac";
if (EncoderAvailable("CoreAudio_AAC"))
Expand Down
3 changes: 2 additions & 1 deletion frontend/widgets/OBSBasic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ struct Rect;

#define SIMPLE_ENCODER_X264 "x264"
#define SIMPLE_ENCODER_X264_LOWCPU "x264_lowcpu"
#define SIMPLE_ENCODER_OPENH264 "ffmpeg_openh264"
#define SIMPLE_ENCODER_QSV "qsv"
#define SIMPLE_ENCODER_QSV_AV1 "qsv_av1"
#define SIMPLE_ENCODER_NVENC "nvenc"
Expand Down Expand Up @@ -885,7 +886,7 @@ private slots:
void UpdateProfileEncoders();
std::vector<std::string> GetRestartRequirements(const ConfigFile &config) const;
void ResetProfileData();
void CheckForSimpleModeX264Fallback();
void CheckForSimpleModeH264Fallback();

public:
inline const OBSProfileCache &GetProfileCache() const noexcept { return profiles; };
Expand Down
31 changes: 18 additions & 13 deletions frontend/widgets/OBSBasic_Profiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,7 @@ void OBSBasic::ActivateProfile(const OBSProfile &profile, bool reset)
void OBSBasic::UpdateProfileEncoders()
{
InitBasicConfigDefaults2();
CheckForSimpleModeX264Fallback();
CheckForSimpleModeH264Fallback();
}

void OBSBasic::ResetProfileData()
Expand Down Expand Up @@ -782,10 +782,11 @@ std::vector<std::string> OBSBasic::GetRestartRequirements(const ConfigFile &conf
return result;
}

void OBSBasic::CheckForSimpleModeX264Fallback()
void OBSBasic::CheckForSimpleModeH264Fallback()
{
const char *curStreamEncoder = config_get_string(activeConfiguration, "SimpleOutput", "StreamEncoder");
const char *curRecEncoder = config_get_string(activeConfiguration, "SimpleOutput", "RecEncoder");
bool x264_supported = false;
bool qsv_supported = false;
bool qsv_av1_supported = false;
bool amd_supported = false;
Expand All @@ -802,7 +803,9 @@ void OBSBasic::CheckForSimpleModeX264Fallback()
const char *id;

while (obs_enum_encoder_types(idx++, &id)) {
if (strcmp(id, "h264_texture_amf") == 0)
if (strcmp(id, "obs_x264") == 0)
x264_supported = true;
else if (strcmp(id, "h264_texture_amf") == 0)
amd_supported = true;
else if (strcmp(id, "obs_qsv11") == 0)
qsv_supported = true;
Expand All @@ -825,69 +828,71 @@ void OBSBasic::CheckForSimpleModeX264Fallback()
apple_hevc_supported = true;
#endif
}
// Check to see whether x264 is available
const char *fallback_encoder_name = (x264_supported ? SIMPLE_ENCODER_X264 : SIMPLE_ENCODER_OPENH264);

auto CheckEncoder = [&](const char *&name) {
if (strcmp(name, SIMPLE_ENCODER_QSV) == 0) {
if (!qsv_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_QSV_AV1) == 0) {
if (!qsv_av1_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_NVENC) == 0) {
if (!nve_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_NVENC_AV1) == 0) {
if (!nve_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
#ifdef ENABLE_HEVC
} else if (strcmp(name, SIMPLE_ENCODER_AMD_HEVC) == 0) {
if (!amd_hevc_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_NVENC_HEVC) == 0) {
if (!nve_hevc_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
#endif
} else if (strcmp(name, SIMPLE_ENCODER_AMD) == 0) {
if (!amd_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_AMD_AV1) == 0) {
if (!amd_av1_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
} else if (strcmp(name, SIMPLE_ENCODER_APPLE_H264) == 0) {
if (!apple_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
#ifdef ENABLE_HEVC
} else if (strcmp(name, SIMPLE_ENCODER_APPLE_HEVC) == 0) {
if (!apple_hevc_supported) {
changed = true;
name = SIMPLE_ENCODER_X264;
name = fallback_encoder_name;
return false;
}
#endif
Expand Down
15 changes: 14 additions & 1 deletion frontend/wizards/AutoConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ AutoConfig::AutoConfig(QWidget *parent) : QWizard(parent)
streamPage->ui->key->setText(key.c_str());

TestHardwareEncoding();
TestSoftwareEncoding();

int bitrate = config_get_int(main->Config(), "SimpleOutput", "VBitrate");
bool multitrackVideoEnabled = config_has_user_value(main->Config(), "Stream1", "EnableMultitrackVideo")
Expand Down Expand Up @@ -210,6 +211,16 @@ AutoConfig::~AutoConfig()
EnableThreadedMessageBoxes(false);
}

void AutoConfig::TestSoftwareEncoding()
{
size_t idx = 0;
const char *id;
while (obs_enum_encoder_types(idx++, &id)) {
if (strcmp(id, "obs_x264") == 0)
x264Available = true;
}
}

void AutoConfig::TestHardwareEncoding()
{
size_t idx = 0;
Expand Down Expand Up @@ -285,8 +296,10 @@ inline const char *AutoConfig::GetEncoderId(Encoder enc)
return SIMPLE_ENCODER_AMD;
case Encoder::Apple:
return SIMPLE_ENCODER_APPLE_H264;
default:
case Encoder::x264:
return SIMPLE_ENCODER_X264;
default:
return SIMPLE_ENCODER_OPENH264;
}
};

Expand Down
3 changes: 3 additions & 0 deletions frontend/wizards/AutoConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AutoConfig : public QWizard {
};

enum class Encoder {
OpenH264,
x264,
NVENC,
QSV,
Expand Down Expand Up @@ -86,6 +87,7 @@ class AutoConfig : public QWizard {
bool qsvAvailable = false;
bool vceAvailable = false;
bool appleAvailable = false;
bool x264Available = false;

int startingBitrate = 2500;
bool customServer = false;
Expand All @@ -104,6 +106,7 @@ class AutoConfig : public QWizard {
int specificFPSDen = 0;

void TestHardwareEncoding();
void TestSoftwareEncoding();
bool CanTestServer(const char *server);

virtual void done(int result) override;
Expand Down
Loading
Loading