project: Add and apply new contributing guidelines

This commit is contained in:
Michael Fabian 'Xaymar' Dirks
2019-08-10 19:23:50 +02:00
parent 8af061ea02
commit 61c4c80c8f
6 changed files with 473 additions and 281 deletions
+192
View File
@@ -0,0 +1,192 @@
# Build Instructions
The project is compatible with being included directly in an obs-studio build, but can be built standalone. Depending on which you chose, the instructions differ greatly.
## Building with OBS Studio
1. Prepare OBS Studio for building on your platform.
2. Navigate to <obs-studio-clone>/plugins in a git-enabled shell.
3. Run `git submodule add https://github.com/Xaymar/obs-ffmpeg-encoder.git obs-ffmpeg-encoder` and wait for it to complete.
4. Edit the CMakeLists.txt in the same directory and append `add_subdirectory(obs-ffmpeg-encoder)`.
5. Use CMake to reconfigure OBS Studio, at which point it should detect the new plugin and allow you to build it.
6. Done.
## Building Standalone
This mode of building is used by CI providers and offers the fastest compile time, but does not allow quick testing as it requires a working OBS Studio installation to test.
1. Install CMake (3.1 or newer) and if you aren't using Windows, build the PACKAGE target in OBS Studio, which will generate a CPack archive in the build folder.
2. Clone the obs-ffmpeg-encoder repository using git or a comparable tool.
3. Configure obs-ffmpeg-encoder using CMake to build a subdirectory or any other location that is not the same as the source directory, and adjust the following options to suit your needs:
- OBS_STUDIO_DIR: Path to a normal or CPack OBS Studio build.
- OBS_DOWNLOAD_VERSION: The version to attempt to automatically download and use if no OBS Studio is detected (may not work on all platforms).
- CMAKE_INSTALL_PREFIX: Path that the INSTALL target copies files to.
- CMAKE_PACKAGE_PREFIX: Path for the archives generated by PACKAGE_ZIP and PACKAGE_7Z.
- CMAKE_PACKAGE_NAME: Name for the archives generated by PACKAGE_ZIP and PACKAGE_7Z.
- CMAKE_PACKAGE_SUFFIX_OVERRIDE:
4. Build obs-ffmpeg-encoder.
### Installing into a local OBS Studio Installation
Modify CMAKE_INSTALL_PREFIX to point at your OBS Studio installation directory (not the data directory) and build the INSTALL target.
### Packaging Release Archives
Generate release archives by building either PACKAGE_ZIP or PACKAGE_7Z. To generate a full release archive, CMAKE_INSTALL_PREFIX has to be set to a directory that only contains release files for this plugin. See the CI scripts for an example on this.
# Commits
Commits should always only focus on a single change that is necessary for that commit to work. For example, a commit that changes how something logs messages should not also include a new blur effect. In those cases, the commit should be split up into two, so that they can be reverted independently from another.
## Commit Subject
The subject line of a commit should begin with the prefix followed by a `: `, and then followed by a summary of what the change does, which should be no longer than 52 alphanumerical characters including whitespace. The prefix is determined by the file being modified, simply remove the extension or find the group that a file belongs to. For example, a modifiation to blur.effect would have the category effects, due to it being re-usable.
### Prefixes
- effects: Anything modifying generic effects like blur.effect, color-conversion.effect, mask.effect, etc.
- locale: Changes in `/data/locale`.
- shaders: Changes in `/data/shaders` that are not directly influenced by a change to custom shaders.
- project: Changes to files like README, CONTRIBUTING, AUTHORS, etc.
- cmake: Changes to CMake build scripts.
- ci: Changes to Continuous Integration.
All other files should be prefixed with the main file changed, so a change to the translations for Source Mirror would be `source-mirror: commit`.
## Commit Messages
The commit message should always convey why this change was necessary, what is being changed and how it affects the code when being run. There are rare cases where this can be left out (formatting, refactoring, ...) but it should always be descriptive of what is actually being done.
# Coding Guidelines
## Naming
The project uses the generally known snake_case for code and the uppercase variant for enumerations and macros:
### Macros (ELEPHANT_CASE)
- Casing: Uppercase
- Separator: `_`
- Prefixes: `S_` for global values, `ST_` for local (this file) values, `D_` for simple functions, `P_` for complex functions
- Suffixes: No
Example:
```
#define S_PI 3.14141
#define ST_PI2 S_PI / 2.0
#define D_(x) S_PI * x
#define P_(x, y) double_t x(double_t a, double_t b) { return a * b * y; }
```
### Enumerations (snake_case)
- Casing: Lowercase
- Separator: `_`
Example:
```
enum my_enum {};
enum class my_enum_class {};
enum class my_enum_class_int : int {};
```
#### Enumeration Entries (ELEPHANT_CASE)
- Casing: Uppercase
- Separator: `_`
Example:
```
enum my_enum {
ENTRY_1,
ENTRY_2
};
```
### Variables (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: No
- Suffixes: No
Example:
```
int my_var = 0;
```
### Functions (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: No
- Suffixes: No (differentiate by parameters only)
Example:
```
// This is forbidden.
void func();
int func_int();
// This is okay.
void func();
void func(int& result);
```
### Namespaces (snake_case)
- Casing: Lowercase
- Separator: `_`
Example:
```
namespace a_space {};
```
### Classes, Structs, Unions (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: No
- Suffixes: No
Example:
```
class a_class {};
class interface_class {};
```
#### Interface Classes
Interface Classes are handled like normal classes. There are no prefixes or suffixes to attach.
#### Methods (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: No
- Suffixes: No (differentiate by parameters only)
Example:
```
class a_class {
// This is forbidden.
void func();
int func_int();
// This is okay.
void func();
void func(int& result);
};
```
#### Member Variables (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: `_` if private, otherwise none
- Suffixes: No
Example:
```
class a_class {
int64_t _local_var;
void* _pointer;
int32_t _id;
};
```
### Type Definitions (snake_case)
- Casing: Lowercase
- Separator: `_`
- Prefixes: No
- Suffixes: `_t`
Example:
```
typedef int32_t my_type_t;
```
## Preprocessor Macros
Preprocessor `#define` Macros should be used sparingly, due to their nature of changing code before the compiler gets a chance to work with it. Unless necessary, they should never be in a header file.
+23 -23
View File
@@ -52,7 +52,7 @@ extern "C" {
#define P_FFMPEG_COLORFORMAT "FFmpeg.ColorFormat" #define P_FFMPEG_COLORFORMAT "FFmpeg.ColorFormat"
#define P_FFMPEG_STANDARDCOMPLIANCE "FFmpeg.StandardCompliance" #define P_FFMPEG_STANDARDCOMPLIANCE "FFmpeg.StandardCompliance"
enum class keyframe_type { Seconds, Frames }; enum class keyframe_type { SECONDS, FRAMES };
obsffmpeg::encoder_factory::encoder_factory(const AVCodec * codec) : avcodec_ptr(codec), info() obsffmpeg::encoder_factory::encoder_factory(const AVCodec * codec) : avcodec_ptr(codec), info()
{ {
@@ -308,9 +308,9 @@ void obsffmpeg::encoder_factory::get_defaults(obs_data_t* settings)
} }
if ((this->avcodec_ptr->capabilities & AV_CODEC_CAP_INTRA_ONLY) == 0) { if ((this->avcodec_ptr->capabilities & AV_CODEC_CAP_INTRA_ONLY) == 0) {
obs_data_set_default_int(settings, G_KEYFRAMES_INTERVALTYPE, 0); obs_data_set_default_int(settings, S_KEYFRAMES_INTERVALTYPE, 0);
obs_data_set_default_double(settings, G_KEYFRAMES_INTERVAL_SECONDS, 2.0); obs_data_set_default_double(settings, S_KEYFRAMES_INTERVAL_SECONDS, 2.0);
obs_data_set_default_int(settings, G_KEYFRAMES_INTERVAL_FRAMES, 300); obs_data_set_default_int(settings, S_KEYFRAMES_INTERVAL_FRAMES, 300);
} }
{ // Integrated Options { // Integrated Options
@@ -324,9 +324,9 @@ void obsffmpeg::encoder_factory::get_defaults(obs_data_t* settings)
static bool modified_keyframes(obs_properties_t* props, obs_property_t*, obs_data_t* settings) static bool modified_keyframes(obs_properties_t* props, obs_property_t*, obs_data_t* settings)
{ {
bool is_seconds = obs_data_get_int(settings, G_KEYFRAMES_INTERVALTYPE) == 0; bool is_seconds = obs_data_get_int(settings, S_KEYFRAMES_INTERVALTYPE) == 0;
obs_property_set_visible(obs_properties_get(props, G_KEYFRAMES_INTERVAL_FRAMES), !is_seconds); obs_property_set_visible(obs_properties_get(props, S_KEYFRAMES_INTERVAL_FRAMES), !is_seconds);
obs_property_set_visible(obs_properties_get(props, G_KEYFRAMES_INTERVAL_SECONDS), is_seconds); obs_property_set_visible(obs_properties_get(props, S_KEYFRAMES_INTERVAL_SECONDS), is_seconds);
return true; return true;
} }
@@ -344,30 +344,30 @@ void obsffmpeg::encoder_factory::get_properties(obs_properties_t* props)
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
obs_properties_add_group(props, G_KEYFRAMES, TRANSLATE(G_KEYFRAMES), OBS_GROUP_NORMAL, grp); obs_properties_add_group(props, S_KEYFRAMES, TRANSLATE(S_KEYFRAMES), OBS_GROUP_NORMAL, grp);
} }
{ {
auto p = auto p =
obs_properties_add_list(grp, G_KEYFRAMES_INTERVALTYPE, TRANSLATE(G_KEYFRAMES_INTERVALTYPE), obs_properties_add_list(grp, S_KEYFRAMES_INTERVALTYPE, TRANSLATE(S_KEYFRAMES_INTERVALTYPE),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(G_KEYFRAMES_INTERVALTYPE))); obs_property_set_long_description(p, TRANSLATE(DESC(S_KEYFRAMES_INTERVALTYPE)));
obs_property_set_modified_callback(p, modified_keyframes); obs_property_set_modified_callback(p, modified_keyframes);
obs_property_list_add_int(p, TRANSLATE(G_KEYFRAMES_INTERVALTYPE_(Seconds)), 0); obs_property_list_add_int(p, TRANSLATE(S_KEYFRAMES_INTERVALTYPE_(Seconds)), 0);
obs_property_list_add_int(p, TRANSLATE(G_KEYFRAMES_INTERVALTYPE_(Frames)), 1); obs_property_list_add_int(p, TRANSLATE(S_KEYFRAMES_INTERVALTYPE_(Frames)), 1);
} }
{ {
auto p = auto p =
obs_properties_add_float(grp, G_KEYFRAMES_INTERVAL_SECONDS, TRANSLATE(G_KEYFRAMES_INTERVAL), obs_properties_add_float(grp, S_KEYFRAMES_INTERVAL_SECONDS, TRANSLATE(S_KEYFRAMES_INTERVAL),
0.00, std::numeric_limits<int16_t>::max(), 0.01); 0.00, std::numeric_limits<int16_t>::max(), 0.01);
obs_property_set_long_description(p, TRANSLATE(DESC(G_KEYFRAMES_INTERVAL))); obs_property_set_long_description(p, TRANSLATE(DESC(S_KEYFRAMES_INTERVAL)));
obs_property_float_set_suffix(p, " seconds"); obs_property_float_set_suffix(p, " seconds");
} }
{ {
auto p = auto p =
obs_properties_add_int(grp, G_KEYFRAMES_INTERVAL_FRAMES, TRANSLATE(G_KEYFRAMES_INTERVAL), 0, obs_properties_add_int(grp, S_KEYFRAMES_INTERVAL_FRAMES, TRANSLATE(S_KEYFRAMES_INTERVAL), 0,
std::numeric_limits<int32_t>::max(), 1); std::numeric_limits<int32_t>::max(), 1);
obs_property_set_long_description(p, TRANSLATE(DESC(G_KEYFRAMES_INTERVAL))); obs_property_set_long_description(p, TRANSLATE(DESC(S_KEYFRAMES_INTERVAL)));
obs_property_int_set_suffix(p, " frames"); obs_property_int_set_suffix(p, " frames");
} }
} }
@@ -634,10 +634,10 @@ void obsffmpeg::encoder::get_properties(obs_properties_t* props)
} }
} }
obs_property_set_enabled(obs_properties_get(props, G_KEYFRAMES), false); obs_property_set_enabled(obs_properties_get(props, S_KEYFRAMES), false);
obs_property_set_enabled(obs_properties_get(props, G_KEYFRAMES_INTERVALTYPE), false); obs_property_set_enabled(obs_properties_get(props, S_KEYFRAMES_INTERVALTYPE), false);
obs_property_set_enabled(obs_properties_get(props, G_KEYFRAMES_INTERVAL_SECONDS), false); obs_property_set_enabled(obs_properties_get(props, S_KEYFRAMES_INTERVAL_SECONDS), false);
obs_property_set_enabled(obs_properties_get(props, G_KEYFRAMES_INTERVAL_FRAMES), false); obs_property_set_enabled(obs_properties_get(props, S_KEYFRAMES_INTERVAL_FRAMES), false);
obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_COLORFORMAT), false); obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_COLORFORMAT), false);
obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_THREADS), false); obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_THREADS), false);
@@ -660,14 +660,14 @@ bool obsffmpeg::encoder::update(obs_data_t* settings)
throw std::runtime_error("no video info"); throw std::runtime_error("no video info");
} }
int64_t kf_type = obs_data_get_int(settings, G_KEYFRAMES_INTERVALTYPE); int64_t kf_type = obs_data_get_int(settings, S_KEYFRAMES_INTERVALTYPE);
bool is_seconds = (kf_type == 0); bool is_seconds = (kf_type == 0);
if (is_seconds) { if (is_seconds) {
context->gop_size = static_cast<int>(obs_data_get_double(settings, G_KEYFRAMES_INTERVAL_SECONDS) context->gop_size = static_cast<int>(obs_data_get_double(settings, S_KEYFRAMES_INTERVAL_SECONDS)
* (ovi.fps_num / ovi.fps_den)); * (ovi.fps_num / ovi.fps_den));
} else { } else {
context->gop_size = static_cast<int>(obs_data_get_int(settings, G_KEYFRAMES_INTERVAL_FRAMES)); context->gop_size = static_cast<int>(obs_data_get_int(settings, S_KEYFRAMES_INTERVAL_FRAMES));
} }
context->keyint_min = context->gop_size; context->keyint_min = context->gop_size;
} }
+27 -27
View File
@@ -22,32 +22,32 @@
#pragma once #pragma once
#include "utility.hpp" #include "utility.hpp"
#define G_STATE_DEFAULT "State.Default" #define S_STATE_DEFAULT "State.Default"
#define G_STATE_DISABLED "State.Disabled" #define S_STATE_DISABLED "State.Disabled"
#define G_STATE_ENABLED "State.Enabled" #define S_STATE_ENABLED "State.Enabled"
#define G_STATE_AUTOMATIC "State.Automatic" #define S_STATE_AUTOMATIC "State.Automatic"
#define G_STATE_MANUAL "State.Manual" #define S_STATE_MANUAL "State.Manual"
#define G_RATECONTROL "RateControl" #define S_RATECONTROL "RateControl"
#define G_RATECONTROL_MODE "RateControl.Mode" #define S_RATECONTROL_MODE "RateControl.Mode"
#define G_RATECONTROL_MODE_(x) "RateControl.Mode." D_VSTR(x) #define S_RATECONTROL_MODE_(x) "RateControl.Mode." D_VSTR(x)
#define G_RATECONTROL_BITRATE_TARGET "RateControl.Bitrate.Target" #define S_RATECONTROL_BITRATE_TARGET "RateControl.Bitrate.Target"
#define G_RATECONTROL_BITRATE_MINIMUM "RateControl.Bitrate.Minimum" #define S_RATECONTROL_BITRATE_MINIMUM "RateControl.Bitrate.Minimum"
#define G_RATECONTROL_BITRATE_MAXIMUM "RateControl.Bitrate.Maximum" #define S_RATECONTROL_BITRATE_MAXIMUM "RateControl.Bitrate.Maximum"
#define G_RATECONTROL_BUFFERSIZE "RateControl.BufferSize" #define S_RATECONTROL_BUFFERSIZE "RateControl.BufferSize"
#define G_RATECONTROL_QUALITY_TARGET "RateControl.Quality.Target" #define S_RATECONTROL_QUALITY_TARGET "RateControl.Quality.Target"
#define G_RATECONTROL_QUALITY_MINIMUM "RateControl.Quality.Minimum" #define S_RATECONTROL_QUALITY_MINIMUM "RateControl.Quality.Minimum"
#define G_RATECONTROL_QUALITY_MAXIMUM "RateControl.Quality.Maximum" #define S_RATECONTROL_QUALITY_MAXIMUM "RateControl.Quality.Maximum"
#define G_RATECONTROL_QP_I "RateControl.QP.I" #define S_RATECONTROL_QP_I "RateControl.QP.I"
#define G_RATECONTROL_QP_P "RateControl.QP.P" #define S_RATECONTROL_QP_P "RateControl.QP.P"
#define G_RATECONTROL_QP_B "RateControl.QP.B" #define S_RATECONTROL_QP_B "RateControl.QP.B"
#define G_RATECONTROL_QP_I_INITIAL "RateControl.QP.I.Initial" #define S_RATECONTROL_QP_I_INITIAL "RateControl.QP.I.Initial"
#define G_RATECONTROL_QP_P_INITIAL "RateControl.QP.P.Initial" #define S_RATECONTROL_QP_P_INITIAL "RateControl.QP.P.Initial"
#define G_RATECONTROL_QP_B_INITIAL "RateControl.QP.B.Initial" #define S_RATECONTROL_QP_B_INITIAL "RateControl.QP.B.Initial"
#define G_KEYFRAMES "KeyFrames" #define S_KEYFRAMES "KeyFrames"
#define G_KEYFRAMES_INTERVALTYPE "KeyFrames.IntervalType" #define S_KEYFRAMES_INTERVALTYPE "KeyFrames.IntervalType"
#define G_KEYFRAMES_INTERVALTYPE_(x) "KeyFrames.IntervalType." D_VSTR(x) #define S_KEYFRAMES_INTERVALTYPE_(x) "KeyFrames.IntervalType." D_VSTR(x)
#define G_KEYFRAMES_INTERVAL "KeyFrames.Interval" #define S_KEYFRAMES_INTERVAL "KeyFrames.Interval"
#define G_KEYFRAMES_INTERVAL_SECONDS "KeyFrames.Interval.Seconds" #define S_KEYFRAMES_INTERVAL_SECONDS "KeyFrames.Interval.Seconds"
#define G_KEYFRAMES_INTERVAL_FRAMES "KeyFrames.Interval.Frames" #define S_KEYFRAMES_INTERVAL_FRAMES "KeyFrames.Interval.Frames"
+2 -2
View File
@@ -140,7 +140,7 @@ void obsffmpeg::ui::nvenc_h264_handler::get_encoder_properties(obs_properties_t*
auto p = obs_properties_add_list(grp, P_H264_PROFILE, TRANSLATE(P_H264_PROFILE), auto p = obs_properties_add_list(grp, P_H264_PROFILE, TRANSLATE(P_H264_PROFILE),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_H264_PROFILE))); obs_property_set_long_description(p, TRANSLATE(DESC(P_H264_PROFILE)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_DEFAULT), obs_property_list_add_int(p, TRANSLATE(S_STATE_DEFAULT),
static_cast<int64_t>(codecs::h264::profile::UNKNOWN)); static_cast<int64_t>(codecs::h264::profile::UNKNOWN));
for (auto const kv : profiles) { for (auto const kv : profiles) {
std::string trans = std::string(P_H264_PROFILE) + "." + kv.second; std::string trans = std::string(P_H264_PROFILE) + "." + kv.second;
@@ -151,7 +151,7 @@ void obsffmpeg::ui::nvenc_h264_handler::get_encoder_properties(obs_properties_t*
auto p = obs_properties_add_list(grp, P_H264_LEVEL, TRANSLATE(P_H264_LEVEL), auto p = obs_properties_add_list(grp, P_H264_LEVEL, TRANSLATE(P_H264_LEVEL),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_H264_LEVEL))); obs_property_set_long_description(p, TRANSLATE(DESC(P_H264_LEVEL)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_AUTOMATIC), obs_property_list_add_int(p, TRANSLATE(S_STATE_AUTOMATIC),
static_cast<int64_t>(codecs::h264::level::UNKNOWN)); static_cast<int64_t>(codecs::h264::level::UNKNOWN));
for (auto const kv : levels) { for (auto const kv : levels) {
obs_property_list_add_int(p, kv.second.c_str(), static_cast<int64_t>(kv.first)); obs_property_list_add_int(p, kv.second.c_str(), static_cast<int64_t>(kv.first));
+3 -3
View File
@@ -148,7 +148,7 @@ void obsffmpeg::ui::nvenc_hevc_handler::get_encoder_properties(obs_properties_t*
auto p = obs_properties_add_list(grp, P_HEVC_PROFILE, TRANSLATE(P_HEVC_PROFILE), auto p = obs_properties_add_list(grp, P_HEVC_PROFILE, TRANSLATE(P_HEVC_PROFILE),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_PROFILE))); obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_PROFILE)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_DEFAULT), obs_property_list_add_int(p, TRANSLATE(S_STATE_DEFAULT),
static_cast<int64_t>(codecs::hevc::profile::UNKNOWN)); static_cast<int64_t>(codecs::hevc::profile::UNKNOWN));
for (auto const kv : profiles) { for (auto const kv : profiles) {
std::string trans = std::string(P_HEVC_PROFILE) + "." + kv.second; std::string trans = std::string(P_HEVC_PROFILE) + "." + kv.second;
@@ -159,7 +159,7 @@ void obsffmpeg::ui::nvenc_hevc_handler::get_encoder_properties(obs_properties_t*
auto p = obs_properties_add_list(grp, P_HEVC_TIER, TRANSLATE(P_HEVC_TIER), OBS_COMBO_TYPE_LIST, auto p = obs_properties_add_list(grp, P_HEVC_TIER, TRANSLATE(P_HEVC_TIER), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT); OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_TIER))); obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_TIER)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_DEFAULT), obs_property_list_add_int(p, TRANSLATE(S_STATE_DEFAULT),
static_cast<int64_t>(codecs::hevc::tier::UNKNOWN)); static_cast<int64_t>(codecs::hevc::tier::UNKNOWN));
for (auto const kv : tiers) { for (auto const kv : tiers) {
std::string trans = std::string(P_HEVC_TIER) + "." + kv.second; std::string trans = std::string(P_HEVC_TIER) + "." + kv.second;
@@ -170,7 +170,7 @@ void obsffmpeg::ui::nvenc_hevc_handler::get_encoder_properties(obs_properties_t*
auto p = obs_properties_add_list(grp, P_HEVC_LEVEL, TRANSLATE(P_HEVC_LEVEL), auto p = obs_properties_add_list(grp, P_HEVC_LEVEL, TRANSLATE(P_HEVC_LEVEL),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_LEVEL))); obs_property_set_long_description(p, TRANSLATE(DESC(P_HEVC_LEVEL)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_AUTOMATIC), obs_property_list_add_int(p, TRANSLATE(S_STATE_AUTOMATIC),
static_cast<int64_t>(codecs::hevc::level::UNKNOWN)); static_cast<int64_t>(codecs::hevc::level::UNKNOWN));
for (auto const kv : levels) { for (auto const kv : levels) {
obs_property_list_add_int(p, kv.second.c_str(), static_cast<int64_t>(kv.first)); obs_property_list_add_int(p, kv.second.c_str(), static_cast<int64_t>(kv.first));
+226 -226
View File
@@ -33,60 +33,60 @@ extern "C" {
#pragma warning(pop) #pragma warning(pop)
} }
#define P_PRESET "NVENC.Preset" #define ST_PRESET "NVENC.Preset"
#define P_PRESET_(x) P_PRESET "." D_VSTR(x) #define ST_PRESET_(x) ST_PRESET "." D_VSTR(x)
#define P_RATECONTROL "NVENC.RateControl" #define ST_RATECONTROL "NVENC.RateControl"
#define P_RATECONTROL_MODE P_RATECONTROL ".Mode" #define ST_RATECONTROL_MODE ST_RATECONTROL ".Mode"
#define P_RATECONTROL_MODE_(x) P_RATECONTROL_MODE "." D_VSTR(x) #define ST_RATECONTROL_MODE_(x) ST_RATECONTROL_MODE "." D_VSTR(x)
#define P_RATECONTROL_TWOPASS P_RATECONTROL ".TwoPass" #define ST_RATECONTROL_TWOPASS ST_RATECONTROL ".TwoPass"
#define P_RATECONTROL_LOOKAHEAD P_RATECONTROL ".LookAhead" #define ST_RATECONTROL_LOOKAHEAD ST_RATECONTROL ".LookAhead"
#define P_RATECONTROL_ADAPTIVEI P_RATECONTROL ".AdaptiveI" #define ST_RATECONTROL_ADAPTIVEI ST_RATECONTROL ".AdaptiveI"
#define P_RATECONTROL_ADAPTIVEB P_RATECONTROL ".AdaptiveB" #define ST_RATECONTROL_ADAPTIVEB ST_RATECONTROL ".AdaptiveB"
#define P_RATECONTROL_BITRATE P_RATECONTROL ".Bitrate" #define ST_RATECONTROL_BITRATE ST_RATECONTROL ".Bitrate"
#define P_RATECONTROL_BITRATE_TARGET P_RATECONTROL_BITRATE ".Target" #define ST_RATECONTROL_BITRATE_TARGET ST_RATECONTROL_BITRATE ".Target"
#define P_RATECONTROL_BITRATE_MAXIMUM P_RATECONTROL_BITRATE ".Maximum" #define ST_RATECONTROL_BITRATE_MAXIMUM ST_RATECONTROL_BITRATE ".Maximum"
#define P_RATECONTROL_QUALITY P_RATECONTROL ".Quality" #define ST_RATECONTROL_QUALITY ST_RATECONTROL ".Quality"
#define P_RATECONTROL_QUALITY_MINIMUM P_RATECONTROL_QUALITY ".Minimum" #define ST_RATECONTROL_QUALITY_MINIMUM ST_RATECONTROL_QUALITY ".Minimum"
#define P_RATECONTROL_QUALITY_MAXIMUM P_RATECONTROL_QUALITY ".Maximum" #define ST_RATECONTROL_QUALITY_MAXIMUM ST_RATECONTROL_QUALITY ".Maximum"
#define P_RATECONTROL_QP P_RATECONTROL ".QP" #define ST_RATECONTROL_QP ST_RATECONTROL ".QP"
#define P_RATECONTROL_QP_I P_RATECONTROL_QP ".I" #define ST_RATECONTROL_QP_I ST_RATECONTROL_QP ".I"
#define P_RATECONTROL_QP_I_INITIAL P_RATECONTROL_QP_I ".Initial" #define ST_RATECONTROL_QP_I_INITIAL ST_RATECONTROL_QP_I ".Initial"
#define P_RATECONTROL_QP_P P_RATECONTROL_QP ".P" #define ST_RATECONTROL_QP_P ST_RATECONTROL_QP ".P"
#define P_RATECONTROL_QP_P_INITIAL P_RATECONTROL_QP_P ".Initial" #define ST_RATECONTROL_QP_ST_INITIAL ST_RATECONTROL_QP_P ".Initial"
#define P_RATECONTROL_QP_B P_RATECONTROL_QP ".B" #define ST_RATECONTROL_QP_B ST_RATECONTROL_QP ".B"
#define P_RATECONTROL_QP_B_INITIAL P_RATECONTROL_QP_B ".Initial" #define ST_RATECONTROL_QP_B_INITIAL ST_RATECONTROL_QP_B ".Initial"
#define P_AQ "NVENC.AQ" #define ST_AQ "NVENC.AQ"
#define P_AQ_SPATIAL P_AQ ".Spatial" #define ST_AQ_SPATIAL ST_AQ ".Spatial"
#define P_AQ_TEMPORAL P_AQ ".Temporal" #define ST_AQ_TEMPORAL ST_AQ ".Temporal"
#define P_AQ_STRENGTH P_AQ ".Strength" #define ST_AQ_STRENGTH ST_AQ ".Strength"
#define P_OTHER "NVENC.Other" #define ST_OTHER "NVENC.Other"
#define P_OTHER_BFRAMES P_OTHER ".BFrames" #define ST_OTHER_BFRAMES ST_OTHER ".BFrames"
#define P_OTHER_BFRAME_REFERENCEMODE P_OTHER ".BFrameReferenceMode" #define ST_OTHER_BFRAME_REFERENCEMODE ST_OTHER ".BFrameReferenceMode"
#define P_OTHER_ZEROLATENCY P_OTHER ".ZeroLatency" #define ST_OTHER_ZEROLATENCY ST_OTHER ".ZeroLatency"
#define P_OTHER_WEIGHTED_PREDICTION P_OTHER ".WeightedPrediction" #define ST_OTHER_WEIGHTED_PREDICTION ST_OTHER ".WeightedPrediction"
#define P_OTHER_NONREFERENCE_PFRAMES P_OTHER ".NonReferencePFrames" #define ST_OTHER_NONREFERENCE_PFRAMES ST_OTHER ".NonReferencePFrames"
using namespace obsffmpeg::nvenc; using namespace obsffmpeg::nvenc;
std::map<preset, std::string> obsffmpeg::nvenc::presets{ std::map<preset, std::string> obsffmpeg::nvenc::presets{
{preset::DEFAULT, P_PRESET_(Default)}, {preset::DEFAULT, ST_PRESET_(Default)},
{preset::SLOW, P_PRESET_(Slow)}, {preset::SLOW, ST_PRESET_(Slow)},
{preset::MEDIUM, P_PRESET_(Medium)}, {preset::MEDIUM, ST_PRESET_(Medium)},
{preset::FAST, P_PRESET_(Fast)}, {preset::FAST, ST_PRESET_(Fast)},
{preset::HIGH_PERFORMANCE, P_PRESET_(HighPerformance)}, {preset::HIGH_PERFORMANCE, ST_PRESET_(HighPerformance)},
{preset::HIGH_QUALITY, P_PRESET_(HighQuality)}, {preset::HIGH_QUALITY, ST_PRESET_(HighQuality)},
{preset::BLURAYDISC, P_PRESET_(BluRayDisc)}, {preset::BLURAYDISC, ST_PRESET_(BluRayDisc)},
{preset::LOW_LATENCY, P_PRESET_(LowLatency)}, {preset::LOW_LATENCY, ST_PRESET_(LowLatency)},
{preset::LOW_LATENCY_HIGH_PERFORMANCE, P_PRESET_(LowLatencyHighPerformance)}, {preset::LOW_LATENCY_HIGH_PERFORMANCE, ST_PRESET_(LowLatencyHighPerformance)},
{preset::LOW_LATENCY_HIGH_QUALITY, P_PRESET_(LowLatencyHighQuality)}, {preset::LOW_LATENCY_HIGH_QUALITY, ST_PRESET_(LowLatencyHighQuality)},
{preset::LOSSLESS, P_PRESET_(Lossless)}, {preset::LOSSLESS, ST_PRESET_(Lossless)},
{preset::LOSSLESS_HIGH_PERFORMANCE, P_PRESET_(LosslessHighPerformance)}, {preset::LOSSLESS_HIGH_PERFORMANCE, ST_PRESET_(LosslessHighPerformance)},
}; };
std::map<preset, std::string> obsffmpeg::nvenc::preset_to_opt{ std::map<preset, std::string> obsffmpeg::nvenc::preset_to_opt{
@@ -105,12 +105,12 @@ std::map<preset, std::string> obsffmpeg::nvenc::preset_to_opt{
}; };
std::map<ratecontrolmode, std::string> obsffmpeg::nvenc::ratecontrolmodes{ std::map<ratecontrolmode, std::string> obsffmpeg::nvenc::ratecontrolmodes{
{ratecontrolmode::CQP, P_RATECONTROL_MODE_(CQP)}, {ratecontrolmode::CQP, ST_RATECONTROL_MODE_(CQP)},
{ratecontrolmode::VBR, P_RATECONTROL_MODE_(VBR)}, {ratecontrolmode::VBR, ST_RATECONTROL_MODE_(VBR)},
{ratecontrolmode::VBR_HQ, P_RATECONTROL_MODE_(VBR_HQ)}, {ratecontrolmode::VBR_HQ, ST_RATECONTROL_MODE_(VBR_HQ)},
{ratecontrolmode::CBR, P_RATECONTROL_MODE_(CBR)}, {ratecontrolmode::CBR, ST_RATECONTROL_MODE_(CBR)},
{ratecontrolmode::CBR_HQ, P_RATECONTROL_MODE_(CBR_HQ)}, {ratecontrolmode::CBR_HQ, ST_RATECONTROL_MODE_(CBR_HQ)},
{ratecontrolmode::CBR_LD_HQ, P_RATECONTROL_MODE_(CBR_LD_HQ)}, {ratecontrolmode::CBR_LD_HQ, ST_RATECONTROL_MODE_(CBR_LD_HQ)},
}; };
std::map<ratecontrolmode, std::string> obsffmpeg::nvenc::ratecontrolmode_to_opt{ std::map<ratecontrolmode, std::string> obsffmpeg::nvenc::ratecontrolmode_to_opt{
@@ -119,9 +119,9 @@ std::map<ratecontrolmode, std::string> obsffmpeg::nvenc::ratecontrolmode_to_opt{
}; };
std::map<b_ref_mode, std::string> obsffmpeg::nvenc::b_ref_modes{ std::map<b_ref_mode, std::string> obsffmpeg::nvenc::b_ref_modes{
{b_ref_mode::DISABLED, G_STATE_DISABLED}, {b_ref_mode::DISABLED, S_STATE_DISABLED},
{b_ref_mode::EACH, P_OTHER_BFRAME_REFERENCEMODE ".Each"}, {b_ref_mode::EACH, ST_OTHER_BFRAME_REFERENCEMODE ".Each"},
{b_ref_mode::MIDDLE, P_OTHER_BFRAME_REFERENCEMODE ".Middle"}, {b_ref_mode::MIDDLE, ST_OTHER_BFRAME_REFERENCEMODE ".Middle"},
}; };
std::map<b_ref_mode, std::string> obsffmpeg::nvenc::b_ref_mode_to_opt{ std::map<b_ref_mode, std::string> obsffmpeg::nvenc::b_ref_mode_to_opt{
@@ -132,37 +132,37 @@ std::map<b_ref_mode, std::string> obsffmpeg::nvenc::b_ref_mode_to_opt{
void obsffmpeg::nvenc::get_defaults(obs_data_t* settings, const AVCodec*, AVCodecContext*) void obsffmpeg::nvenc::get_defaults(obs_data_t* settings, const AVCodec*, AVCodecContext*)
{ {
obs_data_set_default_int(settings, P_PRESET, static_cast<int64_t>(preset::DEFAULT)); obs_data_set_default_int(settings, ST_PRESET, static_cast<int64_t>(preset::DEFAULT));
obs_data_set_default_int(settings, P_RATECONTROL_MODE, static_cast<int64_t>(ratecontrolmode::CBR_HQ)); obs_data_set_default_int(settings, ST_RATECONTROL_MODE, static_cast<int64_t>(ratecontrolmode::CBR_HQ));
obs_data_set_default_int(settings, P_RATECONTROL_TWOPASS, -1); obs_data_set_default_int(settings, ST_RATECONTROL_TWOPASS, -1);
obs_data_set_default_int(settings, P_RATECONTROL_LOOKAHEAD, 0); obs_data_set_default_int(settings, ST_RATECONTROL_LOOKAHEAD, 0);
obs_data_set_default_bool(settings, P_RATECONTROL_ADAPTIVEI, true); obs_data_set_default_bool(settings, ST_RATECONTROL_ADAPTIVEI, true);
obs_data_set_default_bool(settings, P_RATECONTROL_ADAPTIVEB, true); obs_data_set_default_bool(settings, ST_RATECONTROL_ADAPTIVEB, true);
obs_data_set_default_int(settings, P_RATECONTROL_BITRATE_TARGET, 6000); obs_data_set_default_int(settings, ST_RATECONTROL_BITRATE_TARGET, 6000);
obs_data_set_default_int(settings, P_RATECONTROL_BITRATE_MAXIMUM, 6000); obs_data_set_default_int(settings, ST_RATECONTROL_BITRATE_MAXIMUM, 6000);
obs_data_set_default_int(settings, G_RATECONTROL_BUFFERSIZE, 12000); obs_data_set_default_int(settings, S_RATECONTROL_BUFFERSIZE, 12000);
obs_data_set_default_int(settings, P_RATECONTROL_QUALITY_MINIMUM, 51); obs_data_set_default_int(settings, ST_RATECONTROL_QUALITY_MINIMUM, 51);
obs_data_set_default_int(settings, P_RATECONTROL_QUALITY_MAXIMUM, -1); obs_data_set_default_int(settings, ST_RATECONTROL_QUALITY_MAXIMUM, -1);
obs_data_set_default_int(settings, P_RATECONTROL_QP_I, 21); obs_data_set_default_int(settings, ST_RATECONTROL_QP_I, 21);
obs_data_set_default_int(settings, P_RATECONTROL_QP_I_INITIAL, -1); obs_data_set_default_int(settings, ST_RATECONTROL_QP_I_INITIAL, -1);
obs_data_set_default_int(settings, P_RATECONTROL_QP_P, 21); obs_data_set_default_int(settings, ST_RATECONTROL_QP_P, 21);
obs_data_set_default_int(settings, P_RATECONTROL_QP_P_INITIAL, -1); obs_data_set_default_int(settings, ST_RATECONTROL_QP_ST_INITIAL, -1);
obs_data_set_default_int(settings, P_RATECONTROL_QP_B, 21); obs_data_set_default_int(settings, ST_RATECONTROL_QP_B, 21);
obs_data_set_default_int(settings, P_RATECONTROL_QP_B_INITIAL, -1); obs_data_set_default_int(settings, ST_RATECONTROL_QP_B_INITIAL, -1);
obs_data_set_default_bool(settings, P_AQ_SPATIAL, true); obs_data_set_default_bool(settings, ST_AQ_SPATIAL, true);
obs_data_set_default_int(settings, P_AQ_STRENGTH, 8); obs_data_set_default_int(settings, ST_AQ_STRENGTH, 8);
obs_data_set_default_bool(settings, P_AQ_TEMPORAL, true); obs_data_set_default_bool(settings, ST_AQ_TEMPORAL, true);
obs_data_set_default_int(settings, P_OTHER_BFRAMES, 2); obs_data_set_default_int(settings, ST_OTHER_BFRAMES, 2);
obs_data_set_default_int(settings, P_OTHER_BFRAME_REFERENCEMODE, static_cast<int64_t>(b_ref_mode::DISABLED)); obs_data_set_default_int(settings, ST_OTHER_BFRAME_REFERENCEMODE, static_cast<int64_t>(b_ref_mode::DISABLED));
obs_data_set_default_bool(settings, P_OTHER_ZEROLATENCY, false); obs_data_set_default_bool(settings, ST_OTHER_ZEROLATENCY, false);
obs_data_set_default_bool(settings, P_OTHER_WEIGHTED_PREDICTION, false); obs_data_set_default_bool(settings, ST_OTHER_WEIGHTED_PREDICTION, false);
obs_data_set_default_bool(settings, P_OTHER_NONREFERENCE_PFRAMES, false); obs_data_set_default_bool(settings, ST_OTHER_NONREFERENCE_PFRAMES, false);
} }
static bool modified_ratecontrol(obs_properties_t* props, obs_property_t*, obs_data_t* settings) static bool modified_ratecontrol(obs_properties_t* props, obs_property_t*, obs_data_t* settings)
@@ -175,7 +175,7 @@ static bool modified_ratecontrol(obs_properties_t* props, obs_property_t*, obs_d
bool have_qp = false; bool have_qp = false;
bool have_qp_init = false; bool have_qp_init = false;
ratecontrolmode rc = static_cast<ratecontrolmode>(obs_data_get_int(settings, P_RATECONTROL_MODE)); ratecontrolmode rc = static_cast<ratecontrolmode>(obs_data_get_int(settings, ST_RATECONTROL_MODE));
switch (rc) { switch (rc) {
case ratecontrolmode::CQP: case ratecontrolmode::CQP:
have_qp = true; have_qp = true;
@@ -194,46 +194,46 @@ static bool modified_ratecontrol(obs_properties_t* props, obs_property_t*, obs_d
break; break;
} }
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_BITRATE), have_bitrate || have_bitrate_max); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_BITRATE), have_bitrate || have_bitrate_max);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_BITRATE_TARGET), have_bitrate); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_BITRATE_TARGET), have_bitrate);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_BITRATE_MAXIMUM), have_bitrate_max); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_BITRATE_MAXIMUM), have_bitrate_max);
obs_property_set_visible(obs_properties_get(props, G_RATECONTROL_BUFFERSIZE), have_bitrate || have_bitrate_max); obs_property_set_visible(obs_properties_get(props, S_RATECONTROL_BUFFERSIZE), have_bitrate || have_bitrate_max);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QUALITY), have_quality); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QUALITY), have_quality);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QUALITY_MINIMUM), have_quality); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QUALITY_MINIMUM), have_quality);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QUALITY_MAXIMUM), have_quality); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QUALITY_MAXIMUM), have_quality);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_I), have_qp); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_I), have_qp);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_P), have_qp); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_P), have_qp);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_B), have_qp); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_B), have_qp);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_I_INITIAL), have_qp_init); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_I_INITIAL), have_qp_init);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_P_INITIAL), have_qp_init); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_ST_INITIAL), have_qp_init);
obs_property_set_visible(obs_properties_get(props, P_RATECONTROL_QP_B_INITIAL), have_qp_init); obs_property_set_visible(obs_properties_get(props, ST_RATECONTROL_QP_B_INITIAL), have_qp_init);
return true; return true;
} }
static bool modified_quality(obs_properties_t* props, obs_property_t*, obs_data_t* settings) static bool modified_quality(obs_properties_t* props, obs_property_t*, obs_data_t* settings)
{ {
bool enabled = obs_data_get_bool(settings, P_RATECONTROL_QUALITY); bool enabled = obs_data_get_bool(settings, ST_RATECONTROL_QUALITY);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QUALITY_MINIMUM), enabled); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QUALITY_MINIMUM), enabled);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QUALITY_MAXIMUM), enabled); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QUALITY_MAXIMUM), enabled);
return true; return true;
} }
static bool modified_aq(obs_properties_t* props, obs_property_t*, obs_data_t* settings) static bool modified_aq(obs_properties_t* props, obs_property_t*, obs_data_t* settings)
{ {
bool spatial_aq = obs_data_get_bool(settings, P_AQ_SPATIAL); bool spatial_aq = obs_data_get_bool(settings, ST_AQ_SPATIAL);
obs_property_set_visible(obs_properties_get(props, P_AQ_STRENGTH), spatial_aq); obs_property_set_visible(obs_properties_get(props, ST_AQ_STRENGTH), spatial_aq);
return true; return true;
} }
void obsffmpeg::nvenc::get_properties_pre(obs_properties_t* props, const AVCodec*) void obsffmpeg::nvenc::get_properties_pre(obs_properties_t* props, const AVCodec*)
{ {
{ {
auto p = obs_properties_add_list(props, P_PRESET, TRANSLATE(P_PRESET), OBS_COMBO_TYPE_LIST, auto p = obs_properties_add_list(props, ST_PRESET, TRANSLATE(ST_PRESET), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT); OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_PRESET))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_PRESET)));
for (auto kv : presets) { for (auto kv : presets) {
obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()), static_cast<int64_t>(kv.first)); obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()), static_cast<int64_t>(kv.first));
} }
@@ -246,13 +246,13 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
obs_properties_add_group(props, P_RATECONTROL, TRANSLATE(P_RATECONTROL), OBS_GROUP_NORMAL, grp); obs_properties_add_group(props, ST_RATECONTROL, TRANSLATE(ST_RATECONTROL), OBS_GROUP_NORMAL, grp);
} }
{ {
auto p = obs_properties_add_list(grp, P_RATECONTROL_MODE, TRANSLATE(P_RATECONTROL_MODE), auto p = obs_properties_add_list(grp, ST_RATECONTROL_MODE, TRANSLATE(ST_RATECONTROL_MODE),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_MODE))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_MODE)));
obs_property_set_modified_callback(p, modified_ratecontrol); obs_property_set_modified_callback(p, modified_ratecontrol);
for (auto kv : ratecontrolmodes) { for (auto kv : ratecontrolmodes) {
obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()), obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()),
@@ -261,29 +261,29 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
} }
{ {
auto p = obs_properties_add_list(grp, P_RATECONTROL_TWOPASS, TRANSLATE(P_RATECONTROL_TWOPASS), auto p = obs_properties_add_list(grp, ST_RATECONTROL_TWOPASS, TRANSLATE(ST_RATECONTROL_TWOPASS),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_TWOPASS))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_TWOPASS)));
obs_property_list_add_int(p, TRANSLATE(G_STATE_DEFAULT), -1); obs_property_list_add_int(p, TRANSLATE(S_STATE_DEFAULT), -1);
obs_property_list_add_int(p, TRANSLATE(G_STATE_DISABLED), 0); obs_property_list_add_int(p, TRANSLATE(S_STATE_DISABLED), 0);
obs_property_list_add_int(p, TRANSLATE(G_STATE_ENABLED), 1); obs_property_list_add_int(p, TRANSLATE(S_STATE_ENABLED), 1);
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_LOOKAHEAD, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_LOOKAHEAD,
TRANSLATE(P_RATECONTROL_LOOKAHEAD), 0, 60, 1); TRANSLATE(ST_RATECONTROL_LOOKAHEAD), 0, 60, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_LOOKAHEAD))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_LOOKAHEAD)));
obs_property_int_set_suffix(p, " frames"); obs_property_int_set_suffix(p, " frames");
} }
{ {
auto p = auto p =
obs_properties_add_bool(grp, P_RATECONTROL_ADAPTIVEI, TRANSLATE(P_RATECONTROL_ADAPTIVEI)); obs_properties_add_bool(grp, ST_RATECONTROL_ADAPTIVEI, TRANSLATE(ST_RATECONTROL_ADAPTIVEI));
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_ADAPTIVEI))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_ADAPTIVEI)));
} }
if (strcmp(codec->name, "h264_nvenc") == 0) { if (strcmp(codec->name, "h264_nvenc") == 0) {
auto p = auto p =
obs_properties_add_bool(grp, P_RATECONTROL_ADAPTIVEB, TRANSLATE(P_RATECONTROL_ADAPTIVEB)); obs_properties_add_bool(grp, ST_RATECONTROL_ADAPTIVEB, TRANSLATE(ST_RATECONTROL_ADAPTIVEB));
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_ADAPTIVEB))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_ADAPTIVEB)));
} }
} }
@@ -291,29 +291,29 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
obs_properties_add_group(props, P_RATECONTROL_BITRATE, TRANSLATE(P_RATECONTROL_BITRATE), obs_properties_add_group(props, ST_RATECONTROL_BITRATE, TRANSLATE(ST_RATECONTROL_BITRATE),
OBS_GROUP_NORMAL, grp); OBS_GROUP_NORMAL, grp);
} }
{ {
auto p = obs_properties_add_int(grp, P_RATECONTROL_BITRATE_TARGET, auto p = obs_properties_add_int(grp, ST_RATECONTROL_BITRATE_TARGET,
TRANSLATE(P_RATECONTROL_BITRATE_TARGET), 1, TRANSLATE(ST_RATECONTROL_BITRATE_TARGET), 1,
std::numeric_limits<int32_t>::max(), 1); std::numeric_limits<int32_t>::max(), 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_BITRATE_TARGET))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_BITRATE_TARGET)));
obs_property_int_set_suffix(p, " kbit/s"); obs_property_int_set_suffix(p, " kbit/s");
} }
{ {
auto p = obs_properties_add_int(grp, P_RATECONTROL_BITRATE_MAXIMUM, auto p = obs_properties_add_int(grp, ST_RATECONTROL_BITRATE_MAXIMUM,
TRANSLATE(P_RATECONTROL_BITRATE_MAXIMUM), 0, TRANSLATE(ST_RATECONTROL_BITRATE_MAXIMUM), 0,
std::numeric_limits<int32_t>::max(), 1); std::numeric_limits<int32_t>::max(), 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_BITRATE_MAXIMUM))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_BITRATE_MAXIMUM)));
obs_property_int_set_suffix(p, " kbit/s"); obs_property_int_set_suffix(p, " kbit/s");
} }
{ {
auto p = auto p =
obs_properties_add_int(grp, G_RATECONTROL_BUFFERSIZE, TRANSLATE(G_RATECONTROL_BUFFERSIZE), obs_properties_add_int(grp, S_RATECONTROL_BUFFERSIZE, TRANSLATE(S_RATECONTROL_BUFFERSIZE),
0, std::numeric_limits<int32_t>::max(), 1); 0, std::numeric_limits<int32_t>::max(), 1);
obs_property_set_long_description(p, TRANSLATE(DESC(G_RATECONTROL_BUFFERSIZE))); obs_property_set_long_description(p, TRANSLATE(DESC(S_RATECONTROL_BUFFERSIZE)));
obs_property_int_set_suffix(p, " kbit"); obs_property_int_set_suffix(p, " kbit");
} }
} }
@@ -322,64 +322,64 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
auto p = obs_properties_add_group(props, P_RATECONTROL_QUALITY, auto p = obs_properties_add_group(props, ST_RATECONTROL_QUALITY,
TRANSLATE(P_RATECONTROL_QUALITY), OBS_GROUP_CHECKABLE, grp); TRANSLATE(ST_RATECONTROL_QUALITY), OBS_GROUP_CHECKABLE, grp);
obs_property_set_modified_callback(p, modified_quality); obs_property_set_modified_callback(p, modified_quality);
} else { } else {
auto p = auto p =
obs_properties_add_bool(props, P_RATECONTROL_QUALITY, TRANSLATE(P_RATECONTROL_QUALITY)); obs_properties_add_bool(props, ST_RATECONTROL_QUALITY, TRANSLATE(ST_RATECONTROL_QUALITY));
obs_property_set_modified_callback(p, modified_quality); obs_property_set_modified_callback(p, modified_quality);
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QUALITY_MINIMUM, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QUALITY_MINIMUM,
TRANSLATE(P_RATECONTROL_QUALITY_MINIMUM), 0, 51, 1); TRANSLATE(ST_RATECONTROL_QUALITY_MINIMUM), 0, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QUALITY_MINIMUM))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QUALITY_MINIMUM)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QUALITY_MAXIMUM, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QUALITY_MAXIMUM,
TRANSLATE(P_RATECONTROL_QUALITY_MAXIMUM), -1, 51, 1); TRANSLATE(ST_RATECONTROL_QUALITY_MAXIMUM), -1, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QUALITY_MAXIMUM))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QUALITY_MAXIMUM)));
} }
} }
{ {
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
auto p = obs_properties_add_group(props, P_RATECONTROL_QP, TRANSLATE(P_RATECONTROL_QP), auto p = obs_properties_add_group(props, ST_RATECONTROL_QP, TRANSLATE(ST_RATECONTROL_QP),
OBS_GROUP_CHECKABLE, grp); OBS_GROUP_CHECKABLE, grp);
obs_property_set_modified_callback(p, modified_quality); obs_property_set_modified_callback(p, modified_quality);
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_I, TRANSLATE(P_RATECONTROL_QP_I), auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_I, TRANSLATE(ST_RATECONTROL_QP_I),
0, 51, 1); 0, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_I))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_I)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_I_INITIAL, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_I_INITIAL,
TRANSLATE(P_RATECONTROL_QP_I_INITIAL), -1, 51, 1); TRANSLATE(ST_RATECONTROL_QP_I_INITIAL), -1, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_I_INITIAL))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_I_INITIAL)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_P, TRANSLATE(P_RATECONTROL_QP_P), auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_P, TRANSLATE(ST_RATECONTROL_QP_P),
0, 51, 1); 0, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_P))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_P)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_P_INITIAL, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_ST_INITIAL,
TRANSLATE(P_RATECONTROL_QP_P_INITIAL), -1, 51, 1); TRANSLATE(ST_RATECONTROL_QP_ST_INITIAL), -1, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_P_INITIAL))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_ST_INITIAL)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_B, TRANSLATE(P_RATECONTROL_QP_B), auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_B, TRANSLATE(ST_RATECONTROL_QP_B),
0, 51, 1); 0, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_B))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_B)));
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_RATECONTROL_QP_B_INITIAL, auto p = obs_properties_add_int_slider(grp, ST_RATECONTROL_QP_B_INITIAL,
TRANSLATE(P_RATECONTROL_QP_B_INITIAL), -1, 51, 1); TRANSLATE(ST_RATECONTROL_QP_B_INITIAL), -1, 51, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_RATECONTROL_QP_B_INITIAL))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_RATECONTROL_QP_B_INITIAL)));
} }
} }
@@ -387,21 +387,21 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
obs_properties_add_group(props, P_AQ, TRANSLATE(P_AQ), OBS_GROUP_NORMAL, grp); obs_properties_add_group(props, ST_AQ, TRANSLATE(ST_AQ), OBS_GROUP_NORMAL, grp);
} }
{ {
auto p = obs_properties_add_bool(grp, P_AQ_SPATIAL, TRANSLATE(P_AQ_SPATIAL)); auto p = obs_properties_add_bool(grp, ST_AQ_SPATIAL, TRANSLATE(ST_AQ_SPATIAL));
obs_property_set_long_description(p, TRANSLATE(DESC(P_AQ_SPATIAL))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_AQ_SPATIAL)));
obs_property_set_modified_callback(p, modified_aq); obs_property_set_modified_callback(p, modified_aq);
} }
{ {
auto p = obs_properties_add_int_slider(grp, P_AQ_STRENGTH, TRANSLATE(P_AQ_STRENGTH), 1, 15, 1); auto p = obs_properties_add_int_slider(grp, ST_AQ_STRENGTH, TRANSLATE(ST_AQ_STRENGTH), 1, 15, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_AQ_STRENGTH))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_AQ_STRENGTH)));
} }
{ {
auto p = obs_properties_add_bool(grp, P_AQ_TEMPORAL, TRANSLATE(P_AQ_TEMPORAL)); auto p = obs_properties_add_bool(grp, ST_AQ_TEMPORAL, TRANSLATE(ST_AQ_TEMPORAL));
obs_property_set_long_description(p, TRANSLATE(DESC(P_AQ_TEMPORAL))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_AQ_TEMPORAL)));
} }
} }
@@ -409,21 +409,21 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
obs_properties_t* grp = props; obs_properties_t* grp = props;
if (!obsffmpeg::are_property_groups_broken()) { if (!obsffmpeg::are_property_groups_broken()) {
grp = obs_properties_create(); grp = obs_properties_create();
obs_properties_add_group(props, P_OTHER, TRANSLATE(P_OTHER), OBS_GROUP_NORMAL, grp); obs_properties_add_group(props, ST_OTHER, TRANSLATE(ST_OTHER), OBS_GROUP_NORMAL, grp);
} }
{ {
auto p = auto p =
obs_properties_add_int_slider(grp, P_OTHER_BFRAMES, TRANSLATE(P_OTHER_BFRAMES), 0, 4, 1); obs_properties_add_int_slider(grp, ST_OTHER_BFRAMES, TRANSLATE(ST_OTHER_BFRAMES), 0, 4, 1);
obs_property_set_long_description(p, TRANSLATE(DESC(P_OTHER_BFRAMES))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_OTHER_BFRAMES)));
obs_property_int_set_suffix(p, " frames"); obs_property_int_set_suffix(p, " frames");
} }
{ {
auto p = obs_properties_add_list(grp, P_OTHER_BFRAME_REFERENCEMODE, auto p = obs_properties_add_list(grp, ST_OTHER_BFRAME_REFERENCEMODE,
TRANSLATE(P_OTHER_BFRAME_REFERENCEMODE), OBS_COMBO_TYPE_LIST, TRANSLATE(ST_OTHER_BFRAME_REFERENCEMODE), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT); OBS_COMBO_FORMAT_INT);
obs_property_set_long_description(p, TRANSLATE(DESC(P_OTHER_BFRAME_REFERENCEMODE))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_OTHER_BFRAME_REFERENCEMODE)));
for (auto kv : b_ref_modes) { for (auto kv : b_ref_modes) {
obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()), obs_property_list_add_int(p, TRANSLATE(kv.second.c_str()),
static_cast<int64_t>(kv.first)); static_cast<int64_t>(kv.first));
@@ -431,63 +431,63 @@ void obsffmpeg::nvenc::get_properties_post(obs_properties_t* props, const AVCode
} }
{ {
auto p = obs_properties_add_bool(grp, P_OTHER_ZEROLATENCY, TRANSLATE(P_OTHER_ZEROLATENCY)); auto p = obs_properties_add_bool(grp, ST_OTHER_ZEROLATENCY, TRANSLATE(ST_OTHER_ZEROLATENCY));
obs_property_set_long_description(p, TRANSLATE(DESC(P_OTHER_ZEROLATENCY))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_OTHER_ZEROLATENCY)));
} }
{ {
auto p = obs_properties_add_bool(grp, P_OTHER_WEIGHTED_PREDICTION, auto p = obs_properties_add_bool(grp, ST_OTHER_WEIGHTED_PREDICTION,
TRANSLATE(P_OTHER_WEIGHTED_PREDICTION)); TRANSLATE(ST_OTHER_WEIGHTED_PREDICTION));
obs_property_set_long_description(p, TRANSLATE(DESC(P_OTHER_WEIGHTED_PREDICTION))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_OTHER_WEIGHTED_PREDICTION)));
} }
{ {
auto p = obs_properties_add_bool(grp, P_OTHER_NONREFERENCE_PFRAMES, auto p = obs_properties_add_bool(grp, ST_OTHER_NONREFERENCE_PFRAMES,
TRANSLATE(P_OTHER_NONREFERENCE_PFRAMES)); TRANSLATE(ST_OTHER_NONREFERENCE_PFRAMES));
obs_property_set_long_description(p, TRANSLATE(DESC(P_OTHER_NONREFERENCE_PFRAMES))); obs_property_set_long_description(p, TRANSLATE(DESC(ST_OTHER_NONREFERENCE_PFRAMES)));
} }
} }
} }
void obsffmpeg::nvenc::get_runtime_properties(obs_properties_t* props, const AVCodec*, AVCodecContext*) void obsffmpeg::nvenc::get_runtime_properties(obs_properties_t* props, const AVCodec*, AVCodecContext*)
{ {
obs_property_set_enabled(obs_properties_get(props, P_PRESET), false); obs_property_set_enabled(obs_properties_get(props, ST_PRESET), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_MODE), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_MODE), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_TWOPASS), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_TWOPASS), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_LOOKAHEAD), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_LOOKAHEAD), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_ADAPTIVEI), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_ADAPTIVEI), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_ADAPTIVEB), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_ADAPTIVEB), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_BITRATE), true); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_BITRATE), true);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_BITRATE_TARGET), true); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_BITRATE_TARGET), true);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_BITRATE_MAXIMUM), true); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_BITRATE_MAXIMUM), true);
obs_property_set_enabled(obs_properties_get(props, G_RATECONTROL_BUFFERSIZE), true); obs_property_set_enabled(obs_properties_get(props, S_RATECONTROL_BUFFERSIZE), true);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QUALITY), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QUALITY), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QUALITY_MINIMUM), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QUALITY_MINIMUM), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QUALITY_MAXIMUM), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QUALITY_MAXIMUM), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_I), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_I), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_I_INITIAL), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_I_INITIAL), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_P), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_P), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_P_INITIAL), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_ST_INITIAL), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_B), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_B), false);
obs_property_set_enabled(obs_properties_get(props, P_RATECONTROL_QP_B_INITIAL), false); obs_property_set_enabled(obs_properties_get(props, ST_RATECONTROL_QP_B_INITIAL), false);
obs_property_set_enabled(obs_properties_get(props, P_AQ), false); obs_property_set_enabled(obs_properties_get(props, ST_AQ), false);
obs_property_set_enabled(obs_properties_get(props, P_AQ_SPATIAL), false); obs_property_set_enabled(obs_properties_get(props, ST_AQ_SPATIAL), false);
obs_property_set_enabled(obs_properties_get(props, P_AQ_STRENGTH), false); obs_property_set_enabled(obs_properties_get(props, ST_AQ_STRENGTH), false);
obs_property_set_enabled(obs_properties_get(props, P_AQ_TEMPORAL), false); obs_property_set_enabled(obs_properties_get(props, ST_AQ_TEMPORAL), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER_BFRAMES), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER_BFRAMES), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER_BFRAME_REFERENCEMODE), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER_BFRAME_REFERENCEMODE), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER_ZEROLATENCY), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER_ZEROLATENCY), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER_WEIGHTED_PREDICTION), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER_WEIGHTED_PREDICTION), false);
obs_property_set_enabled(obs_properties_get(props, P_OTHER_NONREFERENCE_PFRAMES), false); obs_property_set_enabled(obs_properties_get(props, ST_OTHER_NONREFERENCE_PFRAMES), false);
} }
void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context)
{ {
{ {
preset c_preset = static_cast<preset>(obs_data_get_int(settings, P_PRESET)); preset c_preset = static_cast<preset>(obs_data_get_int(settings, ST_PRESET));
auto found = preset_to_opt.find(c_preset); auto found = preset_to_opt.find(c_preset);
if (found != preset_to_opt.end()) { if (found != preset_to_opt.end()) {
av_opt_set(context->priv_data, "preset", found->second.c_str(), 0); av_opt_set(context->priv_data, "preset", found->second.c_str(), 0);
@@ -504,7 +504,7 @@ void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCode
bool have_qp = false; bool have_qp = false;
bool have_qp_init = false; bool have_qp_init = false;
ratecontrolmode rc = static_cast<ratecontrolmode>(obs_data_get_int(settings, P_RATECONTROL_MODE)); ratecontrolmode rc = static_cast<ratecontrolmode>(obs_data_get_int(settings, ST_RATECONTROL_MODE));
auto rcopt = nvenc::ratecontrolmode_to_opt.find(rc); auto rcopt = nvenc::ratecontrolmode_to_opt.find(rc);
if (rcopt != nvenc::ratecontrolmode_to_opt.end()) { if (rcopt != nvenc::ratecontrolmode_to_opt.end()) {
av_opt_set(context->priv_data, "rc", rcopt->second.c_str(), 0); av_opt_set(context->priv_data, "rc", rcopt->second.c_str(), 0);
@@ -530,63 +530,63 @@ void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCode
break; break;
} }
int tp = static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_TWOPASS)); int tp = static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_TWOPASS));
if (tp >= 0) { if (tp >= 0) {
av_opt_set_int(context->priv_data, "2pass", tp ? 1 : 0, 0); av_opt_set_int(context->priv_data, "2pass", tp ? 1 : 0, 0);
} }
int la = static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_LOOKAHEAD)); int la = static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_LOOKAHEAD));
av_opt_set_int(context->priv_data, "lookahead", la, 0); av_opt_set_int(context->priv_data, "lookahead", la, 0);
if (la > 0) { if (la > 0) {
bool adapt_i = obs_data_get_bool(settings, P_RATECONTROL_ADAPTIVEI); bool adapt_i = obs_data_get_bool(settings, ST_RATECONTROL_ADAPTIVEI);
av_opt_set_int(context->priv_data, "no-scenecut", !adapt_i ? 1 : 0, 0); av_opt_set_int(context->priv_data, "no-scenecut", !adapt_i ? 1 : 0, 0);
if (strcmp(codec->name, "h264_nvenc")) { if (strcmp(codec->name, "h264_nvenc")) {
bool adapt_b = obs_data_get_bool(settings, P_RATECONTROL_ADAPTIVEB); bool adapt_b = obs_data_get_bool(settings, ST_RATECONTROL_ADAPTIVEB);
av_opt_set_int(context->priv_data, "b_adapt", adapt_b ? 1 : 0, 0); av_opt_set_int(context->priv_data, "b_adapt", adapt_b ? 1 : 0, 0);
} }
} }
if (have_bitrate) if (have_bitrate)
context->bit_rate = context->bit_rate =
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_BITRATE_TARGET) * 1000); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_TARGET) * 1000);
if (have_bitrate_max) if (have_bitrate_max)
context->rc_max_rate = context->rc_max_rate =
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_BITRATE_MAXIMUM) * 1000); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_MAXIMUM) * 1000);
if (have_bitrate || have_bitrate_max) if (have_bitrate || have_bitrate_max)
context->rc_buffer_size = context->rc_buffer_size =
static_cast<int>(obs_data_get_int(settings, G_RATECONTROL_BUFFERSIZE) * 1000); static_cast<int>(obs_data_get_int(settings, S_RATECONTROL_BUFFERSIZE) * 1000);
if (have_quality_min && obs_data_get_bool(settings, P_RATECONTROL_QUALITY)) { if (have_quality_min && obs_data_get_bool(settings, ST_RATECONTROL_QUALITY)) {
int qmin = static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_QUALITY_MINIMUM)); int qmin = static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_QUALITY_MINIMUM));
context->qmin = qmin; context->qmin = qmin;
if ((qmin >= 0) && (have_quality_max)) { if ((qmin >= 0) && (have_quality_max)) {
context->qmax = context->qmax =
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_QUALITY_MAXIMUM)); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_QUALITY_MAXIMUM));
} }
} }
if (have_qp) { if (have_qp) {
av_opt_set_int(context->priv_data, "init_qpI", av_opt_set_int(context->priv_data, "init_qpI",
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_QP_I)), 0); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_QP_I)), 0);
av_opt_set_int(context->priv_data, "init_qpP", av_opt_set_int(context->priv_data, "init_qpP",
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_QP_P)), 0); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_QP_P)), 0);
av_opt_set_int(context->priv_data, "init_qpB", av_opt_set_int(context->priv_data, "init_qpB",
static_cast<int>(obs_data_get_int(settings, P_RATECONTROL_QP_B)), 0); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_QP_B)), 0);
} }
if (have_qp_init) { if (have_qp_init) {
av_opt_set_int(context->priv_data, "init_qpI", av_opt_set_int(context->priv_data, "init_qpI",
obs_data_get_int(settings, P_RATECONTROL_QP_I_INITIAL), 0); obs_data_get_int(settings, ST_RATECONTROL_QP_I_INITIAL), 0);
av_opt_set_int(context->priv_data, "init_qpP", av_opt_set_int(context->priv_data, "init_qpP",
obs_data_get_int(settings, P_RATECONTROL_QP_P_INITIAL), 0); obs_data_get_int(settings, ST_RATECONTROL_QP_ST_INITIAL), 0);
av_opt_set_int(context->priv_data, "init_qpB", av_opt_set_int(context->priv_data, "init_qpB",
obs_data_get_int(settings, P_RATECONTROL_QP_B_INITIAL), 0); obs_data_get_int(settings, ST_RATECONTROL_QP_B_INITIAL), 0);
} }
} }
{ // AQ { // AQ
bool saq = obs_data_get_bool(settings, P_AQ_SPATIAL); bool saq = obs_data_get_bool(settings, ST_AQ_SPATIAL);
bool taq = obs_data_get_bool(settings, P_AQ_TEMPORAL); bool taq = obs_data_get_bool(settings, ST_AQ_TEMPORAL);
if (strcmp(codec->name, "h264_nvenc")) { if (strcmp(codec->name, "h264_nvenc")) {
av_opt_set_int(context->priv_data, "spatial-aq", saq ? 1 : 0, 0); av_opt_set_int(context->priv_data, "spatial-aq", saq ? 1 : 0, 0);
@@ -597,16 +597,16 @@ void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCode
} }
if (saq) { if (saq) {
av_opt_set_int(context->priv_data, "aq-strength", av_opt_set_int(context->priv_data, "aq-strength",
static_cast<int>(obs_data_get_int(settings, P_AQ_STRENGTH)), 0); static_cast<int>(obs_data_get_int(settings, ST_AQ_STRENGTH)), 0);
} }
} }
{ // Other { // Other
bool zl = obs_data_get_bool(settings, P_OTHER_ZEROLATENCY); bool zl = obs_data_get_bool(settings, ST_OTHER_ZEROLATENCY);
bool wp = obs_data_get_bool(settings, P_OTHER_WEIGHTED_PREDICTION); bool wp = obs_data_get_bool(settings, ST_OTHER_WEIGHTED_PREDICTION);
bool nrp = obs_data_get_bool(settings, P_OTHER_NONREFERENCE_PFRAMES); bool nrp = obs_data_get_bool(settings, ST_OTHER_NONREFERENCE_PFRAMES);
context->max_b_frames = static_cast<int>(obs_data_get_int(settings, P_OTHER_BFRAMES)); context->max_b_frames = static_cast<int>(obs_data_get_int(settings, ST_OTHER_BFRAMES));
av_opt_set_int(context->priv_data, "zerolatency", zl ? 1 : 0, 0); av_opt_set_int(context->priv_data, "zerolatency", zl ? 1 : 0, 0);
av_opt_set_int(context->priv_data, "nonref_p", nrp ? 1 : 0, 0); av_opt_set_int(context->priv_data, "nonref_p", nrp ? 1 : 0, 0);
@@ -620,7 +620,7 @@ void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCode
{ {
auto found = b_ref_mode_to_opt.find( auto found = b_ref_mode_to_opt.find(
static_cast<b_ref_mode>(obs_data_get_int(settings, P_OTHER_BFRAME_REFERENCEMODE))); static_cast<b_ref_mode>(obs_data_get_int(settings, ST_OTHER_BFRAME_REFERENCEMODE)));
if (found != b_ref_mode_to_opt.end()) { if (found != b_ref_mode_to_opt.end()) {
av_opt_set(context->priv_data, "b_ref_mode", found->second.c_str(), 0); av_opt_set(context->priv_data, "b_ref_mode", found->second.c_str(), 0);
} }