summaryrefslogtreecommitdiff
path: root/src/py
diff options
context:
space:
mode:
Diffstat (limited to 'src/py')
-rwxr-xr-xsrc/py/cam/cam.py3
-rw-r--r--src/py/libcamera/py_main.cpp13
2 files changed, 10 insertions, 6 deletions
diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py
index 677dd680..bf8529d9 100755
--- a/src/py/cam/cam.py
+++ b/src/py/cam/cam.py
@@ -285,7 +285,8 @@ class CaptureState:
print('{:.6f} ({:.2f} fps) {}-{}: seq {}, bytes {}, CRCs {}'
.format(ts / 1000000000, fps,
ctx.id, stream_name,
- meta.sequence, meta.bytesused,
+ meta.sequence,
+ '/'.join([str(p.bytes_used) for p in meta.planes]),
crcs))
if ctx.opt_metadata:
diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
index 9e827845..52f70811 100644
--- a/src/py/libcamera/py_main.cpp
+++ b/src/py/libcamera/py_main.cpp
@@ -163,6 +163,7 @@ PYBIND11_MODULE(_libcamera, m)
auto pyRequestReuse = py::enum_<Request::ReuseFlag>(pyRequest, "Reuse");
auto pyFrameMetadata = py::class_<FrameMetadata>(m, "FrameMetadata");
auto pyFrameMetadataStatus = py::enum_<FrameMetadata::Status>(pyFrameMetadata, "Status");
+ auto pyFrameMetadataPlane = py::class_<FrameMetadata::Plane>(pyFrameMetadata, "Plane");
auto pyTransform = py::class_<Transform>(m, "Transform");
auto pyColorSpace = py::class_<ColorSpace>(m, "ColorSpace");
auto pyColorSpacePrimaries = py::enum_<ColorSpace::Primaries>(pyColorSpace, "Primaries");
@@ -512,11 +513,10 @@ PYBIND11_MODULE(_libcamera, m)
.def_readonly("status", &FrameMetadata::status)
.def_readonly("sequence", &FrameMetadata::sequence)
.def_readonly("timestamp", &FrameMetadata::timestamp)
- /* \todo Implement FrameMetadata::Plane properly */
- .def_property_readonly("bytesused", [](FrameMetadata &self) {
- std::vector<unsigned int> v;
- v.resize(self.planes().size());
- transform(self.planes().begin(), self.planes().end(), v.begin(), [](const auto &p) { return p.bytesused; });
+ .def_property_readonly("planes", [](const FrameMetadata &self) {
+ /* Convert from Span<> to std::vector<> */
+ /* Note: this creates a copy */
+ std::vector<FrameMetadata::Plane> v(self.planes().begin(), self.planes().end());
return v;
});
@@ -525,6 +525,9 @@ PYBIND11_MODULE(_libcamera, m)
.value("Error", FrameMetadata::FrameError)
.value("Cancelled", FrameMetadata::FrameCancelled);
+ pyFrameMetadataPlane
+ .def_readwrite("bytes_used", &FrameMetadata::Plane::bytesused);
+
pyTransform
.def(py::init([](int rotation, bool hflip, bool vflip, bool transpose) {
bool ok;
er = Thread::current()->eventDispatcher(); Timer timeout; int exitCode = 42; vector<std::string> args; args.push_back(to_string(exitCode)); proc_.finished.connect(this, &ProcessTest::procFinished); /* Test that kill() on an unstarted process is safe. */ proc_.kill(); /* Test starting the process and retrieving the exit code. */ int ret = proc_.start(self(), args); if (ret) { cerr << "failed to start process" << endl; return TestFail; } timeout.start(2000ms); while (timeout.isRunning() && exitStatus_ == Process::NotExited) dispatcher->processEvents(); if (exitStatus_ != Process::NormalExit) { cerr << "process did not exit normally" << endl; return TestFail; } if (exitCode != exitCode_) { cerr << "exit code should be " << exitCode << ", actual is " << exitCode_ << endl; return TestFail; } return TestPass; } private: void procFinished(enum Process::ExitStatus exitStatus, int exitCode) { exitStatus_ = exitStatus; exitCode_ = exitCode; } ProcessManager processManager_; Process proc_; enum Process::ExitStatus exitStatus_; int exitCode_; }; /* * Can't use TEST_REGISTER() as single binary needs to act as both * parent and child processes. */ int main(int argc, char **argv) { if (argc == 2) { int status = std::stoi(argv[1]); ProcessTestChild child; return child.run(status); } ProcessTest test; test.setArgs(argc, argv); return test.execute(); }