3 Commits

Author SHA1 Message Date
Michael Fabian 'Xaymar' Dirks 9f23ffc009 plugin: Don't add audio encoders
This is a temporary workaround until OBS supports selecting audio format for each stream.
2020-01-02 12:31:38 +01:00
Michael Fabian 'Xaymar' Dirks d21687e348 ui/prores_aw: Fix support for future FFmpeg versions
The encoder changes profile names in an update to FFmpeg which makes it completely incompatible with the current plugin.
2019-12-14 00:22:23 +01:00
Michael Fabian 'Xaymar' Dirks 0d574b81ff ui/nvenc: Export bitrate for OBS Studio to use
This should improve Replay Buffer and Low Latency Networking code, which may result in drastically better streaming with less dropped frames. I don't know why OBS Studio does it this way instead of just calculating the true kbit/sec bitrate by itself, but I guess this is just another case of "it works so it stayed in".
2019-11-17 12:21:02 +01:00
3 changed files with 43 additions and 29 deletions
+2 -2
View File
@@ -106,8 +106,8 @@ try {
if (!av_codec_is_encoder(cdc)) if (!av_codec_is_encoder(cdc))
continue; continue;
if ((cdc->type == AVMediaType::AVMEDIA_TYPE_AUDIO) if (/*(cdc->type == AVMediaType::AVMEDIA_TYPE_AUDIO)
|| (cdc->type == AVMediaType::AVMEDIA_TYPE_VIDEO)) { || */(cdc->type == AVMediaType::AVMEDIA_TYPE_VIDEO)) {
auto ptr = std::make_shared<obsffmpeg::encoder_factory>(cdc); auto ptr = std::make_shared<obsffmpeg::encoder_factory>(cdc);
ptr->register_encoder(); ptr->register_encoder();
generic_factories.emplace(cdc, ptr); generic_factories.emplace(cdc, ptr);
+8 -1
View File
@@ -198,6 +198,9 @@ void obsffmpeg::nvenc::get_defaults(obs_data_t* settings, const AVCodec*, AVCode
obs_data_set_default_int(settings, ST_OTHER_ZEROLATENCY, -1); obs_data_set_default_int(settings, ST_OTHER_ZEROLATENCY, -1);
obs_data_set_default_int(settings, ST_OTHER_WEIGHTED_PREDICTION, -1); obs_data_set_default_int(settings, ST_OTHER_WEIGHTED_PREDICTION, -1);
obs_data_set_default_int(settings, ST_OTHER_NONREFERENCE_PFRAMES, -1); obs_data_set_default_int(settings, ST_OTHER_NONREFERENCE_PFRAMES, -1);
// Replay Buffer
obs_data_set_default_int(settings, "bitrate", 0);
} }
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)
@@ -595,9 +598,13 @@ void obsffmpeg::nvenc::update(obs_data_t* settings, const AVCodec* codec, AVCode
} }
} }
if (have_bitrate) if (have_bitrate) {
context->bit_rate = context->bit_rate =
static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_TARGET) * 1000); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_TARGET) * 1000);
// Support for Replay Buffer
obs_data_set_int(settings, "bitrate",
obs_data_get_int(settings, ST_RATECONTROL_BITRATE_TARGET));
}
if (have_bitrate_max) if (have_bitrate_max)
context->rc_max_rate = context->rc_max_rate =
static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_MAXIMUM) * 1000); static_cast<int>(obs_data_get_int(settings, ST_RATECONTROL_BITRATE_MAXIMUM) * 1000);
+33 -26
View File
@@ -21,6 +21,7 @@
#include "prores_aw_handler.hpp" #include "prores_aw_handler.hpp"
#include "codecs/prores.hpp" #include "codecs/prores.hpp"
#include "ffmpeg/tools.hpp"
#include "plugin.hpp" #include "plugin.hpp"
#include "utility.hpp" #include "utility.hpp"
@@ -65,6 +66,26 @@ void obsffmpeg::ui::prores_aw_handler::get_defaults(obs_data_t* settings, const
obs_data_set_default_int(settings, P_PRORES_PROFILE, 0); obs_data_set_default_int(settings, P_PRORES_PROFILE, 0);
} }
inline const char* profile_to_name(const AVProfile* ptr)
{
switch (ptr->profile) {
case 0:
return TRANSLATE(P_PRORES_PROFILE_APCO);
case 1:
return TRANSLATE(P_PRORES_PROFILE_APCS);
case 2:
return TRANSLATE(P_PRORES_PROFILE_APCN);
case 3:
return TRANSLATE(P_PRORES_PROFILE_APCH);
case 4:
return TRANSLATE(P_PRORES_PROFILE_AP4H);
case 5:
return TRANSLATE(P_PRORES_PROFILE_AP4X);
default:
return ptr->name;
}
}
void obsffmpeg::ui::prores_aw_handler::get_properties(obs_properties_t* props, const AVCodec* codec, void obsffmpeg::ui::prores_aw_handler::get_properties(obs_properties_t* props, const AVCodec* codec,
AVCodecContext* context, bool) AVCodecContext* context, bool)
{ {
@@ -73,27 +94,7 @@ void obsffmpeg::ui::prores_aw_handler::get_properties(obs_properties_t* props, c
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_PRORES_PROFILE))); obs_property_set_long_description(p, TRANSLATE(DESC(P_PRORES_PROFILE)));
for (auto ptr = codec->profiles; ptr->profile != FF_PROFILE_UNKNOWN; ptr++) { for (auto ptr = codec->profiles; ptr->profile != FF_PROFILE_UNKNOWN; ptr++) {
if (strcmp("apco", ptr->name) == 0) { obs_property_list_add_int(p, profile_to_name(ptr), static_cast<int64_t>(ptr->profile));
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_APCO),
static_cast<int64_t>(ptr->profile));
} else if (strcmp("apcs", ptr->name) == 0) {
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_APCS),
static_cast<int64_t>(ptr->profile));
} else if (strcmp("apcn", ptr->name) == 0) {
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_APCN),
static_cast<int64_t>(ptr->profile));
} else if (strcmp("apch", ptr->name) == 0) {
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_APCH),
static_cast<int64_t>(ptr->profile));
} else if (strcmp("ap4h", ptr->name) == 0) {
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_AP4H),
static_cast<int64_t>(ptr->profile));
} else if (strcmp("ap4x", ptr->name) == 0) {
obs_property_list_add_int(p, TRANSLATE(P_PRORES_PROFILE_AP4X),
static_cast<int64_t>(ptr->profile));
} else {
obs_property_list_add_int(p, ptr->name, ptr->profile);
}
} }
} else { } else {
obs_property_set_enabled(obs_properties_get(props, P_PRORES_PROFILE), false); obs_property_set_enabled(obs_properties_get(props, P_PRORES_PROFILE), false);
@@ -105,12 +106,18 @@ void obsffmpeg::ui::prores_aw_handler::update(obs_data_t* settings, const AVCode
context->profile = static_cast<int>(obs_data_get_int(settings, P_PRORES_PROFILE)); context->profile = static_cast<int>(obs_data_get_int(settings, P_PRORES_PROFILE));
} }
void obsffmpeg::ui::prores_aw_handler::log_options(obs_data_t* settings, const AVCodec* codec, AVCodecContext*) void obsffmpeg::ui::prores_aw_handler::log_options(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context)
{ {
for (auto ptr = codec->profiles; ptr->profile != FF_PROFILE_UNKNOWN; ptr++) { PLOG_INFO("[%s] Apple ProRes:", codec->name);
if (ptr->profile == static_cast<int>(obs_data_get_int(settings, P_PRORES_PROFILE))) ffmpeg::tools::print_av_option_string(context, "profile", " Profile", [&codec](int64_t v) {
PLOG_INFO("[%s] Profile: %s", codec->name, ptr->name); int val = static_cast<int>(v);
} for (auto ptr = codec->profiles; (ptr->profile != FF_PROFILE_UNKNOWN) && (ptr != nullptr); ptr++) {
if (ptr->profile == val) {
return std::string(profile_to_name(ptr));
}
}
return std::string("<Unknown>");
});
} }
void obsffmpeg::ui::prores_aw_handler::process_avpacket(AVPacket& packet, const AVCodec*, AVCodecContext*) void obsffmpeg::ui::prores_aw_handler::process_avpacket(AVPacket& packet, const AVCodec*, AVCodecContext*)