From a9f39527f600b1e943bed1282275e4c4b3d90201 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Fri, 27 Sep 2019 12:35:34 +0200 Subject: [PATCH] handler: Additional functionality for handlers Allows overriding color format, encoder info, importing and exporting from/to ffmpeg command line and most importantly logging actual settings to the log file. --- source/encoder.cpp | 38 +++++++++++++++++++++++++++++++++++--- source/ui/handler.cpp | 18 ++++++++++++++++++ source/ui/handler.hpp | 16 ++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/source/encoder.cpp b/source/encoder.cpp index 6930f8e..1fcbd92 100644 --- a/source/encoder.cpp +++ b/source/encoder.cpp @@ -591,9 +591,6 @@ obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool i } } - // Update settings - update(settings); - // Create 8MB of precached Packet data for use later on. av_init_packet(&_current_packet); av_new_packet(&_current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size. @@ -610,6 +607,13 @@ obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool i // Find the best conversion format. std::vector fmts = ffmpeg::tools::get_software_formats(_codec->pix_fmts); _pixfmt_target = ffmpeg::tools::get_best_compatible_format(fmts.data(), _pixfmt_source); + + { // Allow Handler to override the automatic color format for sanity reasons. + auto ptr = obsffmpeg::find_codec_handler(_codec->name); + if (ptr) { + ptr->override_colorformat(_pixfmt_target, settings, _codec, _context); + } + } } else { // Use user override, guaranteed to be supported. bool is_format_supported = false; @@ -661,6 +665,26 @@ obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool i } } + { // Log Encoder info + const char* id = obs_encoder_get_id(_self); + PLOG_INFO("[%s] Initializing...", id); + PLOG_INFO("[%s] Video Input: %ldx%ld %s %s %s", id, _swscale.get_source_width(), + _swscale.get_source_height(), + ffmpeg::tools::get_pixel_format_name(_swscale.get_source_format()), + ffmpeg::tools::get_color_space_name(_swscale.get_source_colorspace()), + _swscale.is_source_full_range() ? "Full" : "Partial"); + PLOG_INFO("[%s] Video Output: %ldx%ld %s %s %s", id, _swscale.get_target_width(), + _swscale.get_target_height(), + ffmpeg::tools::get_pixel_format_name(_swscale.get_target_format()), + ffmpeg::tools::get_color_space_name(_swscale.get_target_colorspace()), + _swscale.is_target_full_range() ? "Full" : "Partial"); + PLOG_INFO("[%s] Framerate: %ld/%ld (%f", id, _context->time_base.num, _context->time_base.den, + _context->time_base.num / _context->time_base.den); + } + + // Update settings + update(settings); + // Initialize Encoder int res = avcodec_open2(_context, _codec, NULL); if (res < 0) { @@ -752,6 +776,14 @@ bool obsffmpeg::encoder::update(obs_data_t* settings) av_opt_set_from_string(_context->priv_data, obs_data_get_string(settings, ST_FFMPEG_CUSTOMSETTINGS), nullptr, "=", ";"); } + + { // Handler Logging + auto ptr = obsffmpeg::find_codec_handler(_codec->name); + if (ptr) { + ptr->log_options(settings, _codec, _context); + } + } + return false; } diff --git a/source/ui/handler.cpp b/source/ui/handler.cpp index 3c133c2..cd208ce 100644 --- a/source/ui/handler.cpp +++ b/source/ui/handler.cpp @@ -22,3 +22,21 @@ #include "handler.hpp" void obsffmpeg::ui::handler::override_visible_name(const AVCodec*, std::string&) {} + +void obsffmpeg::ui::handler::override_info(obs_encoder_info* main, obs_encoder_info* fallback) {} + +void obsffmpeg::ui::handler::override_colorformat(AVPixelFormat& target_format, obs_data_t* settings, + const AVCodec* codec, AVCodecContext* context) +{} + +void obsffmpeg::ui::handler::log_options(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) {} + +void obsffmpeg::ui::handler::import_from_ffmpeg(const std::string ffmpeg, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{} + +std::string obsffmpeg::ui::handler::export_for_ffmpeg(obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{ + return std::string(); +} diff --git a/source/ui/handler.hpp b/source/ui/handler.hpp index f5ce02e..eb646ba 100644 --- a/source/ui/handler.hpp +++ b/source/ui/handler.hpp @@ -24,7 +24,10 @@ #include extern "C" { +#include + #include +#include #include #pragma warning(push) #pragma warning(disable : 4244) @@ -38,6 +41,11 @@ namespace obsffmpeg { public: virtual void override_visible_name(const AVCodec* codec, std::string& name); + virtual void override_info(obs_encoder_info* main, obs_encoder_info* fallback); + + virtual void override_colorformat(AVPixelFormat& target_format, obs_data_t* settings, + const AVCodec* codec, AVCodecContext* context); + virtual void get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) = 0; @@ -45,6 +53,14 @@ namespace obsffmpeg { AVCodecContext* context) = 0; virtual void update(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) = 0; + + virtual void log_options(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context); + + virtual void import_from_ffmpeg(const std::string ffmpeg, obs_data_t* settings, + const AVCodec* codec, AVCodecContext* context); + + virtual std::string export_for_ffmpeg(obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context); }; } // namespace ui } // namespace obsffmpeg