From 1625217d443e716d269aa2ba6dbaf7ada6ac3df9 Mon Sep 17 00:00:00 2001 From: Naoto Kondo Date: Fri, 24 Apr 2020 23:05:55 +0900 Subject: [PATCH] WIP: VideoFrame --- src/PyVideoFrame.cpp | 42 ----------------------------- src/PyVideoFrame.hpp | 26 ------------------ src/main.cpp | 64 +++++++++++++++++++++++++++++--------------- 3 files changed, 42 insertions(+), 90 deletions(-) delete mode 100644 src/PyVideoFrame.cpp delete mode 100644 src/PyVideoFrame.hpp diff --git a/src/PyVideoFrame.cpp b/src/PyVideoFrame.cpp deleted file mode 100644 index 1d56b5a..0000000 --- a/src/PyVideoFrame.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#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 deleted file mode 100644 index 580a12a..0000000 --- a/src/PyVideoFrame.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#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 54e63a7..2b3855f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,6 @@ #include #include "PyAudioFrame.hpp" -#include "PyVideoFrame.hpp" namespace py = pybind11; @@ -81,33 +80,54 @@ PYBIND11_MODULE(NDIlib, m) { self.p_url_address = strs[&self].c_str(); }); - py::class_(m, "VideoFrameV2") - .def(py::init(m, "VideoFrameV2") + .def(py::init<>()) + /*.def(py::init(), + const char *, int64_t>(), py::arg("xres") = 0, py::arg("yres") = 0, - py::arg("FourCC") = FOURCC_VIDEO_TYPE_UYVY, + 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") = FRAME_FORMAT_TYPE_PROGRESSIVE, - 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", &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) + py::arg("frame_format_type") = NDIlib_frame_format_type_progressive, + py::arg("timecode") = 0, py::arg("p_data") = nullptr, + 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", - &PyVideoFrameV2::picture_aspect_ratio) - .def_readwrite("frame_format_type", &PyVideoFrameV2::frame_format_type) - .def_readwrite("timecode", &PyVideoFrameV2::timecode) - .def_property("data", nullptr, &PyVideoFrameV2::setData) + &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", nullptr, + [](NDIlib_video_frame_v2_t &self, const py::array_t &array) { + auto info = array.request(); + self.p_data = reinterpret_cast(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", - &PyVideoFrameV2::line_stride_in_bytes) - .def_property("metadata", &PyVideoFrameV2::getMetadata, - &PyVideoFrameV2::setMetadata) - .def_readwrite("timestamp", &PyVideoFrameV2::timestamp); + &NDIlib_video_frame_v2_t::line_stride_in_bytes) + .def_property( + "metadata", + [](const NDIlib_video_frame_v2_t &self) { + auto ustr = PyUnicode_DecodeLocale(self.p_metadata, nullptr); + return py::reinterpret_steal(ustr); + }, + [](NDIlib_video_frame_v2_t &self, const std::string &data) { + static std::unordered_map + strs; + strs[&self] = py::str(data); + self.p_metadata = strs[&self].c_str(); + }) + .def_readwrite("timestamp", &NDIlib_video_frame_v2_t::timestamp); py::class_(m, "AudioFrameV2") .def(py::init