diff --git a/src/PySource.hpp b/src/PySource.hpp index 7caf522..7a1cfbd 100644 --- a/src/PySource.hpp +++ b/src/PySource.hpp @@ -1,6 +1,7 @@ -#include #include +#include + class PySource : public NDIlib_source_t { public: PySource(const std::string &ndi_name_, const std::string &url_address_); diff --git a/src/PyVideoFrame.cpp b/src/PyVideoFrame.cpp new file mode 100644 index 0000000..1d56b5a --- /dev/null +++ b/src/PyVideoFrame.cpp @@ -0,0 +1,42 @@ +#include "PyVideoFrame.hpp" + +PyVideoFrameV2::PyVideoFrameV2(int xres_, int yres_, + NDIlib_FourCC_video_type_e FourCC_, + int frame_rate_N_, int frame_rate_D_, + float picture_aspect_ratio_, + NDIlib_frame_format_type_e frame_format_type_, + int64_t timecode_, uint8_t *data_, + int line_stride_in_bytes_, + const std::string &metadata_, int64_t timestamp_) + : _metadata(metadata_) { + xres = xres_; + yres = yres_; + FourCC = FourCC_; + frame_rate_N = frame_rate_N_; + frame_rate_D = frame_rate_D_; + picture_aspect_ratio = picture_aspect_ratio_; + frame_format_type = frame_format_type_; + timecode = timecode_; + line_stride_in_bytes = line_stride_in_bytes_; + p_data = data_; + p_metadata = _metadata.c_str(); + timestamp = timestamp_; +} + +PyVideoFrameV2::~PyVideoFrameV2() {} + +void PyVideoFrameV2::setData(py::array_t &array) { + auto info = array.request(); + p_data = reinterpret_cast(info.ptr); + picture_aspect_ratio = info.shape[1] / float(info.shape[0]); + xres = info.shape[1]; + yres = info.shape[0]; + line_stride_in_bytes = info.strides[0]; +} + +const std::string &PyVideoFrameV2::getMetadata() const { return _metadata; } + +void PyVideoFrameV2::setMetadata(const std::string &data) { + _metadata = data; + p_metadata = _metadata.c_str(); +} diff --git a/src/PyVideoFrame.hpp b/src/PyVideoFrame.hpp new file mode 100644 index 0000000..580a12a --- /dev/null +++ b/src/PyVideoFrame.hpp @@ -0,0 +1,26 @@ +#include +#include +#include + +#include + +namespace py = pybind11; + +class PyVideoFrameV2 : public NDIlib_video_frame_v2_t { +public: + PyVideoFrameV2(int xres_, int yres_, NDIlib_FourCC_video_type_e FourCC_, + int frame_rate_N_, int frame_rate_D_, + float picture_aspect_ratio_, + NDIlib_frame_format_type_e frame_format_type_, + int64_t timecode_, uint8_t *data_, int line_stride_in_bytes_, + const std::string &metadata_, int64_t timestamp_); + virtual ~PyVideoFrameV2(); + + void setData(py::array_t &array); + + const std::string &getMetadata() const; + void setMetadata(const std::string &data); + +private: + std::string _metadata; +}; diff --git a/src/main.cpp b/src/main.cpp index 684d9a3..b56f704 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,8 @@ +#include #include #include "PySource.hpp" +#include "PyVideoFrame.hpp" namespace py = pybind11; @@ -100,33 +102,33 @@ PYBIND11_MODULE(NDIlib, m) { .def_property("url_address", &PySource::getUrlAddress, &PySource::setUrlAddress); - py::class_(m, "VideoFrameV2") + py::class_(m, "VideoFrameV2") .def(py::init(), + const std::string &, int64_t>(), py::arg("xres") = 0, py::arg("yres") = 0, - py::arg("FourCC") = FOURCC_TYPE_UYVY, + py::arg("FourCC") = 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") = FRAME_FORMAT_TYPE_PROGRESSIVE, - py::arg("timecode") = 0, py::arg("data") = NULL, + py::arg("timecode") = 0, py::arg("data") = nullptr, py::arg("line_stride_in_bytes") = 0, py::arg("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("xres", &PyVideoFrameV2::xres) + .def_readwrite("yres", &PyVideoFrameV2::yres) + .def_readwrite("FourCC", &PyVideoFrameV2::FourCC) + .def_readwrite("frame_rate_N", &PyVideoFrameV2::frame_rate_N) + .def_readwrite("frame_rate_D", &PyVideoFrameV2::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_readwrite("data", &NDIlib_video_frame_v2_t::p_data) + &PyVideoFrameV2::picture_aspect_ratio) + .def_readwrite("frame_format_type", &PyVideoFrameV2::frame_format_type) + .def_readwrite("timecode", &PyVideoFrameV2::timecode) + .def_property("data", nullptr, &PyVideoFrameV2::setData) .def_readwrite("line_stride_in_bytes", - &NDIlib_video_frame_v2_t::line_stride_in_bytes) - .def_readwrite("metadata", &NDIlib_video_frame_v2_t::p_metadata) - .def_readwrite("timestamp", &NDIlib_video_frame_v2_t::timestamp); + &PyVideoFrameV2::line_stride_in_bytes) + .def_property("metadata", &PyVideoFrameV2::getMetadata, + &PyVideoFrameV2::setMetadata) + .def_readwrite("timestamp", &PyVideoFrameV2::timestamp); py::class_(m, "AudioFrameV2") .def(py::init