2 Star 1 Fork 1

zhangming8/ndi-python

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
main.cpp 54.83 KB
一键复制 编辑 原始数据 按行查看 历史
Naoto Kondo 提交于 2022-06-14 15:24 +08:00 . fix audio buffer dimension
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385
#include <pybind11/numpy.h>
#include <pybind11/pybind11.h>
#include <Processing.NDI.Lib.h>
namespace py = pybind11;
PYBIND11_MODULE(NDIlib, m) {
m.doc() = "NDI SDK for Python";
// Processing.NDI.structs
py::enum_<NDIlib_frame_type_e>(m, "FrameType", py::arithmetic())
.value("FRAME_TYPE_NONE", NDIlib_frame_type_none)
.value("FRAME_TYPE_VIDEO", NDIlib_frame_type_video)
.value("FRAME_TYPE_AUDIO", NDIlib_frame_type_audio)
.value("FRAME_TYPE_METADATA", NDIlib_frame_type_metadata)
.value("FRAME_TYPE_ERROR", NDIlib_frame_type_error)
.value("FRANE_TYPE_STATUS_CHANGE", NDIlib_frame_type_status_change)
.value("FRAME_TYPE_MAX", NDIlib_frame_type_max)
.export_values();
py::enum_<NDIlib_FourCC_video_type_e>(m, "FourCCVideoType", py::arithmetic())
.value("FOURCC_VIDEO_TYPE_UYVY", NDIlib_FourCC_video_type_UYVY)
.value("FOURCC_VIDEO_TYPE_UYVA", NDIlib_FourCC_video_type_UYVA)
.value("FOURCC_VIDEO_TYPE_P216", NDIlib_FourCC_video_type_P216)
.value("FOURCC_VIDEO_TYPE_PA16", NDIlib_FourCC_video_type_PA16)
.value("FOURCC_VIDEO_TYPE_YV12", NDIlib_FourCC_video_type_YV12)
.value("FOURCC_VIDEO_TYPE_I420", NDIlib_FourCC_video_type_I420)
.value("FOURCC_VIDEO_TYPE_NV12", NDIlib_FourCC_video_type_NV12)
.value("FOURCC_VIDEO_TYPE_BGRA", NDIlib_FourCC_video_type_BGRA)
.value("FOURCC_VIDEO_TYPE_BGRX", NDIlib_FourCC_video_type_BGRX)
.value("FOURCC_VIDEO_TYPE_RGBA", NDIlib_FourCC_video_type_RGBA)
.value("FOURCC_VIDEO_TYPE_RGBX", NDIlib_FourCC_video_type_RGBX)
.value("FOURCC_VIDEO_TYPE_MAX", NDIlib_FourCC_video_type_max)
.export_values();
py::enum_<NDIlib_FourCC_audio_type_e>(m, "FourCCAudioType", py::arithmetic())
.value("FOURCC_AUDIO_TYPE_FLTP", NDIlib_FourCC_audio_type_FLTP)
.value("FOURCC_AUDIO_TYPE_MAX", NDIlib_FourCC_audio_type_max)
.export_values();
py::enum_<NDIlib_frame_format_type_e>(m, "FrameFormatType", py::arithmetic())
.value("FRAME_FORMAT_TYPE_PROGRESSIVE",
NDIlib_frame_format_type_progressive)
.value("FRAME_FORMAT_TYPE_INTERLEAVED",
NDIlib_frame_format_type_interleaved)
.value("FRAME_FORMAT_TYPE_FIELD_0", NDIlib_frame_format_type_field_0)
.value("FRAME_FORMAT_TYPE_FIELD_1", NDIlib_frame_format_type_field_1)
.value("FRAME_FORMAT_TYPE_MAX", NDIlib_frame_format_type_max)
.export_values();
m.attr("SEND_TIMECODE_SYNTHESIZE") = py::int_(INT64_MAX);
m.attr("RECV_TIMESTAMP_UNDEFINED") = py::int_(INT64_MAX);
py::class_<NDIlib_source_t>(m, "Source")
.def(py::init<const char *, const char *>(),
py::arg("p_ndi_name") = nullptr, py::arg("p_url_address") = nullptr)
.def_property(
"ndi_name",
[](const NDIlib_source_t &self) {
if (!self.p_ndi_name)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_ndi_name, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_source_t &self, const std::string &name) {
static std::unordered_map<NDIlib_source_t *, std::string> strs;
strs[&self] = py::str(name);
self.p_ndi_name = strs[&self].c_str();
})
.def_property(
"url_address",
[](const NDIlib_source_t &self) {
if (!self.p_url_address)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_url_address, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_source_t &self, const std::string &address) {
static std::unordered_map<NDIlib_source_t *, std::string> strs;
strs[&self] = py::str(address);
self.p_url_address = strs[&self].c_str();
});
py::class_<NDIlib_video_frame_v2_t>(m, "VideoFrameV2")
.def(py::init<int, int, NDIlib_FourCC_video_type_e, int, int, float,
NDIlib_frame_format_type_e, int64_t, uint8_t *, int,
const char *, int64_t>(),
py::arg("xres") = 0, py::arg("yres") = 0,
py::arg("FourCC") = NDIlib_FourCC_video_type_UYVY,
py::arg("frame_rate_N") = 30000, py::arg("frame_rate_D") = 1001,
py::arg("picture_aspect_ratio") = 0.0f,
py::arg("frame_format_type") = NDIlib_frame_format_type_progressive,
py::arg("timecode") = 0, py::arg("p_data") = 0,
py::arg("line_stride_in_bytes") = 0, py::arg("p_metadata") = nullptr,
py::arg("timestamp") = 0)
.def_readwrite("xres", &NDIlib_video_frame_v2_t::xres)
.def_readwrite("yres", &NDIlib_video_frame_v2_t::yres)
.def_readwrite("FourCC", &NDIlib_video_frame_v2_t::FourCC)
.def_readwrite("frame_rate_N", &NDIlib_video_frame_v2_t::frame_rate_N)
.def_readwrite("frame_rate_D", &NDIlib_video_frame_v2_t::frame_rate_D)
.def_readwrite("picture_aspect_ratio",
&NDIlib_video_frame_v2_t::picture_aspect_ratio)
.def_readwrite("frame_format_type",
&NDIlib_video_frame_v2_t::frame_format_type)
.def_readwrite("timecode", &NDIlib_video_frame_v2_t::timecode)
.def_property(
"data",
[](const NDIlib_video_frame_v2_t &self) {
int r = self.yres;
int c = self.xres;
size_t b1 = self.line_stride_in_bytes;
size_t b2 = c > 0 ? b1 / c : 0;
size_t b3 = sizeof(uint8_t);
auto buffer_info = py::buffer_info(
self.p_data, b3, py::format_descriptor<uint8_t>::format(), 3,
{r, c, int(b2)}, {b1, b2, b3});
return py::array(buffer_info);
},
[](NDIlib_video_frame_v2_t &self, const py::array_t<uint8_t> &array) {
auto info = array.request();
self.p_data = static_cast<uint8_t *>(info.ptr);
self.picture_aspect_ratio = info.shape[1] / float(info.shape[0]);
self.xres = info.shape[1];
self.yres = info.shape[0];
self.line_stride_in_bytes = info.strides[0];
})
.def_readwrite("line_stride_in_bytes",
&NDIlib_video_frame_v2_t::line_stride_in_bytes)
.def_property(
"metadata",
[](const NDIlib_video_frame_v2_t &self) {
if (!self.p_metadata)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_video_frame_v2_t &self, const std::string &data) {
static std::unordered_map<NDIlib_video_frame_v2_t *, std::string>
strs;
strs[&self] = py::str(data);
self.p_metadata = strs[&self].c_str();
})
.def_readwrite("timestamp", &NDIlib_video_frame_v2_t::timestamp);
py::class_<NDIlib_audio_frame_v2_t>(m, "AudioFrameV2")
.def(py::init<int, int, int, int64_t, float *, int, const char *,
int64_t>(),
py::arg("sample_rate") = 48000, py::arg("no_channels") = 2,
py::arg("no_samples") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("p_data") = 0, py::arg("channel_stride_in_bytes") = 0,
py::arg("p_metadata") = nullptr, py::arg("timestamp") = 0)
.def_readwrite("sample_rate", &NDIlib_audio_frame_v2_t::sample_rate)
.def_readwrite("no_channels", &NDIlib_audio_frame_v2_t::no_channels)
.def_readwrite("no_samples", &NDIlib_audio_frame_v2_t::no_samples)
.def_readwrite("timecode", &NDIlib_audio_frame_v2_t::timecode)
.def_property(
"data",
[](const NDIlib_audio_frame_v2_t &self) {
size_t col = self.no_samples;
size_t row = self.no_channels;
size_t size = sizeof(float);
auto buffer_info = py::buffer_info(
self.p_data, size, py::format_descriptor<float>::format(), 2,
{row, col}, {col * size, size});
return py::array(buffer_info);
},
[](NDIlib_audio_frame_v2_t &self, py::array_t<float> &array) {
auto info = array.request();
self.p_data = static_cast<float *>(info.ptr);
self.no_channels = info.shape[0];
self.no_samples = info.shape[1];
self.channel_stride_in_bytes = info.strides[0];
})
.def_readwrite("channel_stride_in_bytes",
&NDIlib_audio_frame_v2_t::channel_stride_in_bytes)
.def_property(
"metadata",
[](const NDIlib_audio_frame_v2_t &self) {
if (!self.p_metadata)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_audio_frame_v2_t &self, const std::string &data) {
static std::unordered_map<NDIlib_audio_frame_v2_t *, std::string>
strs;
strs[&self] = py::str(data);
self.p_metadata = strs[&self].c_str();
})
.def_readwrite("timestamp", &NDIlib_audio_frame_v2_t::timestamp);
py::class_<NDIlib_audio_frame_v3_t>(m, "AudioFrameV3")
.def(py::init<int, int, int, int64_t, NDIlib_FourCC_audio_type_e,
uint8_t *, int, const char *, int64_t>(),
py::arg("sample_rate") = 48000, py::arg("no_channels") = 2,
py::arg("no_samples") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("FourCC") = NDIlib_FourCC_audio_type_FLTP,
py::arg("p_data") = 0, py::arg("channel_stride_in_bytes") = 0,
py::arg("p_metadata") = nullptr, py::arg("timestamp") = 0)
.def_readwrite("sample_rate", &NDIlib_audio_frame_v3_t::sample_rate)
.def_readwrite("no_channels", &NDIlib_audio_frame_v3_t::no_channels)
.def_readwrite("no_samples", &NDIlib_audio_frame_v3_t::no_samples)
.def_readwrite("timecode", &NDIlib_audio_frame_v3_t::timecode)
.def_readwrite("FourCC", &NDIlib_audio_frame_v3_t::FourCC)
.def_property(
"data",
[](const NDIlib_audio_frame_v3_t &self) {
size_t col = self.no_samples;
size_t row = self.no_channels;
size_t size = sizeof(uint8_t);
auto buffer_info = py::buffer_info(
self.p_data, size, py::format_descriptor<uint8_t>::format(), 2,
{row, col}, {col * size * 4, size});
return py::array(buffer_info);
},
[](NDIlib_audio_frame_v3_t &self, py::array_t<uint8_t> &array) {
auto info = array.request();
self.p_data = static_cast<uint8_t *>(info.ptr);
self.no_channels = info.shape[0];
self.no_samples = info.shape[1];
self.channel_stride_in_bytes = info.strides[0];
})
.def_readwrite("channel_stride_in_bytes",
&NDIlib_audio_frame_v3_t::channel_stride_in_bytes)
.def_property(
"metadata",
[](const NDIlib_audio_frame_v3_t &self) {
if (!self.p_metadata)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_audio_frame_v3_t &self, const std::string &data) {
static std::unordered_map<NDIlib_audio_frame_v3_t *, std::string>
strs;
strs[&self] = py::str(data);
self.p_metadata = strs[&self].c_str();
})
.def_readwrite("timestamp", &NDIlib_audio_frame_v3_t::timestamp);
py::class_<NDIlib_metadata_frame_t>(m, "MetadataFrame")
.def(py::init<int, int64_t, char *>(), py::arg("length") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("p_data") = nullptr)
.def_readwrite("length", &NDIlib_metadata_frame_t::length)
.def_readwrite("timecode", &NDIlib_metadata_frame_t::timecode)
.def_property(
"data",
[](const NDIlib_metadata_frame_t &self) {
if (!self.p_data)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_data, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_metadata_frame_t &self, const std::string &data) {
static std::unordered_map<NDIlib_metadata_frame_t *, std::string>
strs;
strs[&self] = py::str(data);
self.p_data = &strs[&self][0];
});
py::class_<NDIlib_tally_t>(m, "Tally")
.def(py::init<bool, bool>(), py::arg("on_program") = false,
py::arg("on_preview") = false)
.def_readwrite("on_program", &NDIlib_tally_t::on_program)
.def_readwrite("on_preview", &NDIlib_tally_t::on_preview);
// Processing.NDI.Lib
m.def("initialize", &NDIlib_initialize);
m.def("destroy", &NDIlib_destroy);
m.def("version", &NDIlib_version);
m.def("is_supported_CPU", &NDIlib_is_supported_CPU);
// Processing.NDI.Find
py::class_<NDIlib_find_create_t>(m, "FindCreate")
.def(py::init<bool, const char *, const char *>(),
py::arg("show_local_sources") = true, py::arg("p_groups") = nullptr,
py::arg("p_extra_ips") = nullptr)
.def_readwrite("show_local_sources",
&NDIlib_find_create_t::show_local_sources)
.def_property(
"groups",
[](const NDIlib_find_create_t &self) {
if (!self.p_groups)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_groups, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_find_create_t &self, const std::string &groups) {
static std::unordered_map<NDIlib_find_create_t *, std::string> strs;
strs[&self] = py::str(groups);
self.p_groups = strs[&self].c_str();
})
.def_property(
"extra_ips",
[](const NDIlib_find_create_t &self) {
if (!self.p_extra_ips)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_extra_ips, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_find_create_t &self, const std::string &extra_ips) {
static std::unordered_map<NDIlib_find_create_t *, std::string> strs;
strs[&self] = py::str(extra_ips);
self.p_extra_ips = strs[&self].c_str();
});
m.def(
"find_create_v2",
[](const NDIlib_find_create_t *p_create_settings) {
auto p_instance = NDIlib_find_create_v2(p_create_settings);
return py::capsule(p_instance, "FindInstance");
},
py::arg("create_settings") = nullptr);
m.def(
"find_destroy",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_find_instance_type *>(instance.get_pointer());
NDIlib_find_destroy(p_instance);
},
py::arg("instance"));
m.def(
"find_get_current_sources",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_find_instance_type *>(instance.get_pointer());
uint32_t count = 0;
auto sources = NDIlib_find_get_current_sources(p_instance, &count);
py::list out;
for (uint32_t i = 0; i < count; ++i)
out.append(sources + i);
return out;
},
py::arg("instance"));
m.def(
"find_wait_for_sources",
[](py::capsule instance, uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_find_instance_type *>(instance.get_pointer());
return NDIlib_find_wait_for_sources(p_instance, timeout_in_ms);
},
py::arg("instance"), py::arg("timeout_in_ms"));
// Processing.NDI.Recv
py::enum_<NDIlib_recv_bandwidth_e>(m, "RecvBandwidth", py::arithmetic())
.value("RECV_BANDWIDTH_METADATA_ONLY",
NDIlib_recv_bandwidth_metadata_only)
.value("RECV_BANDWIDTH_AUDIO_ONLY", NDIlib_recv_bandwidth_audio_only)
.value("RECV_BANDWIDTH_LOWEST", NDIlib_recv_bandwidth_lowest)
.value("RECV_BANDWIDTH_HIGHEST", NDIlib_recv_bandwidth_highest)
.value("RECV_BANDWIDTH_MAX", NDIlib_recv_bandwidth_max)
.export_values();
py::enum_<NDIlib_recv_color_format_e>(m, "RecvColorFormat", py::arithmetic())
.value("RECV_COLOR_FORMAT_BGRX_BGRA", NDIlib_recv_color_format_BGRX_BGRA)
.value("RECV_COLOR_FORMAT_UYVY_BGRA", NDIlib_recv_color_format_UYVY_BGRA)
.value("RECV_COLOR_FORMAT_RGBX_RGBA", NDIlib_recv_color_format_RGBX_RGBA)
.value("RECV_COLOR_FORMAT_UYVY_RGBA", NDIlib_recv_color_format_UYVY_RGBA)
.value("RECV_COLOR_FORMAT_FASTEST", NDIlib_recv_color_format_fastest)
.value("RECV_COLOR_FORMAT_BEST", NDIlib_recv_color_format_best)
.value("RECV_COLOR_FORMAT_E_BGRX_BGRA",
NDIlib_recv_color_format_e_BGRX_BGRA)
.value("RECV_COLOR_FORMAT_E_UYVY_BGRA",
NDIlib_recv_color_format_e_UYVY_BGRA)
.value("RECV_COLOR_FORMAT_E_RGBX_RGBA",
NDIlib_recv_color_format_e_RGBX_RGBA)
.value("RECV_COLOR_FORMAT_E_UYVY_RGBA",
NDIlib_recv_color_format_e_UYVY_RGBA)
#ifdef _WIN32
.value("RECV_COLOR_FORMAT_BGRX_BGRA_FLIPPED",
NDIlib_recv_color_format_BGRX_BGRA_flipped)
#endif
.value("RECV_COLOR_FORMAT_MAX", NDIlib_recv_color_format_max)
.export_values();
py::class_<NDIlib_recv_create_v3_t>(m, "RecvCreateV3")
.def(py::init<const NDIlib_source_t, NDIlib_recv_color_format_e,
NDIlib_recv_bandwidth_e, bool, const char *>(),
py::arg("source_to_connect_to") = NDIlib_source_t(),
py::arg("color_format") = NDIlib_recv_color_format_UYVY_BGRA,
py::arg("bandwidth") = NDIlib_recv_bandwidth_highest,
py::arg("allow_video_fields") = true,
py::arg("p_ndi_recv_name") = nullptr)
.def_readwrite("source_to_connect_to",
&NDIlib_recv_create_v3_t::source_to_connect_to)
.def_readwrite("color_format", &NDIlib_recv_create_v3_t::color_format)
.def_readwrite("bandwidth", &NDIlib_recv_create_v3_t::bandwidth)
.def_readwrite("allow_video_fields",
&NDIlib_recv_create_v3_t::allow_video_fields)
.def_property(
"ndi_recv_name",
[](const NDIlib_recv_create_v3_t &self) {
if (!self.p_ndi_recv_name)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_ndi_recv_name, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_recv_create_v3_t &self, const std::string &ndi_recv_name) {
static std::unordered_map<NDIlib_recv_create_v3_t *, std::string>
strs;
strs[&self] = py::str(ndi_recv_name);
self.p_ndi_recv_name = strs[&self].c_str();
});
py::class_<NDIlib_recv_performance_t>(m, "RecvPerformance")
.def(py::init<>())
.def_readwrite("video_frames", &NDIlib_recv_performance_t::video_frames)
.def_readwrite("audio_frames", &NDIlib_recv_performance_t::audio_frames)
.def_readwrite("metadata_frames",
&NDIlib_recv_performance_t::metadata_frames);
py::class_<NDIlib_recv_queue_t>(m, "RecvQueue")
.def(py::init<>())
.def_readwrite("video_frames", &NDIlib_recv_queue_t::video_frames)
.def_readwrite("audio_frames", &NDIlib_recv_queue_t::audio_frames)
.def_readwrite("metadata_frames", &NDIlib_recv_queue_t::metadata_frames);
m.def(
"recv_create_v3",
[](const NDIlib_recv_create_v3_t *p_create_settings) {
auto p_instance = NDIlib_recv_create_v3(p_create_settings);
return py::capsule(p_instance, "RecvInstance");
},
py::arg("create_settings") = nullptr);
m.def(
"recv_destroy",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_destroy(p_instance);
},
py::arg("instance"));
m.def(
"recv_connect",
[](py::capsule instance, const NDIlib_source_t *p_src) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_connect(p_instance, p_src);
},
py::arg("instance"), py::arg("source") = nullptr);
m.def(
"recv_capture_v2",
[](py::capsule instance, uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_video_frame_v2_t video_frame;
NDIlib_audio_frame_v2_t audio_frame;
NDIlib_metadata_frame_t metadata_frame;
auto type =
NDIlib_recv_capture_v2(p_instance, &video_frame, &audio_frame,
&metadata_frame, timeout_in_ms);
return std::tuple<NDIlib_frame_type_e, NDIlib_video_frame_v2_t,
NDIlib_audio_frame_v2_t, NDIlib_metadata_frame_t>(
type, video_frame, audio_frame, metadata_frame);
},
py::arg("instance"), py::arg("timeout_in_ms"));
m.def(
"recv_capture_v3",
[](py::capsule instance, uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_video_frame_v2_t video_frame;
NDIlib_audio_frame_v3_t audio_frame;
NDIlib_metadata_frame_t metadata_frame;
auto type =
NDIlib_recv_capture_v3(p_instance, &video_frame, &audio_frame,
&metadata_frame, timeout_in_ms);
return std::tuple<NDIlib_frame_type_e, NDIlib_video_frame_v2_t,
NDIlib_audio_frame_v3_t, NDIlib_metadata_frame_t>(
type, video_frame, audio_frame, metadata_frame);
},
py::arg("instance"), py::arg("timeout_in_ms"));
m.def(
"recv_free_video_v2",
[](py::capsule instance, const NDIlib_video_frame_v2_t *p_video_data) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_free_video_v2(p_instance, p_video_data);
},
py::arg("instance"), py::arg("video_data") = nullptr);
m.def(
"recv_free_audio_v2",
[](py::capsule instance, const NDIlib_audio_frame_v2_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_free_audio_v2(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data") = nullptr);
m.def(
"recv_free_audio_v3",
[](py::capsule instance, const NDIlib_audio_frame_v3_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_free_audio_v3(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data") = nullptr);
m.def(
"recv_free_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_free_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata") = nullptr);
m.def(
"recv_free_string",
[](py::capsule instance, const char *p_string) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_free_string(p_instance, p_string);
},
py::arg("instance"), py::arg("string") = nullptr);
m.def(
"recv_send_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_send_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata_frame"));
m.def(
"recv_set_tally",
[](py::capsule instance, const NDIlib_tally_t *p_tally) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_set_tally(p_instance, p_tally);
},
py::arg("instance"), py::arg("tally"));
m.def(
"recv_get_performance",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_performance_t total;
NDIlib_recv_performance_t dropped;
NDIlib_recv_get_performance(p_instance, &total, &dropped);
return std::tuple<NDIlib_recv_performance_t, NDIlib_recv_performance_t>(
total, dropped);
},
py::arg("instance"));
m.def(
"recv_get_queue",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_queue_t total;
NDIlib_recv_get_queue(p_instance, &total);
return total;
},
py::arg("instance"));
m.def(
"recv_clear_connection_metadata",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_clear_connection_metadata(p_instance);
},
py::arg("instance"));
m.def(
"recv_add_connection_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
NDIlib_recv_add_connection_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata"));
m.def(
"recv_get_no_connections",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_get_no_connections(p_instance);
},
py::arg("instance"));
m.def(
"recv_get_web_control",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
auto str = NDIlib_recv_get_web_control(p_instance);
auto ustr = PyUnicode_DecodeLocale(str, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
py::arg("instance"));
// Processing.NDI.Recv.ex
m.def(
"recv_ptz_is_supported",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_is_supported(p_instance);
},
py::arg("instance"));
m.def(
"recv_recording_is_supported",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_is_supported(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_zoom",
[](py::capsule instance, const float zoom_value) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_zoom(p_instance, zoom_value);
},
py::arg("instance"), py::arg("zoom_value"));
m.def(
"recv_ptz_zoom_speed",
[](py::capsule instance, const float zoom_speed) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_zoom_speed(p_instance, zoom_speed);
},
py::arg("instance"), py::arg("zoom_speed"));
m.def(
"recv_ptz_pan_tilt",
[](py::capsule instance, const float pan_value, const float tilt_value) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_pan_tilt(p_instance, pan_value, tilt_value);
},
py::arg("instance"), py::arg("pan_value"), py::arg("tilt_value"));
m.def(
"recv_ptz_pan_tilt_speed",
[](py::capsule instance, const float pan_speed, const float tilt_speed) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_pan_tilt_speed(p_instance, pan_speed,
tilt_speed);
},
py::arg("instance"), py::arg("pan_speed"), py::arg("tilt_speed"));
m.def(
"recv_ptz_store_preset",
[](py::capsule instance, const int preset_no) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_store_preset(p_instance, preset_no);
},
py::arg("instance"), py::arg("preset_no"));
m.def(
"recv_ptz_recall_preset",
[](py::capsule instance, const int preset_no, const float speed) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_recall_preset(p_instance, preset_no, speed);
},
py::arg("instance"), py::arg("preset_no"), py::arg("speed"));
m.def(
"recv_ptz_auto_focus",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_auto_focus(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_focus",
[](py::capsule instance, const float focus_value) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_focus(p_instance, focus_value);
},
py::arg("instance"), py::arg("focus_value"));
m.def(
"recv_ptz_focus_speed",
[](py::capsule instance, const float focus_speed) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_focus_speed(p_instance, focus_speed);
},
py::arg("instance"), py::arg("focus_speed"));
m.def(
"recv_ptz_white_balance_auto",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_white_balance_auto(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_white_balance_indoor",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_white_balance_indoor(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_white_balance_outdoor",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_white_balance_outdoor(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_white_balance_oneshot",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_white_balance_oneshot(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_white_balance_manual",
[](py::capsule instance, const float red, const float blue) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_white_balance_manual(p_instance, red, blue);
},
py::arg("instance"), py::arg("red"), py::arg("blue"));
m.def(
"recv_ptz_exposure_auto",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_exposure_auto(p_instance);
},
py::arg("instance"));
m.def(
"recv_ptz_exposure_manual",
[](py::capsule instance, const float exposure_level) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_exposure_manual(p_instance, exposure_level);
},
py::arg("instance"), py::arg("exposure_level"));
m.def(
"recv_ptz_exposure_manual_v2",
[](py::capsule instance, const float iris, const float gain,
const float shutter_speed) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_ptz_exposure_manual_v2(p_instance, iris, gain,
shutter_speed);
},
py::arg("instance"), py::arg("iris"), py::arg("gain"),
py::arg("shutter_speed"));
m.def(
"recv_recording_start",
[](py::capsule instance, const char *p_filename_hint) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_start(p_instance, p_filename_hint);
},
py::arg("instance"), py::arg("filename_hint"));
m.def(
"recv_recording_stop",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_stop(p_instance);
},
py::arg("instance"));
m.def(
"recv_recording_set_audio_level",
[](py::capsule instance, const float level_dB) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_set_audio_level(p_instance, level_dB);
},
py::arg("instance"), py::arg("level_dB"));
m.def(
"recv_recording_is_recording",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_is_recording(p_instance);
},
py::arg("instance"));
m.def(
"recv_recording_get_filename",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
auto str = NDIlib_recv_recording_get_filename(p_instance);
auto ustr = PyUnicode_DecodeLocale(str, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
py::arg("instance"));
m.def(
"recv_recording_get_error",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
auto str = NDIlib_recv_recording_get_error(p_instance);
auto ustr = PyUnicode_DecodeLocale(str, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
py::arg("instance"));
py::class_<NDIlib_recv_recording_time_t>(m, "RecvRecordingTime")
.def(py::init<>())
.def_readwrite("no_frames", &NDIlib_recv_recording_time_t::no_frames)
.def_readwrite("start_time", &NDIlib_recv_recording_time_t::start_time)
.def_readwrite("last_time", &NDIlib_recv_recording_time_t::last_time);
m.def(
"recv_recording_get_times",
[](py::capsule instance, NDIlib_recv_recording_time_t *p_times) {
auto p_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
return NDIlib_recv_recording_get_times(p_instance, p_times);
},
py::arg("instance"), py::arg("times"));
// Processing.NDI.Send
py::class_<NDIlib_send_create_t>(m, "SendCreate")
.def(py::init<const char *, const char *, bool, bool>(),
py::arg("p_ndi_name") = nullptr, py::arg("p_groups") = nullptr,
py::arg("clock_video") = true, py::arg("clock_audio") = true)
.def_property(
"ndi_name",
[](const NDIlib_send_create_t &self) {
if (!self.p_ndi_name)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_ndi_name, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_send_create_t &self, const char *name) {
static std::unordered_map<NDIlib_send_create_t *, std::string> strs;
strs[&self] = py::str(name);
self.p_ndi_name = strs[&self].c_str();
})
.def_property(
"groups",
[](const NDIlib_send_create_t &self) {
if (!self.p_groups)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_groups, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_send_create_t &self, const std::string &groups) {
static std::unordered_map<NDIlib_send_create_t *, std::string> strs;
strs[&self] = py::str(groups);
self.p_groups = strs[&self].c_str();
})
.def_readwrite("clock_video", &NDIlib_send_create_t::clock_video)
.def_readwrite("clock_audio", &NDIlib_send_create_t::clock_audio);
m.def(
"send_create",
[](const NDIlib_send_create_t *p_create_settings) {
auto p_instance = NDIlib_send_create(p_create_settings);
return py::capsule(p_instance, "SendInstance");
},
py::arg("create_settings") = nullptr);
m.def(
"send_destroy",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_destroy(p_instance);
},
py::arg("instance"));
m.def(
"send_send_video_v2",
[](py::capsule instance, const NDIlib_video_frame_v2_t *p_video_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_send_video_v2(p_instance, p_video_data);
},
py::arg("instance"), py::arg("video_data"));
m.def(
"send_send_video_async_v2",
[](py::capsule instance, const NDIlib_video_frame_v2_t *p_video_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_send_video_async_v2(p_instance, p_video_data);
},
py::arg("instance"), py::arg("video_data"));
m.def(
"send_send_audio_v2",
[](py::capsule instance, const NDIlib_audio_frame_v2_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_send_audio_v2(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"send_send_audio_v3",
[](py::capsule instance, const NDIlib_audio_frame_v3_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_send_audio_v3(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"send_send_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_send_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata"));
m.def(
"send_capture",
[](py::capsule instance, NDIlib_metadata_frame_t *p_metadata,
uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_capture(p_instance, p_metadata, timeout_in_ms);
},
py::arg("instance"), py::arg("metadata"), py::arg("timeout_in_ms"));
m.def(
"send_free_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_free_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata"));
m.def(
"send_get_tally",
[](py::capsule instance, NDIlib_tally_t *p_tally,
uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
return NDIlib_send_get_tally(p_instance, p_tally, timeout_in_ms);
},
py::arg("instance"), py::arg("tally"), py::arg("timeout_in_ms"));
m.def(
"send_get_no_connections",
[](py::capsule instance, uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
return NDIlib_send_get_no_connections(p_instance, timeout_in_ms);
},
py::arg("instance"), py::arg("timeout_in_ms"));
m.def(
"send_clear_connection_metadata",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_clear_connection_metadata(p_instance);
},
py::arg("instance"));
m.def(
"send_add_connection_metadata",
[](py::capsule instance, const NDIlib_metadata_frame_t *p_metadata) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_add_connection_metadata(p_instance, p_metadata);
},
py::arg("instance"), py::arg("metadata"));
m.def(
"send_set_failover",
[](py::capsule instance, const NDIlib_source_t *p_failover_source) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_send_set_failover(p_instance, p_failover_source);
},
py::arg("instance"), py::arg("failover_source"));
m.def(
"send_get_source_name",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
return NDIlib_send_get_source_name(p_instance);
},
py::arg("instance"));
// Processing.NDI.Routing
py::class_<NDIlib_routing_create_t>(m, "RoutingCreate")
.def(py::init<const char *, const char *>(),
py::arg("p_ndi_name") = nullptr, py::arg("p_groups") = nullptr)
.def_property(
"ndi_name",
[](const NDIlib_routing_create_t &self) {
if (!self.p_ndi_name)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_ndi_name, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_routing_create_t &self, const char *name) {
static std::unordered_map<NDIlib_routing_create_t *, std::string>
strs;
strs[&self] = py::str(name);
self.p_ndi_name = strs[&self].c_str();
})
.def_property(
"groups",
[](const NDIlib_routing_create_t &self) {
if (!self.p_groups)
return py::str();
auto ustr = PyUnicode_DecodeLocale(self.p_groups, nullptr);
return py::reinterpret_steal<py::str>(ustr);
},
[](NDIlib_routing_create_t &self, const std::string &groups) {
static std::unordered_map<NDIlib_routing_create_t *, std::string>
strs;
strs[&self] = py::str(groups);
self.p_groups = strs[&self].c_str();
});
m.def(
"routing_create",
[](const NDIlib_routing_create_t *p_create_settings) {
auto p_instance = NDIlib_routing_create(p_create_settings);
return py::capsule(p_instance, "RoutingInstance");
},
py::arg("create_settings"));
m.def(
"routing_destroy",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_routing_instance_type *>(instance.get_pointer());
NDIlib_routing_destroy(p_instance);
},
py::arg("instance"));
m.def(
"routing_change",
[](py::capsule instance, const NDIlib_source_t *p_source) {
auto p_instance =
static_cast<NDIlib_routing_instance_type *>(instance.get_pointer());
return NDIlib_routing_change(p_instance, p_source);
},
py::arg("instance"), py::arg("source"));
m.def(
"routing_clear",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_routing_instance_type *>(instance.get_pointer());
NDIlib_routing_clear(p_instance);
},
py::arg("instance"));
m.def(
"routing_get_no_connections",
[](py::capsule instance, uint32_t timeout_in_ms) {
auto p_instance =
static_cast<NDIlib_routing_instance_type *>(instance.get_pointer());
return NDIlib_routing_get_no_connections(p_instance, timeout_in_ms);
},
py::arg("instance"), py::arg("timeout_in_ms"));
m.def(
"routing_get_source_name(",
[](py::capsule instance) {
auto p_instance =
static_cast<NDIlib_routing_instance_type *>(instance.get_pointer());
return NDIlib_routing_get_source_name(p_instance);
},
py::arg("instance"));
// Processing.NDI.utilities
py::class_<NDIlib_audio_frame_interleaved_16s_t>(m,
"AudioFrameInterleaved16s")
.def(py::init<int, int, int, int64_t, int, int16_t *>(),
py::arg("sample_rate") = 48000, py::arg("no_channels") = 2,
py::arg("no_samples") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("reference_level") = 0, py::arg("p_data") = 0)
.def_readwrite("sample_rate",
&NDIlib_audio_frame_interleaved_16s_t::sample_rate)
.def_readwrite("no_channels",
&NDIlib_audio_frame_interleaved_16s_t::no_channels)
.def_readwrite("no_samples",
&NDIlib_audio_frame_interleaved_16s_t::no_samples)
.def_readwrite("timecode",
&NDIlib_audio_frame_interleaved_16s_t::timecode)
.def_readwrite("reference_level",
&NDIlib_audio_frame_interleaved_16s_t::reference_level)
.def_property(
"data",
[](const NDIlib_audio_frame_interleaved_16s_t &self) {
size_t col = self.no_samples;
size_t row = self.no_channels;
size_t size = sizeof(int16_t);
auto buffer_info = py::buffer_info(
self.p_data, size, py::format_descriptor<int16_t>::format(), 2,
{row, col}, {col * size, size});
return py::array(buffer_info);
},
[](NDIlib_audio_frame_interleaved_16s_t &self,
py::array_t<int16_t> &array) {
auto info = array.request();
self.p_data = static_cast<int16_t *>(info.ptr);
self.no_channels = info.shape[0];
self.no_samples = info.shape[1];
});
py::class_<NDIlib_audio_frame_interleaved_32s_t>(m,
"AudioFrameInterleaved32s")
.def(py::init<int, int, int, int64_t, int, int32_t *>(),
py::arg("sample_rate") = 48000, py::arg("no_channels") = 2,
py::arg("no_samples") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("reference_level") = 0, py::arg("p_data") = 0)
.def_readwrite("sample_rate",
&NDIlib_audio_frame_interleaved_32s_t::sample_rate)
.def_readwrite("no_channels",
&NDIlib_audio_frame_interleaved_32s_t::no_channels)
.def_readwrite("no_samples",
&NDIlib_audio_frame_interleaved_32s_t::no_samples)
.def_readwrite("timecode",
&NDIlib_audio_frame_interleaved_32s_t::timecode)
.def_readwrite("reference_level",
&NDIlib_audio_frame_interleaved_32s_t::reference_level)
.def_property(
"data",
[](const NDIlib_audio_frame_interleaved_32s_t &self) {
size_t col = self.no_samples;
size_t row = self.no_channels;
size_t size = sizeof(int32_t);
auto buffer_info = py::buffer_info(
self.p_data, size, py::format_descriptor<int32_t>::format(), 2,
{row, col}, {col * size, size});
return py::array(buffer_info);
},
[](NDIlib_audio_frame_interleaved_32s_t &self,
py::array_t<int32_t> &array) {
auto info = array.request();
self.p_data = static_cast<int32_t *>(info.ptr);
self.no_channels = info.shape[0];
self.no_samples = info.shape[1];
});
py::class_<NDIlib_audio_frame_interleaved_32f_t>(m,
"AudioFrameInterleaved32f")
.def(py::init<int, int, int, int64_t, float *>(),
py::arg("sample_rate") = 48000, py::arg("no_channels") = 2,
py::arg("no_samples") = 0,
py::arg("timecode") = NDIlib_send_timecode_synthesize,
py::arg("p_data") = 0)
.def_readwrite("sample_rate",
&NDIlib_audio_frame_interleaved_32f_t::sample_rate)
.def_readwrite("no_channels",
&NDIlib_audio_frame_interleaved_32f_t::no_channels)
.def_readwrite("no_samples",
&NDIlib_audio_frame_interleaved_32f_t::no_samples)
.def_readwrite("timecode",
&NDIlib_audio_frame_interleaved_32f_t::timecode)
.def_property(
"data",
[](const NDIlib_audio_frame_interleaved_32f_t &self) {
size_t col = self.no_samples;
size_t row = self.no_channels;
size_t size = sizeof(float);
auto buffer_info = py::buffer_info(
self.p_data, size, py::format_descriptor<float>::format(), 2,
{row, col}, {col * size, size});
return py::array(buffer_info);
},
[](NDIlib_audio_frame_interleaved_32f_t &self,
py::array_t<float> &array) {
auto info = array.request();
self.p_data = static_cast<float *>(info.ptr);
self.no_channels = info.shape[0];
self.no_samples = info.shape[1];
});
m.def(
"util_send_send_audio_interleaved_16s",
[](py::capsule instance,
const NDIlib_audio_frame_interleaved_16s_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_util_send_send_audio_interleaved_16s(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"util_send_send_audio_interleaved_32s",
[](py::capsule instance,
const NDIlib_audio_frame_interleaved_32s_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_util_send_send_audio_interleaved_32s(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"util_send_send_audio_interleaved_32f",
[](py::capsule instance,
const NDIlib_audio_frame_interleaved_32f_t *p_audio_data) {
auto p_instance =
static_cast<NDIlib_send_instance_type *>(instance.get_pointer());
NDIlib_util_send_send_audio_interleaved_32f(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def("util_audio_to_interleaved_16s_v2",
&NDIlib_util_audio_to_interleaved_16s_v2, py::arg("src"),
py::arg("dst"));
m.def("util_audio_from_interleaved_16s_v2",
&NDIlib_util_audio_from_interleaved_16s_v2, py::arg("src"),
py::arg("dst"));
m.def("util_audio_to_interleaved_32s_v2",
&NDIlib_util_audio_to_interleaved_32s_v2, py::arg("src"),
py::arg("dst"));
m.def("util_audio_from_interleaved_32s_v2",
&NDIlib_util_audio_from_interleaved_32s_v2, py::arg("src"),
py::arg("dst"));
m.def("util_audio_to_interleaved_32f_v2",
&NDIlib_util_audio_to_interleaved_32f_v2, py::arg("src"),
py::arg("dst"));
m.def("util_audio_from_interleaved_32f_v2",
&NDIlib_util_audio_from_interleaved_32f_v2, py::arg("src"),
py::arg("dst"));
m.def("util_V210_to_P216", &NDIlib_util_V210_to_P216, py::arg("src_v210"),
py::arg("dst_p216"));
m.def("util_P216_to_V210", &NDIlib_util_P216_to_V210, py::arg("src_p216"),
py::arg("dst_v210"));
// Processing.NDI.deprecated
// TODO
// Processing.NDI.FrameSync
m.def(
"framesync_create",
[](py::capsule instance) {
auto p_recv_instance =
static_cast<NDIlib_recv_instance_type *>(instance.get_pointer());
auto p_instance = NDIlib_framesync_create(p_recv_instance);
return py::capsule(p_instance, "FrameSyncInstance");
},
py::arg("receiver"));
m.def(
"framesync_destroy",
[](py::capsule instance) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_framesync_destroy(p_instance);
},
py::arg("instance"));
m.def(
"framesync_capture_audio",
[](py::capsule instance, int sample_rate, int no_channels,
int no_samples) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_audio_frame_v2_t audio_frame;
NDIlib_framesync_capture_audio(p_instance, &audio_frame, sample_rate,
no_channels, no_samples);
return audio_frame;
},
py::arg("instance"), py::arg("sample_rate"), py::arg("no_channels"),
py::arg("no_samples"));
m.def(
"framesync_capture_audio_v2",
[](py::capsule instance, int sample_rate, int no_channels,
int no_samples) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_audio_frame_v3_t audio_frame;
NDIlib_framesync_capture_audio_v2(p_instance, &audio_frame, sample_rate,
no_channels, no_samples);
return audio_frame;
},
py::arg("instance"), py::arg("sample_rate"), py::arg("no_channels"),
py::arg("no_samples"));
m.def(
"framesync_free_audio",
[](py::capsule instance, NDIlib_audio_frame_v2_t *p_audio_data) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_framesync_free_audio(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"framesync_free_audio_v2",
[](py::capsule instance, NDIlib_audio_frame_v3_t *p_audio_data) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_framesync_free_audio_v2(p_instance, p_audio_data);
},
py::arg("instance"), py::arg("audio_data"));
m.def(
"framesync_audio_queue_depth",
[](py::capsule instance) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
return NDIlib_framesync_audio_queue_depth(p_instance);
},
py::arg("instance"));
m.def(
"framesync_capture_video",
[](py::capsule instance, NDIlib_frame_format_type_e field_type) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_video_frame_v2_t video_frame;
NDIlib_framesync_capture_video(p_instance, &video_frame, field_type);
return video_frame;
},
py::arg("instance"),
py::arg("field_type") = NDIlib_frame_format_type_progressive);
m.def(
"framesync_free_video",
[](py::capsule instance, NDIlib_video_frame_v2_t *p_video_data) {
auto p_instance = static_cast<NDIlib_framesync_instance_type *>(
instance.get_pointer());
NDIlib_framesync_free_video(p_instance, p_video_data);
},
py::arg("instance"), py::arg("video_data"));
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangming8/ndi-python.git
git@gitee.com:zhangming8/ndi-python.git
zhangming8
ndi-python
ndi-python
master

搜索帮助