Files
obs-vfw-encoders/Source/enc-vfw.cpp
T

153 lines
4.5 KiB
C++
Raw Normal View History

2017-03-15 15:28:17 +01:00
#include "enc-vfw.h"
#include "libobs/obs-encoder.h"
#include <list>
#include <vector>
#include <map>
2017-03-15 17:14:30 +01:00
std::map<std::string, VFW::Info*> _IdToInfo;
#define snprintf sprintf_s
2017-03-15 15:28:17 +01:00
bool VFW::Initialize() {
// Initialize all VFW Encoders (we can only use one anyway)
ICINFO icinfo;
std::memset(&icinfo, 0, sizeof(ICINFO));
icinfo.dwSize = sizeof(icinfo);
DWORD fccType = 0;
for (size_t i = 0; ICInfo(fccType, i, &icinfo); i++) {
HIC hIC = ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY);
if (hIC) {
if (ICGetInfo(hIC, &icinfo, sizeof(icinfo))) {
std::vector<char> idBuf(64);
snprintf(idBuf.data(), idBuf.size(), "%ls", icinfo.szName);
std::vector<char> nameBuf(1024);
snprintf(nameBuf.data(), nameBuf.size(), "%ls (" PLUGIN_NAME ")", icinfo.szDescription);
// Track
2017-03-15 17:14:30 +01:00
VFW::Info* info = new VFW::Info();
info->Id = std::string(idBuf.data());
info->Name = std::string(nameBuf.data());
info->icInfo = icinfo;
2017-03-15 15:28:17 +01:00
// Register
2017-03-15 17:14:30 +01:00
std::memset(&info->obsInfo, 0, sizeof(obs_encoder_info));
info->obsInfo.id = info->Id.data();
info->obsInfo.type = OBS_ENCODER_VIDEO;
info->obsInfo.codec = "vidc";
info->obsInfo.type_data = info; // circular reference but whatever, it's not reference counted
info->obsInfo.get_name = VFW::Encoder::get_name;
info->obsInfo.create = VFW::Encoder::create;
info->obsInfo.destroy = VFW::Encoder::destroy;
info->obsInfo.encode = VFW::Encoder::encode;
info->obsInfo.get_properties = VFW::Encoder::get_properties;
info->obsInfo.update = VFW::Encoder::update;
info->obsInfo.get_extra_data = VFW::Encoder::get_extra_data;
info->obsInfo.get_sei_data = VFW::Encoder::get_sei_data;
info->obsInfo.get_video_info = VFW::Encoder::get_video_info;
PLOG_INFO("Registering: %s %s",
info->Id.data(),
info->Name.data());
obs_register_encoder(&info->obsInfo);
_IdToInfo.insert(std::make_pair(info->Id, info));
2017-03-15 15:28:17 +01:00
}
ICClose(hIC);
}
}
return true;
}
bool VFW::Finalize() {
return true;
}
const char* VFW::Encoder::get_name(void* type_data) {
VFW::Info* info = static_cast<VFW::Info*>(type_data);
return info->Name.data();
}
void VFW::Encoder::get_defaults(obs_data_t *settings) {
}
void* VFW::Encoder::create(obs_data_t *settings, obs_encoder_t *encoder) {
return new VFW::Encoder(settings, encoder);
}
VFW::Encoder::Encoder(obs_data_t *settings, obs_encoder_t *encoder) {
}
void VFW::Encoder::destroy(void* data) {
delete static_cast<VFW::Encoder*>(data);
}
VFW::Encoder::~Encoder() {
}
bool VFW::Encoder::encode(void *data, struct encoder_frame *frame, struct encoder_packet *packet, bool *received_packet) {
return static_cast<VFW::Encoder*>(data)->encode(frame, packet, received_packet);
}
bool VFW::Encoder::encode(struct encoder_frame *frame, struct encoder_packet *packet, bool *received_packet) {
return false;
}
2017-03-15 17:14:30 +01:00
obs_properties_t* VFW::Encoder::get_properties(void *type_data, void *data) {
VFW::Info* info = static_cast<VFW::Info*>(type_data);
2017-03-15 15:28:17 +01:00
obs_properties_t* pr = obs_properties_create();
2017-03-15 17:14:30 +01:00
obs_property_t* p;
p = obs_properties_add_int(pr, PROP_BITRATE, "Bitrate", 1, 1000000, 1);
p = obs_properties_add_float(pr, PROP_QUALITY, "Quality", 1, 100, 0.01);
p = obs_properties_add_float(pr, PROP_KEYFRAME_INTERVAL, "Keyframe Interval", 0.01, 30.00, 0.01);
p = obs_properties_add_button(pr, PROP_CONFIGURE, "Configure", cb_configure);
p = obs_properties_add_button(pr, PROP_ABOUT, "Configure", cb_about);
2017-03-15 15:28:17 +01:00
return pr;
}
2017-03-15 17:14:30 +01:00
bool VFW::Encoder::cb_configure(obs_properties_t *pr, obs_property_t *p, void *data) {
return false;
}
bool VFW::Encoder::cb_about(obs_properties_t *pr, obs_property_t *p, void *data) {
return false;
}
2017-03-15 15:28:17 +01:00
bool VFW::Encoder::update(void *data, obs_data_t *settings) {
return static_cast<VFW::Encoder*>(data)->update(settings);
}
bool VFW::Encoder::update(obs_data_t* settings) {
return false;
}
bool VFW::Encoder::get_extra_data(void *data, uint8_t **extra_data, size_t *size) {
return static_cast<VFW::Encoder*>(data)->get_extra_data(extra_data, size);
}
bool VFW::Encoder::get_extra_data(uint8_t** extra_data, size_t* size) {
return false;
}
bool VFW::Encoder::get_sei_data(void *data, uint8_t **sei_data, size_t *size) {
return static_cast<VFW::Encoder*>(data)->get_sei_data(sei_data, size);
}
bool VFW::Encoder::get_sei_data(uint8_t** sei_data, size_t* size) {
return false;
}
void VFW::Encoder::get_video_info(void *data, struct video_scale_info *info) {
return static_cast<VFW::Encoder*>(data)->get_video_info(info);
}
void VFW::Encoder::get_video_info(struct video_scale_info *info) {}