encoder: Rename class from generic to encoder

This commit is contained in:
Michael Fabian 'Xaymar' Dirks
2019-07-24 19:51:05 +02:00
parent adeea2fb43
commit 7c3e313bcd
4 changed files with 65 additions and 58 deletions
+2 -2
View File
@@ -261,8 +261,8 @@ set(PROJECT_GENERATED
"${PROJECT_BINARY_DIR}/source/version.hpp" "${PROJECT_BINARY_DIR}/source/version.hpp"
) )
set(PROJECT_PRIVATE set(PROJECT_PRIVATE
"${PROJECT_SOURCE_DIR}/source/generic.hpp" "${PROJECT_SOURCE_DIR}/source/encoder.hpp"
"${PROJECT_SOURCE_DIR}/source/generic.cpp" "${PROJECT_SOURCE_DIR}/source/encoder.cpp"
"${PROJECT_SOURCE_DIR}/source/plugin.cpp" "${PROJECT_SOURCE_DIR}/source/plugin.cpp"
"${PROJECT_SOURCE_DIR}/source/plugin.hpp" "${PROJECT_SOURCE_DIR}/source/plugin.hpp"
"${PROJECT_SOURCE_DIR}/source/utility.cpp" "${PROJECT_SOURCE_DIR}/source/utility.cpp"
+38 -38
View File
@@ -19,7 +19,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE. // SOFTWARE.
#include "generic.hpp" #include "encoder.hpp"
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
#include <thread> #include <thread>
@@ -51,11 +51,11 @@ extern "C" {
enum class keyframe_type { Seconds, Frames }; enum class keyframe_type { Seconds, Frames };
encoder::generic_factory::generic_factory(AVCodec* codec) : avcodec_ptr(codec), info() {} obsffmpeg::encoder_factory::encoder_factory(AVCodec* codec) : avcodec_ptr(codec), info() {}
encoder::generic_factory::~generic_factory() {} obsffmpeg::encoder_factory::~encoder_factory() {}
void encoder::generic_factory::register_encoder() void obsffmpeg::encoder_factory::register_encoder()
{ {
// Generate unique name from given Id // Generate unique name from given Id
{ {
@@ -109,7 +109,7 @@ void encoder::generic_factory::register_encoder()
// Register functions. // Register functions.
this->info.oei.create = [](obs_data_t* settings, obs_encoder_t* encoder) { this->info.oei.create = [](obs_data_t* settings, obs_encoder_t* encoder) {
try { try {
return reinterpret_cast<void*>(new generic(settings, encoder)); return reinterpret_cast<void*>(new obsffmpeg::encoder(settings, encoder));
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
return reinterpret_cast<void*>(0); return reinterpret_cast<void*>(0);
@@ -120,7 +120,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.destroy = [](void* ptr) { this->info.oei.destroy = [](void* ptr) {
try { try {
delete reinterpret_cast<generic*>(ptr); delete reinterpret_cast<encoder*>(ptr);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -131,7 +131,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.get_name = [](void* type_data) { this->info.oei.get_name = [](void* type_data) {
try { try {
return reinterpret_cast<generic_factory*>(type_data)->get_name(); return reinterpret_cast<encoder_factory*>(type_data)->get_name();
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -142,7 +142,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.get_defaults2 = [](obs_data_t* settings, void* type_data) { this->info.oei.get_defaults2 = [](obs_data_t* settings, void* type_data) {
try { try {
reinterpret_cast<generic_factory*>(type_data)->get_defaults(settings); reinterpret_cast<encoder_factory*>(type_data)->get_defaults(settings);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -155,10 +155,10 @@ void encoder::generic_factory::register_encoder()
try { try {
obs_properties_t* props = obs_properties_create(); obs_properties_t* props = obs_properties_create();
if (type_data != nullptr) { if (type_data != nullptr) {
reinterpret_cast<generic_factory*>(type_data)->get_properties(props); reinterpret_cast<encoder_factory*>(type_data)->get_properties(props);
} }
if (ptr != nullptr) { if (ptr != nullptr) {
reinterpret_cast<generic*>(ptr)->get_properties(props); reinterpret_cast<encoder*>(ptr)->get_properties(props);
} }
return props; return props;
} catch (std::exception const& e) { } catch (std::exception const& e) {
@@ -171,7 +171,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.update = [](void* ptr, obs_data_t* settings) { this->info.oei.update = [](void* ptr, obs_data_t* settings) {
try { try {
return reinterpret_cast<generic*>(ptr)->update(settings); return reinterpret_cast<encoder*>(ptr)->update(settings);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -182,7 +182,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.get_sei_data = [](void* ptr, uint8_t** sei_data, size_t* size) { this->info.oei.get_sei_data = [](void* ptr, uint8_t** sei_data, size_t* size) {
try { try {
return reinterpret_cast<generic*>(ptr)->get_sei_data(sei_data, size); return reinterpret_cast<encoder*>(ptr)->get_sei_data(sei_data, size);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -193,7 +193,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.get_extra_data = [](void* ptr, uint8_t** extra_data, size_t* size) { this->info.oei.get_extra_data = [](void* ptr, uint8_t** extra_data, size_t* size) {
try { try {
return reinterpret_cast<generic*>(ptr)->get_extra_data(extra_data, size); return reinterpret_cast<encoder*>(ptr)->get_extra_data(extra_data, size);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -206,7 +206,7 @@ void encoder::generic_factory::register_encoder()
if (this->avcodec_ptr->type == AVMediaType::AVMEDIA_TYPE_VIDEO) { if (this->avcodec_ptr->type == AVMediaType::AVMEDIA_TYPE_VIDEO) {
this->info.oei.get_video_info = [](void* ptr, struct video_scale_info* info) { this->info.oei.get_video_info = [](void* ptr, struct video_scale_info* info) {
try { try {
reinterpret_cast<generic*>(ptr)->get_video_info(info); reinterpret_cast<encoder*>(ptr)->get_video_info(info);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -218,7 +218,7 @@ void encoder::generic_factory::register_encoder()
this->info.oei.encode = [](void* ptr, struct encoder_frame* frame, struct encoder_packet* packet, this->info.oei.encode = [](void* ptr, struct encoder_frame* frame, struct encoder_packet* packet,
bool* received_packet) { bool* received_packet) {
try { try {
return reinterpret_cast<generic*>(ptr)->video_encode(frame, packet, received_packet); return reinterpret_cast<encoder*>(ptr)->video_encode(frame, packet, received_packet);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -231,7 +231,7 @@ void encoder::generic_factory::register_encoder()
uint64_t* next_key, struct encoder_packet* packet, uint64_t* next_key, struct encoder_packet* packet,
bool* received_packet) { bool* received_packet) {
try { try {
return reinterpret_cast<generic*>(ptr)->video_encode_texture( return reinterpret_cast<encoder*>(ptr)->video_encode_texture(
handle, pts, lock_key, next_key, packet, received_packet); handle, pts, lock_key, next_key, packet, received_packet);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
@@ -245,7 +245,7 @@ void encoder::generic_factory::register_encoder()
} else if (this->avcodec_ptr->type == AVMediaType::AVMEDIA_TYPE_AUDIO) { } else if (this->avcodec_ptr->type == AVMediaType::AVMEDIA_TYPE_AUDIO) {
this->info.oei.get_audio_info = [](void* ptr, struct audio_convert_info* info) { this->info.oei.get_audio_info = [](void* ptr, struct audio_convert_info* info) {
try { try {
reinterpret_cast<generic*>(ptr)->get_audio_info(info); reinterpret_cast<encoder*>(ptr)->get_audio_info(info);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -256,7 +256,7 @@ void encoder::generic_factory::register_encoder()
}; };
this->info.oei.get_frame_size = [](void* ptr) { this->info.oei.get_frame_size = [](void* ptr) {
try { try {
return reinterpret_cast<generic*>(ptr)->get_frame_size(); return reinterpret_cast<encoder*>(ptr)->get_frame_size();
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -268,7 +268,7 @@ void encoder::generic_factory::register_encoder()
this->info.oei.encode = [](void* ptr, struct encoder_frame* frame, struct encoder_packet* packet, this->info.oei.encode = [](void* ptr, struct encoder_frame* frame, struct encoder_packet* packet,
bool* received_packet) { bool* received_packet) {
try { try {
return reinterpret_cast<generic*>(ptr)->audio_encode(frame, packet, received_packet); return reinterpret_cast<encoder*>(ptr)->audio_encode(frame, packet, received_packet);
} catch (std::exception const& e) { } catch (std::exception const& e) {
PLOG_ERROR("exception: %s", e.what()); PLOG_ERROR("exception: %s", e.what());
throw e; throw e;
@@ -287,12 +287,12 @@ void encoder::generic_factory::register_encoder()
avcodec_ptr->name, avcodec_ptr->long_name, avcodec_ptr->capabilities); avcodec_ptr->name, avcodec_ptr->long_name, avcodec_ptr->capabilities);
} }
const char* encoder::generic_factory::get_name() const char* obsffmpeg::encoder_factory::get_name()
{ {
return this->info.readable_name.c_str(); return this->info.readable_name.c_str();
} }
void encoder::generic_factory::get_defaults(obs_data_t* settings) void obsffmpeg::encoder_factory::get_defaults(obs_data_t* settings)
{ {
{ // Handler { // Handler
auto ptr = obsffmpeg::find_codec_handler(this->avcodec_ptr->name); auto ptr = obsffmpeg::find_codec_handler(this->avcodec_ptr->name);
@@ -310,7 +310,7 @@ void encoder::generic_factory::get_defaults(obs_data_t* settings)
} }
} }
void encoder::generic_factory::get_properties(obs_properties_t* props) void obsffmpeg::encoder_factory::get_properties(obs_properties_t* props)
{ {
{ // Handler { // Handler
auto ptr = obsffmpeg::find_codec_handler(this->avcodec_ptr->name); auto ptr = obsffmpeg::find_codec_handler(this->avcodec_ptr->name);
@@ -366,15 +366,15 @@ void encoder::generic_factory::get_properties(obs_properties_t* props)
}; };
} }
AVCodec* encoder::generic_factory::get_avcodec() AVCodec* obsffmpeg::encoder_factory::get_avcodec()
{ {
return this->avcodec_ptr; return this->avcodec_ptr;
} }
encoder::generic::generic(obs_data_t* settings, obs_encoder_t* encoder) obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder)
: self(encoder), lag_in_frames(0), frame_count(0) : self(encoder), lag_in_frames(0), frame_count(0)
{ {
this->factory = reinterpret_cast<generic_factory*>(obs_encoder_get_type_data(self)); this->factory = reinterpret_cast<encoder_factory*>(obs_encoder_get_type_data(self));
// Verify that the codec actually still exists. // Verify that the codec actually still exists.
this->codec = avcodec_find_encoder_by_name(this->factory->get_avcodec()->name); this->codec = avcodec_find_encoder_by_name(this->factory->get_avcodec()->name);
@@ -548,7 +548,7 @@ encoder::generic::generic(obs_data_t* settings, obs_encoder_t* encoder)
av_new_packet(&this->current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size. av_new_packet(&this->current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size.
} }
encoder::generic::~generic() obsffmpeg::encoder::~encoder()
{ {
av_packet_unref(&this->current_packet); av_packet_unref(&this->current_packet);
@@ -562,7 +562,7 @@ encoder::generic::~generic()
} }
} }
void encoder::generic::get_properties(obs_properties_t* props) void obsffmpeg::encoder::get_properties(obs_properties_t* props)
{ {
{ // Handler { // Handler
auto ptr = obsffmpeg::find_codec_handler(this->codec->name); auto ptr = obsffmpeg::find_codec_handler(this->codec->name);
@@ -576,7 +576,7 @@ void encoder::generic::get_properties(obs_properties_t* props)
obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_STANDARDCOMPLIANCE), false); obs_property_set_enabled(obs_properties_get(props, P_FFMPEG_STANDARDCOMPLIANCE), false);
} }
bool encoder::generic::update(obs_data_t* settings) bool obsffmpeg::encoder::update(obs_data_t* settings)
{ {
{ // Handler { // Handler
auto ptr = obsffmpeg::find_codec_handler(this->codec->name); auto ptr = obsffmpeg::find_codec_handler(this->codec->name);
@@ -593,26 +593,26 @@ bool encoder::generic::update(obs_data_t* settings)
return false; return false;
} }
void encoder::generic::get_audio_info(audio_convert_info*) {} void obsffmpeg::encoder::get_audio_info(audio_convert_info*) {}
size_t encoder::generic::get_frame_size() size_t obsffmpeg::encoder::get_frame_size()
{ {
return size_t(); return size_t();
} }
bool encoder::generic::audio_encode(encoder_frame*, encoder_packet*, bool*) bool obsffmpeg::encoder::audio_encode(encoder_frame*, encoder_packet*, bool*)
{ {
return false; return false;
} }
void encoder::generic::get_video_info(video_scale_info*) {} void obsffmpeg::encoder::get_video_info(video_scale_info*) {}
bool encoder::generic::get_sei_data(uint8_t**, size_t*) bool obsffmpeg::encoder::get_sei_data(uint8_t**, size_t*)
{ {
return false; return false;
} }
bool encoder::generic::get_extra_data(uint8_t** extra_data, size_t* size) bool obsffmpeg::encoder::get_extra_data(uint8_t** extra_data, size_t* size)
{ {
if (!this->context->extradata) { if (!this->context->extradata) {
return false; return false;
@@ -652,7 +652,7 @@ static inline void copy_data(encoder_frame* frame, AVFrame* vframe)
} }
} }
bool encoder::generic::video_encode(encoder_frame* frame, encoder_packet* packet, bool* received_packet) bool obsffmpeg::encoder::video_encode(encoder_frame* frame, encoder_packet* packet, bool* received_packet)
{ {
// Convert frame. // Convert frame.
std::shared_ptr<AVFrame> vframe = frame_queue.pop(); // Retrieve an empty frame. std::shared_ptr<AVFrame> vframe = frame_queue.pop(); // Retrieve an empty frame.
@@ -776,12 +776,12 @@ bool encoder::generic::video_encode(encoder_frame* frame, encoder_packet* packet
return true; return true;
} }
bool encoder::generic::video_encode_texture(uint32_t, int64_t, uint64_t, uint64_t*, encoder_packet*, bool*) bool obsffmpeg::encoder::video_encode_texture(uint32_t, int64_t, uint64_t, uint64_t*, encoder_packet*, bool*)
{ {
return false; return false;
} }
int encoder::generic::receive_packet(bool* received_packet, struct encoder_packet* packet) int obsffmpeg::encoder::receive_packet(bool* received_packet, struct encoder_packet* packet)
{ {
int res = avcodec_receive_packet(this->context, &this->current_packet); int res = avcodec_receive_packet(this->context, &this->current_packet);
if (res == 0) { if (res == 0) {
@@ -803,7 +803,7 @@ int encoder::generic::receive_packet(bool* received_packet, struct encoder_packe
return res; return res;
} }
int encoder::generic::send_frame(std::shared_ptr<AVFrame> const frame) int obsffmpeg::encoder::send_frame(std::shared_ptr<AVFrame> const frame)
{ {
int res = avcodec_send_frame(this->context, frame.get()); int res = avcodec_send_frame(this->context, frame.get());
switch (res) { switch (res) {
+19 -10
View File
@@ -22,14 +22,23 @@
#pragma once #pragma once
#include <condition_variable> #include <condition_variable>
#include <encoder.hpp>
#include <mutex> #include <mutex>
#include <thread> #include <thread>
#include "ffmpeg/avframe-queue.hpp" #include "ffmpeg/avframe-queue.hpp"
#include "ffmpeg/swscale.hpp" #include "ffmpeg/swscale.hpp"
namespace encoder { extern "C" {
class generic_factory { #include <obs.h>
#include <obs-properties.h>
#pragma warning(push)
#pragma warning(disable : 4244)
#include <libavcodec/avcodec.h>
#include <libavutil/frame.h>
#pragma warning(pop)
}
namespace obsffmpeg {
class encoder_factory {
struct info { struct info {
std::string uid; std::string uid;
std::string codec; std::string codec;
@@ -39,8 +48,8 @@ namespace encoder {
AVCodec* avcodec_ptr; AVCodec* avcodec_ptr;
public: public:
generic_factory(AVCodec* codec); encoder_factory(AVCodec* codec);
virtual ~generic_factory(); virtual ~encoder_factory();
void register_encoder(); void register_encoder();
@@ -57,9 +66,9 @@ namespace encoder {
obs_data_t* settings); obs_data_t* settings);
}; };
class generic { class encoder {
obs_encoder_t* self; obs_encoder_t* self;
generic_factory* factory; encoder_factory* factory;
AVCodec* codec; AVCodec* codec;
AVCodecContext* context; AVCodecContext* context;
@@ -73,8 +82,8 @@ namespace encoder {
int64_t frame_count; int64_t frame_count;
public: public:
generic(obs_data_t* settings, obs_encoder_t* encoder); encoder(obs_data_t* settings, obs_encoder_t* encoder);
virtual ~generic(); virtual ~encoder();
public: // OBS API public: // OBS API
// Shared // Shared
@@ -105,4 +114,4 @@ namespace encoder {
int send_frame(std::shared_ptr<AVFrame> frame); int send_frame(std::shared_ptr<AVFrame> frame);
}; };
} // namespace encoder } // namespace obsffmpeg
+6 -8
View File
@@ -21,11 +21,11 @@
#include "plugin.hpp" #include "plugin.hpp"
#include <memory> #include <memory>
#include "encoders/generic.hpp" #include "encoder.hpp"
#include "encoders/prores_aw.hpp"
#include "ui/debug_handler.hpp" #include "ui/debug_handler.hpp"
#include "ui/handler.hpp" #include "ui/handler.hpp"
#include "utility.hpp" #include "utility.hpp"
#include <map>
extern "C" { extern "C" {
#include <obs-module.h> #include <obs-module.h>
@@ -64,7 +64,7 @@ bool obsffmpeg::has_codec_handler(std::string const codec)
return (found != codec_to_handler_map.end()); return (found != codec_to_handler_map.end());
} }
static std::map<AVCodec*, std::shared_ptr<encoder::generic_factory>> generic_factories; static std::map<AVCodec*, std::shared_ptr<obsffmpeg::encoder_factory>> generic_factories;
MODULE_EXPORT bool obs_module_load(void) MODULE_EXPORT bool obs_module_load(void)
try { try {
@@ -83,15 +83,14 @@ try {
continue; continue;
if ((cdc->type == AVMediaType::AVMEDIA_TYPE_AUDIO) || (cdc->type == AVMediaType::AVMEDIA_TYPE_VIDEO)) { if ((cdc->type == AVMediaType::AVMEDIA_TYPE_AUDIO) || (cdc->type == AVMediaType::AVMEDIA_TYPE_VIDEO)) {
auto ptr = std::make_shared<encoder::generic_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);
} }
} }
obsffmpeg::encoder::prores_aw::initialize();
return true; return true;
} catch (std::exception const& ex) { } catch (std::exception& ex) {
PLOG_ERROR("Exception during initalization: %s.", ex.what()); PLOG_ERROR("Exception during initalization: %s.", ex.what());
return false; return false;
} catch (...) { } catch (...) {
@@ -101,13 +100,12 @@ try {
MODULE_EXPORT void obs_module_unload(void) MODULE_EXPORT void obs_module_unload(void)
try { try {
obsffmpeg::encoder::prores_aw::finalize();
// Run all finalizers. // Run all finalizers.
for (auto const func : obsffmpeg::finalizers) { for (auto const func : obsffmpeg::finalizers) {
func(); func();
} }
} catch (std::exception const& ex) { } catch (std::exception& ex) {
PLOG_ERROR("Exception during finalizing: %s.", ex.what()); PLOG_ERROR("Exception during finalizing: %s.", ex.what());
} catch (...) { } catch (...) {
PLOG_ERROR("Unrecognized exception during finalizing."); PLOG_ERROR("Unrecognized exception during finalizing.");