| Message ID | 20251030165816.1095180-23-barnabas.pocze@ideasonboard.com |
|---|---|
| State | New |
| Headers | show |
| Series |
|
| Related | show |
Quoting Barnabás Pőcze (2025-10-30 16:58:16) > Swap `metadata_` and `metadata2_`, so `MetadataList` is used as the primary > metadata list of a request. > Ah now I see what's happened earlier with the metadata2 ... but personally I think we should just convert usages straight to the metadata list - and not add a metadata2 ... Is there a specific benefit to keeping ControlList metadata2() that I'm not seeing ? > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> > --- > include/libcamera/internal/pipeline_handler.h | 10 +++++----- > include/libcamera/request.h | 8 ++++---- > src/android/camera_device.cpp | 2 +- > src/apps/cam/camera_session.cpp | 7 +++---- > src/apps/cam/file_sink.cpp | 2 +- > src/apps/cam/file_sink.h | 4 ++-- > src/apps/common/dng_writer.cpp | 2 +- > src/apps/common/dng_writer.h | 4 ++-- > src/apps/qcam/main_window.cpp | 2 +- > src/apps/qcam/main_window.h | 3 ++- > src/gstreamer/gstlibcamera-controls.cpp.in | 4 ++-- > src/libcamera/pipeline_handler.cpp | 4 ++-- > src/libcamera/request.cpp | 10 +++++----- > src/py/libcamera/py_helpers.cpp | 4 ++-- > src/py/libcamera/py_helpers.h | 2 +- > src/py/libcamera/py_main.cpp | 2 +- > 16 files changed, 35 insertions(+), 35 deletions(-) > > diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h > index 6c0e546e67..1803b9bbcf 100644 > --- a/include/libcamera/internal/pipeline_handler.h > +++ b/include/libcamera/internal/pipeline_handler.h > @@ -69,11 +69,11 @@ public: > void metadataAvailable(Request *request, const Control<T> &ctrl, > const internal::cxx20::type_identity_t<T> &value) > { > - auto &m = request->metadata2(); > + auto &m = request->metadata(); > const auto c = m.checkpoint(); > > std::ignore = m.set(ctrl, value); > - request->metadata().set(ctrl, value); > + request->metadata2().set(ctrl, value); > > const auto d = c.diffSince(); > if (d) > @@ -88,8 +88,8 @@ public: > void operator()(const Control<T> &ctrl, > const internal::cxx20::type_identity_t<T> &value) const > { > - request->metadata().set(ctrl, value); > - std::ignore = request->metadata2().set(ctrl, value); > + std::ignore = request->metadata().set(ctrl, value); > + request->metadata2().set(ctrl, value); > } > }; > > @@ -99,7 +99,7 @@ public: > #endif > void metadataAvailable(Request *request, Func func) > { > - const auto c = request->metadata2().checkpoint(); > + const auto c = request->metadata().checkpoint(); > > std::invoke(func, MetadataSetter{ request }); > > diff --git a/include/libcamera/request.h b/include/libcamera/request.h > index 23e7bde72c..6e7057c1d5 100644 > --- a/include/libcamera/request.h > +++ b/include/libcamera/request.h > @@ -51,9 +51,9 @@ public: > void reuse(ReuseFlag flags = Default); > > ControlList &controls() { return *controls_; } > - ControlList &metadata() { return *metadata_; } > + [[nodiscard]] MetadataList &metadata() { return metadata_; } > #ifndef __DOXYGEN__ > - [[nodiscard]] MetadataList &metadata2() { return metadata2_; } > + ControlList &metadata2() { return *metadata2_; } > #endif > const BufferMap &buffers() const { return bufferMap_; } > int addBuffer(const Stream *stream, FrameBuffer *buffer, > @@ -72,8 +72,8 @@ private: > LIBCAMERA_DISABLE_COPY(Request) > > ControlList *controls_; > - ControlList *metadata_; > - MetadataList metadata2_; > + MetadataList metadata_; > + ControlList *metadata2_; > BufferMap bufferMap_; > > const uint64_t cookie_; > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp > index 80ff248c2a..fa0cf1d236 100644 > --- a/src/android/camera_device.cpp > +++ b/src/android/camera_device.cpp > @@ -1423,7 +1423,7 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream, > std::unique_ptr<CameraMetadata> > CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) const > { > - const ControlList &metadata = descriptor.request_->metadata(); > + const MetadataList &metadata = descriptor.request_->metadata(); > const CameraMetadata &settings = descriptor.settings_; > camera_metadata_ro_entry_t entry; > bool found; > diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp > index 7cd8772e0a..9c5ce97f43 100644 > --- a/src/apps/cam/camera_session.cpp > +++ b/src/apps/cam/camera_session.cpp > @@ -545,19 +545,18 @@ void CameraSession::processRequest(Request *request) > std::cout << info.str() << std::endl; > > if (printMetadata_) { > - const ControlList &requestMetadata = request->metadata(); > + const MetadataList &requestMetadata = request->metadata(); > std::cout << "Metadata (" << requestMetadata.size() << " entries):\n"; > for (const auto &[key, value] : requestMetadata) { > const ControlId *id = controls::controls.at(key); > - std::cout << "\t" << id->name() << " = " > - << value.toString() << std::endl; > + std::cout << '\t' << id->name() << " = " << value << std::endl; > } > > const auto &requestMetadata2 = request->metadata2(); > std::cout << "Metadata2 (" << requestMetadata2.size() << " entries):\n"; > for (const auto &[key, value] : requestMetadata2) { > const ControlId *id = controls::controls.at(key); > - std::cout << '\t' << id->name() << " = " << value << std::endl; > + std::cout << '\t' << id->name() << " = " << value.toString() << std::endl; > } > } > > diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp > index 65794a2f90..7149d782cc 100644 > --- a/src/apps/cam/file_sink.cpp > +++ b/src/apps/cam/file_sink.cpp > @@ -102,7 +102,7 @@ bool FileSink::processRequest(Request *request) > } > > void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer, > - [[maybe_unused]] const ControlList &metadata) > + [[maybe_unused]] const MetadataList &metadata) > { > std::string filename = pattern_; > size_t pos; > diff --git a/src/apps/cam/file_sink.h b/src/apps/cam/file_sink.h > index 26cd61b36d..1f973f2e61 100644 > --- a/src/apps/cam/file_sink.h > +++ b/src/apps/cam/file_sink.h > @@ -11,7 +11,7 @@ > #include <memory> > #include <string> > > -#include <libcamera/controls.h> > +#include <libcamera/metadata_list.h> > #include <libcamera/stream.h> > > #include "frame_sink.h" > @@ -44,7 +44,7 @@ private: > > void writeBuffer(const libcamera::Stream *stream, > libcamera::FrameBuffer *buffer, > - const libcamera::ControlList &metadata); > + const libcamera::MetadataList &metadata); > > #ifdef HAVE_TIFF > const libcamera::Camera *camera_; > diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp > index 8d57023e1e..4319795643 100644 > --- a/src/apps/common/dng_writer.cpp > +++ b/src/apps/common/dng_writer.cpp > @@ -521,7 +521,7 @@ const std::map<PixelFormat, FormatInfo> formatInfo = { > > int DNGWriter::write(const char *filename, const Camera *camera, > const StreamConfiguration &config, > - const ControlList &metadata, > + const MetadataList &metadata, > [[maybe_unused]] const FrameBuffer *buffer, > const void *data) > { > diff --git a/src/apps/common/dng_writer.h b/src/apps/common/dng_writer.h > index aaa8a852b3..741f78a75b 100644 > --- a/src/apps/common/dng_writer.h > +++ b/src/apps/common/dng_writer.h > @@ -10,8 +10,8 @@ > #ifdef HAVE_TIFF > > #include <libcamera/camera.h> > -#include <libcamera/controls.h> > #include <libcamera/framebuffer.h> > +#include <libcamera/metadata_list.h> > #include <libcamera/stream.h> > > class DNGWriter > @@ -19,7 +19,7 @@ class DNGWriter > public: > static int write(const char *filename, const libcamera::Camera *camera, > const libcamera::StreamConfiguration &config, > - const libcamera::ControlList &metadata, > + const libcamera::MetadataList &metadata, > const libcamera::FrameBuffer *buffer, const void *data); > }; > > diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp > index 96a2d50901..2a678c19aa 100644 > --- a/src/apps/qcam/main_window.cpp > +++ b/src/apps/qcam/main_window.cpp > @@ -646,7 +646,7 @@ void MainWindow::captureRaw() > } > > void MainWindow::processRaw(FrameBuffer *buffer, > - [[maybe_unused]] const ControlList &metadata) > + [[maybe_unused]] const MetadataList &metadata) > { > #ifdef HAVE_TIFF > QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); > diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h > index 81fcf915ad..278de1d449 100644 > --- a/src/apps/qcam/main_window.h > +++ b/src/apps/qcam/main_window.h > @@ -15,6 +15,7 @@ > #include <libcamera/controls.h> > #include <libcamera/framebuffer.h> > #include <libcamera/framebuffer_allocator.h> > +#include <libcamera/metadata_list.h> > #include <libcamera/request.h> > #include <libcamera/stream.h> > > @@ -66,7 +67,7 @@ private Q_SLOTS: > void saveImageAs(); > void captureRaw(); > void processRaw(libcamera::FrameBuffer *buffer, > - const libcamera::ControlList &metadata); > + const libcamera::MetadataList &metadata); > > void renderComplete(libcamera::FrameBuffer *buffer); > > diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in > index 6faf3ee7a6..b42eade9b8 100644 > --- a/src/gstreamer/gstlibcamera-controls.cpp.in > +++ b/src/gstreamer/gstlibcamera-controls.cpp.in > @@ -282,6 +282,6 @@ void GstCameraControls::applyControls(std::unique_ptr<libcamera::Request> &reque > > void GstCameraControls::readMetadata(libcamera::Request *request) > { > - controls_acc_.merge(request->metadata(), > - ControlList::MergePolicy::OverwriteExisting); > + for (const auto &[k, v] : request->metadata()) > + controls_acc_.set(k, ControlValue(v)); > } > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp > index a3a37de873..ae81cfa4d5 100644 > --- a/src/libcamera/pipeline_handler.cpp > +++ b/src/libcamera/pipeline_handler.cpp > @@ -559,9 +559,9 @@ void PipelineHandler::doQueueRequests(Camera *camera) > */ > void PipelineHandler::metadataAvailable(Request *request, const ControlList &metadata) > { > - request->metadata().merge(metadata); > + request->metadata2().merge(metadata); > > - const auto d = request->metadata2().merge(metadata); > + const auto d = request->metadata().merge(metadata); > if (!d) > LOG(Pipeline, Fatal) << "Tried to add incompatible metadata items"; > > diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp > index 0ff465e6f7..8e272eeece 100644 > --- a/src/libcamera/request.cpp > +++ b/src/libcamera/request.cpp > @@ -357,7 +357,7 @@ void Request::Private::timeout() > */ > Request::Request(Camera *camera, uint64_t cookie) > : Extensible(std::make_unique<Private>(camera)), > - metadata2_(camera->_d()->metadataPlan_), > + metadata_(camera->_d()->metadataPlan_), > cookie_(cookie), status_(RequestPending) > { > controls_ = new ControlList(controls::controls, > @@ -366,7 +366,7 @@ Request::Request(Camera *camera, uint64_t cookie) > /** > * \todo Add a validator for metadata controls. > */ > - metadata_ = new ControlList(controls::controls); > + metadata2_ = new ControlList(controls::controls); > > LIBCAMERA_TRACEPOINT(request_construct, this); > > @@ -377,7 +377,7 @@ Request::~Request() > { > LIBCAMERA_TRACEPOINT(request_destroy, this); > > - delete metadata_; > + delete metadata2_; > delete controls_; > } > > @@ -410,8 +410,8 @@ void Request::reuse(ReuseFlag flags) > status_ = RequestPending; > > controls_->clear(); > - metadata_->clear(); > - metadata2_.clear(); > + metadata_.clear(); > + metadata2_->clear(); > } > > /** > diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp > index 8c55ef8458..a994c90b70 100644 > --- a/src/py/libcamera/py_helpers.cpp > +++ b/src/py/libcamera/py_helpers.cpp > @@ -16,7 +16,7 @@ namespace py = pybind11; > using namespace libcamera; > > template<typename T> > -static py::object valueOrTuple(const ControlValue &cv) > +static py::object valueOrTuple(const ControlValueView &cv) > { > if (cv.isArray()) { > const T *v = reinterpret_cast<const T *>(cv.data().data()); > @@ -31,7 +31,7 @@ static py::object valueOrTuple(const ControlValue &cv) > return py::cast(cv.get<T>()); > } > > -py::object controlValueToPy(const ControlValue &cv) > +py::object controlValueToPy(const ControlValueView &cv) > { > switch (cv.type()) { > case ControlTypeNone: > diff --git a/src/py/libcamera/py_helpers.h b/src/py/libcamera/py_helpers.h > index 983969dfff..895006d0c0 100644 > --- a/src/py/libcamera/py_helpers.h > +++ b/src/py/libcamera/py_helpers.h > @@ -9,5 +9,5 @@ > > #include <pybind11/pybind11.h> > > -pybind11::object controlValueToPy(const libcamera::ControlValue &cv); > +pybind11::object controlValueToPy(const libcamera::ControlValueView &cv); > libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type); > diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp > index a983ea75c3..77e0ead68a 100644 > --- a/src/py/libcamera/py_main.cpp > +++ b/src/py/libcamera/py_main.cpp > @@ -466,7 +466,7 @@ PYBIND11_MODULE(_libcamera, m) > self.controls().set(id.id(), pyToControlValue(value, id.type())); > }) > .def_property_readonly("metadata", [](Request &self) { > - /* Convert ControlList to std container */ > + /* Convert MetadataList to std container */ > > std::unordered_map<const ControlId *, py::object> ret; > > -- > 2.51.1 >
Hi 2025. 11. 02. 16:42 keltezéssel, Kieran Bingham írta: > Quoting Barnabás Pőcze (2025-10-30 16:58:16) >> Swap `metadata_` and `metadata2_`, so `MetadataList` is used as the primary >> metadata list of a request. >> > > Ah now I see what's happened earlier with the metadata2 ... but > personally I think we should just convert usages straight to the > metadata list - and not add a metadata2 ... > > Is there a specific benefit to keeping ControlList metadata2() that I'm > not seeing ? It is (was) useful for testing. There is one commit intentionally "missing" that removes `metadata2()`. > > >> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> >> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> >> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> >> --- >> include/libcamera/internal/pipeline_handler.h | 10 +++++----- >> include/libcamera/request.h | 8 ++++---- >> src/android/camera_device.cpp | 2 +- >> src/apps/cam/camera_session.cpp | 7 +++---- >> src/apps/cam/file_sink.cpp | 2 +- >> src/apps/cam/file_sink.h | 4 ++-- >> src/apps/common/dng_writer.cpp | 2 +- >> src/apps/common/dng_writer.h | 4 ++-- >> src/apps/qcam/main_window.cpp | 2 +- >> src/apps/qcam/main_window.h | 3 ++- >> src/gstreamer/gstlibcamera-controls.cpp.in | 4 ++-- >> src/libcamera/pipeline_handler.cpp | 4 ++-- >> src/libcamera/request.cpp | 10 +++++----- >> src/py/libcamera/py_helpers.cpp | 4 ++-- >> src/py/libcamera/py_helpers.h | 2 +- >> src/py/libcamera/py_main.cpp | 2 +- >> 16 files changed, 35 insertions(+), 35 deletions(-) >> >> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h >> index 6c0e546e67..1803b9bbcf 100644 >> --- a/include/libcamera/internal/pipeline_handler.h >> +++ b/include/libcamera/internal/pipeline_handler.h >> @@ -69,11 +69,11 @@ public: >> void metadataAvailable(Request *request, const Control<T> &ctrl, >> const internal::cxx20::type_identity_t<T> &value) >> { >> - auto &m = request->metadata2(); >> + auto &m = request->metadata(); >> const auto c = m.checkpoint(); >> >> std::ignore = m.set(ctrl, value); >> - request->metadata().set(ctrl, value); >> + request->metadata2().set(ctrl, value); >> >> const auto d = c.diffSince(); >> if (d) >> @@ -88,8 +88,8 @@ public: >> void operator()(const Control<T> &ctrl, >> const internal::cxx20::type_identity_t<T> &value) const >> { >> - request->metadata().set(ctrl, value); >> - std::ignore = request->metadata2().set(ctrl, value); >> + std::ignore = request->metadata().set(ctrl, value); >> + request->metadata2().set(ctrl, value); >> } >> }; >> >> @@ -99,7 +99,7 @@ public: >> #endif >> void metadataAvailable(Request *request, Func func) >> { >> - const auto c = request->metadata2().checkpoint(); >> + const auto c = request->metadata().checkpoint(); >> >> std::invoke(func, MetadataSetter{ request }); >> >> diff --git a/include/libcamera/request.h b/include/libcamera/request.h >> index 23e7bde72c..6e7057c1d5 100644 >> --- a/include/libcamera/request.h >> +++ b/include/libcamera/request.h >> @@ -51,9 +51,9 @@ public: >> void reuse(ReuseFlag flags = Default); >> >> ControlList &controls() { return *controls_; } >> - ControlList &metadata() { return *metadata_; } >> + [[nodiscard]] MetadataList &metadata() { return metadata_; } >> #ifndef __DOXYGEN__ >> - [[nodiscard]] MetadataList &metadata2() { return metadata2_; } >> + ControlList &metadata2() { return *metadata2_; } >> #endif >> const BufferMap &buffers() const { return bufferMap_; } >> int addBuffer(const Stream *stream, FrameBuffer *buffer, >> @@ -72,8 +72,8 @@ private: >> LIBCAMERA_DISABLE_COPY(Request) >> >> ControlList *controls_; >> - ControlList *metadata_; >> - MetadataList metadata2_; >> + MetadataList metadata_; >> + ControlList *metadata2_; >> BufferMap bufferMap_; >> >> const uint64_t cookie_; >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp >> index 80ff248c2a..fa0cf1d236 100644 >> --- a/src/android/camera_device.cpp >> +++ b/src/android/camera_device.cpp >> @@ -1423,7 +1423,7 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream, >> std::unique_ptr<CameraMetadata> >> CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) const >> { >> - const ControlList &metadata = descriptor.request_->metadata(); >> + const MetadataList &metadata = descriptor.request_->metadata(); >> const CameraMetadata &settings = descriptor.settings_; >> camera_metadata_ro_entry_t entry; >> bool found; >> diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp >> index 7cd8772e0a..9c5ce97f43 100644 >> --- a/src/apps/cam/camera_session.cpp >> +++ b/src/apps/cam/camera_session.cpp >> @@ -545,19 +545,18 @@ void CameraSession::processRequest(Request *request) >> std::cout << info.str() << std::endl; >> >> if (printMetadata_) { >> - const ControlList &requestMetadata = request->metadata(); >> + const MetadataList &requestMetadata = request->metadata(); >> std::cout << "Metadata (" << requestMetadata.size() << " entries):\n"; >> for (const auto &[key, value] : requestMetadata) { >> const ControlId *id = controls::controls.at(key); >> - std::cout << "\t" << id->name() << " = " >> - << value.toString() << std::endl; >> + std::cout << '\t' << id->name() << " = " << value << std::endl; >> } >> >> const auto &requestMetadata2 = request->metadata2(); >> std::cout << "Metadata2 (" << requestMetadata2.size() << " entries):\n"; >> for (const auto &[key, value] : requestMetadata2) { >> const ControlId *id = controls::controls.at(key); >> - std::cout << '\t' << id->name() << " = " << value << std::endl; >> + std::cout << '\t' << id->name() << " = " << value.toString() << std::endl; >> } >> } >> >> diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp >> index 65794a2f90..7149d782cc 100644 >> --- a/src/apps/cam/file_sink.cpp >> +++ b/src/apps/cam/file_sink.cpp >> @@ -102,7 +102,7 @@ bool FileSink::processRequest(Request *request) >> } >> >> void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer, >> - [[maybe_unused]] const ControlList &metadata) >> + [[maybe_unused]] const MetadataList &metadata) >> { >> std::string filename = pattern_; >> size_t pos; >> diff --git a/src/apps/cam/file_sink.h b/src/apps/cam/file_sink.h >> index 26cd61b36d..1f973f2e61 100644 >> --- a/src/apps/cam/file_sink.h >> +++ b/src/apps/cam/file_sink.h >> @@ -11,7 +11,7 @@ >> #include <memory> >> #include <string> >> >> -#include <libcamera/controls.h> >> +#include <libcamera/metadata_list.h> >> #include <libcamera/stream.h> >> >> #include "frame_sink.h" >> @@ -44,7 +44,7 @@ private: >> >> void writeBuffer(const libcamera::Stream *stream, >> libcamera::FrameBuffer *buffer, >> - const libcamera::ControlList &metadata); >> + const libcamera::MetadataList &metadata); >> >> #ifdef HAVE_TIFF >> const libcamera::Camera *camera_; >> diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp >> index 8d57023e1e..4319795643 100644 >> --- a/src/apps/common/dng_writer.cpp >> +++ b/src/apps/common/dng_writer.cpp >> @@ -521,7 +521,7 @@ const std::map<PixelFormat, FormatInfo> formatInfo = { >> >> int DNGWriter::write(const char *filename, const Camera *camera, >> const StreamConfiguration &config, >> - const ControlList &metadata, >> + const MetadataList &metadata, >> [[maybe_unused]] const FrameBuffer *buffer, >> const void *data) >> { >> diff --git a/src/apps/common/dng_writer.h b/src/apps/common/dng_writer.h >> index aaa8a852b3..741f78a75b 100644 >> --- a/src/apps/common/dng_writer.h >> +++ b/src/apps/common/dng_writer.h >> @@ -10,8 +10,8 @@ >> #ifdef HAVE_TIFF >> >> #include <libcamera/camera.h> >> -#include <libcamera/controls.h> >> #include <libcamera/framebuffer.h> >> +#include <libcamera/metadata_list.h> >> #include <libcamera/stream.h> >> >> class DNGWriter >> @@ -19,7 +19,7 @@ class DNGWriter >> public: >> static int write(const char *filename, const libcamera::Camera *camera, >> const libcamera::StreamConfiguration &config, >> - const libcamera::ControlList &metadata, >> + const libcamera::MetadataList &metadata, >> const libcamera::FrameBuffer *buffer, const void *data); >> }; >> >> diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp >> index 96a2d50901..2a678c19aa 100644 >> --- a/src/apps/qcam/main_window.cpp >> +++ b/src/apps/qcam/main_window.cpp >> @@ -646,7 +646,7 @@ void MainWindow::captureRaw() >> } >> >> void MainWindow::processRaw(FrameBuffer *buffer, >> - [[maybe_unused]] const ControlList &metadata) >> + [[maybe_unused]] const MetadataList &metadata) >> { >> #ifdef HAVE_TIFF >> QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); >> diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h >> index 81fcf915ad..278de1d449 100644 >> --- a/src/apps/qcam/main_window.h >> +++ b/src/apps/qcam/main_window.h >> @@ -15,6 +15,7 @@ >> #include <libcamera/controls.h> >> #include <libcamera/framebuffer.h> >> #include <libcamera/framebuffer_allocator.h> >> +#include <libcamera/metadata_list.h> >> #include <libcamera/request.h> >> #include <libcamera/stream.h> >> >> @@ -66,7 +67,7 @@ private Q_SLOTS: >> void saveImageAs(); >> void captureRaw(); >> void processRaw(libcamera::FrameBuffer *buffer, >> - const libcamera::ControlList &metadata); >> + const libcamera::MetadataList &metadata); >> >> void renderComplete(libcamera::FrameBuffer *buffer); >> >> diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in >> index 6faf3ee7a6..b42eade9b8 100644 >> --- a/src/gstreamer/gstlibcamera-controls.cpp.in >> +++ b/src/gstreamer/gstlibcamera-controls.cpp.in >> @@ -282,6 +282,6 @@ void GstCameraControls::applyControls(std::unique_ptr<libcamera::Request> &reque >> >> void GstCameraControls::readMetadata(libcamera::Request *request) >> { >> - controls_acc_.merge(request->metadata(), >> - ControlList::MergePolicy::OverwriteExisting); >> + for (const auto &[k, v] : request->metadata()) >> + controls_acc_.set(k, ControlValue(v)); >> } >> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp >> index a3a37de873..ae81cfa4d5 100644 >> --- a/src/libcamera/pipeline_handler.cpp >> +++ b/src/libcamera/pipeline_handler.cpp >> @@ -559,9 +559,9 @@ void PipelineHandler::doQueueRequests(Camera *camera) >> */ >> void PipelineHandler::metadataAvailable(Request *request, const ControlList &metadata) >> { >> - request->metadata().merge(metadata); >> + request->metadata2().merge(metadata); >> >> - const auto d = request->metadata2().merge(metadata); >> + const auto d = request->metadata().merge(metadata); >> if (!d) >> LOG(Pipeline, Fatal) << "Tried to add incompatible metadata items"; >> >> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp >> index 0ff465e6f7..8e272eeece 100644 >> --- a/src/libcamera/request.cpp >> +++ b/src/libcamera/request.cpp >> @@ -357,7 +357,7 @@ void Request::Private::timeout() >> */ >> Request::Request(Camera *camera, uint64_t cookie) >> : Extensible(std::make_unique<Private>(camera)), >> - metadata2_(camera->_d()->metadataPlan_), >> + metadata_(camera->_d()->metadataPlan_), >> cookie_(cookie), status_(RequestPending) >> { >> controls_ = new ControlList(controls::controls, >> @@ -366,7 +366,7 @@ Request::Request(Camera *camera, uint64_t cookie) >> /** >> * \todo Add a validator for metadata controls. >> */ >> - metadata_ = new ControlList(controls::controls); >> + metadata2_ = new ControlList(controls::controls); >> >> LIBCAMERA_TRACEPOINT(request_construct, this); >> >> @@ -377,7 +377,7 @@ Request::~Request() >> { >> LIBCAMERA_TRACEPOINT(request_destroy, this); >> >> - delete metadata_; >> + delete metadata2_; >> delete controls_; >> } >> >> @@ -410,8 +410,8 @@ void Request::reuse(ReuseFlag flags) >> status_ = RequestPending; >> >> controls_->clear(); >> - metadata_->clear(); >> - metadata2_.clear(); >> + metadata_.clear(); >> + metadata2_->clear(); >> } >> >> /** >> diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp >> index 8c55ef8458..a994c90b70 100644 >> --- a/src/py/libcamera/py_helpers.cpp >> +++ b/src/py/libcamera/py_helpers.cpp >> @@ -16,7 +16,7 @@ namespace py = pybind11; >> using namespace libcamera; >> >> template<typename T> >> -static py::object valueOrTuple(const ControlValue &cv) >> +static py::object valueOrTuple(const ControlValueView &cv) >> { >> if (cv.isArray()) { >> const T *v = reinterpret_cast<const T *>(cv.data().data()); >> @@ -31,7 +31,7 @@ static py::object valueOrTuple(const ControlValue &cv) >> return py::cast(cv.get<T>()); >> } >> >> -py::object controlValueToPy(const ControlValue &cv) >> +py::object controlValueToPy(const ControlValueView &cv) >> { >> switch (cv.type()) { >> case ControlTypeNone: >> diff --git a/src/py/libcamera/py_helpers.h b/src/py/libcamera/py_helpers.h >> index 983969dfff..895006d0c0 100644 >> --- a/src/py/libcamera/py_helpers.h >> +++ b/src/py/libcamera/py_helpers.h >> @@ -9,5 +9,5 @@ >> >> #include <pybind11/pybind11.h> >> >> -pybind11::object controlValueToPy(const libcamera::ControlValue &cv); >> +pybind11::object controlValueToPy(const libcamera::ControlValueView &cv); >> libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type); >> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp >> index a983ea75c3..77e0ead68a 100644 >> --- a/src/py/libcamera/py_main.cpp >> +++ b/src/py/libcamera/py_main.cpp >> @@ -466,7 +466,7 @@ PYBIND11_MODULE(_libcamera, m) >> self.controls().set(id.id(), pyToControlValue(value, id.type())); >> }) >> .def_property_readonly("metadata", [](Request &self) { >> - /* Convert ControlList to std container */ >> + /* Convert MetadataList to std container */ >> >> std::unordered_map<const ControlId *, py::object> ret; >> >> -- >> 2.51.1 >>
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 6c0e546e67..1803b9bbcf 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -69,11 +69,11 @@ public: void metadataAvailable(Request *request, const Control<T> &ctrl, const internal::cxx20::type_identity_t<T> &value) { - auto &m = request->metadata2(); + auto &m = request->metadata(); const auto c = m.checkpoint(); std::ignore = m.set(ctrl, value); - request->metadata().set(ctrl, value); + request->metadata2().set(ctrl, value); const auto d = c.diffSince(); if (d) @@ -88,8 +88,8 @@ public: void operator()(const Control<T> &ctrl, const internal::cxx20::type_identity_t<T> &value) const { - request->metadata().set(ctrl, value); - std::ignore = request->metadata2().set(ctrl, value); + std::ignore = request->metadata().set(ctrl, value); + request->metadata2().set(ctrl, value); } }; @@ -99,7 +99,7 @@ public: #endif void metadataAvailable(Request *request, Func func) { - const auto c = request->metadata2().checkpoint(); + const auto c = request->metadata().checkpoint(); std::invoke(func, MetadataSetter{ request }); diff --git a/include/libcamera/request.h b/include/libcamera/request.h index 23e7bde72c..6e7057c1d5 100644 --- a/include/libcamera/request.h +++ b/include/libcamera/request.h @@ -51,9 +51,9 @@ public: void reuse(ReuseFlag flags = Default); ControlList &controls() { return *controls_; } - ControlList &metadata() { return *metadata_; } + [[nodiscard]] MetadataList &metadata() { return metadata_; } #ifndef __DOXYGEN__ - [[nodiscard]] MetadataList &metadata2() { return metadata2_; } + ControlList &metadata2() { return *metadata2_; } #endif const BufferMap &buffers() const { return bufferMap_; } int addBuffer(const Stream *stream, FrameBuffer *buffer, @@ -72,8 +72,8 @@ private: LIBCAMERA_DISABLE_COPY(Request) ControlList *controls_; - ControlList *metadata_; - MetadataList metadata2_; + MetadataList metadata_; + ControlList *metadata2_; BufferMap bufferMap_; const uint64_t cookie_; diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 80ff248c2a..fa0cf1d236 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -1423,7 +1423,7 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream, std::unique_ptr<CameraMetadata> CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) const { - const ControlList &metadata = descriptor.request_->metadata(); + const MetadataList &metadata = descriptor.request_->metadata(); const CameraMetadata &settings = descriptor.settings_; camera_metadata_ro_entry_t entry; bool found; diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp index 7cd8772e0a..9c5ce97f43 100644 --- a/src/apps/cam/camera_session.cpp +++ b/src/apps/cam/camera_session.cpp @@ -545,19 +545,18 @@ void CameraSession::processRequest(Request *request) std::cout << info.str() << std::endl; if (printMetadata_) { - const ControlList &requestMetadata = request->metadata(); + const MetadataList &requestMetadata = request->metadata(); std::cout << "Metadata (" << requestMetadata.size() << " entries):\n"; for (const auto &[key, value] : requestMetadata) { const ControlId *id = controls::controls.at(key); - std::cout << "\t" << id->name() << " = " - << value.toString() << std::endl; + std::cout << '\t' << id->name() << " = " << value << std::endl; } const auto &requestMetadata2 = request->metadata2(); std::cout << "Metadata2 (" << requestMetadata2.size() << " entries):\n"; for (const auto &[key, value] : requestMetadata2) { const ControlId *id = controls::controls.at(key); - std::cout << '\t' << id->name() << " = " << value << std::endl; + std::cout << '\t' << id->name() << " = " << value.toString() << std::endl; } } diff --git a/src/apps/cam/file_sink.cpp b/src/apps/cam/file_sink.cpp index 65794a2f90..7149d782cc 100644 --- a/src/apps/cam/file_sink.cpp +++ b/src/apps/cam/file_sink.cpp @@ -102,7 +102,7 @@ bool FileSink::processRequest(Request *request) } void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer, - [[maybe_unused]] const ControlList &metadata) + [[maybe_unused]] const MetadataList &metadata) { std::string filename = pattern_; size_t pos; diff --git a/src/apps/cam/file_sink.h b/src/apps/cam/file_sink.h index 26cd61b36d..1f973f2e61 100644 --- a/src/apps/cam/file_sink.h +++ b/src/apps/cam/file_sink.h @@ -11,7 +11,7 @@ #include <memory> #include <string> -#include <libcamera/controls.h> +#include <libcamera/metadata_list.h> #include <libcamera/stream.h> #include "frame_sink.h" @@ -44,7 +44,7 @@ private: void writeBuffer(const libcamera::Stream *stream, libcamera::FrameBuffer *buffer, - const libcamera::ControlList &metadata); + const libcamera::MetadataList &metadata); #ifdef HAVE_TIFF const libcamera::Camera *camera_; diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp index 8d57023e1e..4319795643 100644 --- a/src/apps/common/dng_writer.cpp +++ b/src/apps/common/dng_writer.cpp @@ -521,7 +521,7 @@ const std::map<PixelFormat, FormatInfo> formatInfo = { int DNGWriter::write(const char *filename, const Camera *camera, const StreamConfiguration &config, - const ControlList &metadata, + const MetadataList &metadata, [[maybe_unused]] const FrameBuffer *buffer, const void *data) { diff --git a/src/apps/common/dng_writer.h b/src/apps/common/dng_writer.h index aaa8a852b3..741f78a75b 100644 --- a/src/apps/common/dng_writer.h +++ b/src/apps/common/dng_writer.h @@ -10,8 +10,8 @@ #ifdef HAVE_TIFF #include <libcamera/camera.h> -#include <libcamera/controls.h> #include <libcamera/framebuffer.h> +#include <libcamera/metadata_list.h> #include <libcamera/stream.h> class DNGWriter @@ -19,7 +19,7 @@ class DNGWriter public: static int write(const char *filename, const libcamera::Camera *camera, const libcamera::StreamConfiguration &config, - const libcamera::ControlList &metadata, + const libcamera::MetadataList &metadata, const libcamera::FrameBuffer *buffer, const void *data); }; diff --git a/src/apps/qcam/main_window.cpp b/src/apps/qcam/main_window.cpp index 96a2d50901..2a678c19aa 100644 --- a/src/apps/qcam/main_window.cpp +++ b/src/apps/qcam/main_window.cpp @@ -646,7 +646,7 @@ void MainWindow::captureRaw() } void MainWindow::processRaw(FrameBuffer *buffer, - [[maybe_unused]] const ControlList &metadata) + [[maybe_unused]] const MetadataList &metadata) { #ifdef HAVE_TIFF QString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); diff --git a/src/apps/qcam/main_window.h b/src/apps/qcam/main_window.h index 81fcf915ad..278de1d449 100644 --- a/src/apps/qcam/main_window.h +++ b/src/apps/qcam/main_window.h @@ -15,6 +15,7 @@ #include <libcamera/controls.h> #include <libcamera/framebuffer.h> #include <libcamera/framebuffer_allocator.h> +#include <libcamera/metadata_list.h> #include <libcamera/request.h> #include <libcamera/stream.h> @@ -66,7 +67,7 @@ private Q_SLOTS: void saveImageAs(); void captureRaw(); void processRaw(libcamera::FrameBuffer *buffer, - const libcamera::ControlList &metadata); + const libcamera::MetadataList &metadata); void renderComplete(libcamera::FrameBuffer *buffer); diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in b/src/gstreamer/gstlibcamera-controls.cpp.in index 6faf3ee7a6..b42eade9b8 100644 --- a/src/gstreamer/gstlibcamera-controls.cpp.in +++ b/src/gstreamer/gstlibcamera-controls.cpp.in @@ -282,6 +282,6 @@ void GstCameraControls::applyControls(std::unique_ptr<libcamera::Request> &reque void GstCameraControls::readMetadata(libcamera::Request *request) { - controls_acc_.merge(request->metadata(), - ControlList::MergePolicy::OverwriteExisting); + for (const auto &[k, v] : request->metadata()) + controls_acc_.set(k, ControlValue(v)); } diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index a3a37de873..ae81cfa4d5 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -559,9 +559,9 @@ void PipelineHandler::doQueueRequests(Camera *camera) */ void PipelineHandler::metadataAvailable(Request *request, const ControlList &metadata) { - request->metadata().merge(metadata); + request->metadata2().merge(metadata); - const auto d = request->metadata2().merge(metadata); + const auto d = request->metadata().merge(metadata); if (!d) LOG(Pipeline, Fatal) << "Tried to add incompatible metadata items"; diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 0ff465e6f7..8e272eeece 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -357,7 +357,7 @@ void Request::Private::timeout() */ Request::Request(Camera *camera, uint64_t cookie) : Extensible(std::make_unique<Private>(camera)), - metadata2_(camera->_d()->metadataPlan_), + metadata_(camera->_d()->metadataPlan_), cookie_(cookie), status_(RequestPending) { controls_ = new ControlList(controls::controls, @@ -366,7 +366,7 @@ Request::Request(Camera *camera, uint64_t cookie) /** * \todo Add a validator for metadata controls. */ - metadata_ = new ControlList(controls::controls); + metadata2_ = new ControlList(controls::controls); LIBCAMERA_TRACEPOINT(request_construct, this); @@ -377,7 +377,7 @@ Request::~Request() { LIBCAMERA_TRACEPOINT(request_destroy, this); - delete metadata_; + delete metadata2_; delete controls_; } @@ -410,8 +410,8 @@ void Request::reuse(ReuseFlag flags) status_ = RequestPending; controls_->clear(); - metadata_->clear(); - metadata2_.clear(); + metadata_.clear(); + metadata2_->clear(); } /** diff --git a/src/py/libcamera/py_helpers.cpp b/src/py/libcamera/py_helpers.cpp index 8c55ef8458..a994c90b70 100644 --- a/src/py/libcamera/py_helpers.cpp +++ b/src/py/libcamera/py_helpers.cpp @@ -16,7 +16,7 @@ namespace py = pybind11; using namespace libcamera; template<typename T> -static py::object valueOrTuple(const ControlValue &cv) +static py::object valueOrTuple(const ControlValueView &cv) { if (cv.isArray()) { const T *v = reinterpret_cast<const T *>(cv.data().data()); @@ -31,7 +31,7 @@ static py::object valueOrTuple(const ControlValue &cv) return py::cast(cv.get<T>()); } -py::object controlValueToPy(const ControlValue &cv) +py::object controlValueToPy(const ControlValueView &cv) { switch (cv.type()) { case ControlTypeNone: diff --git a/src/py/libcamera/py_helpers.h b/src/py/libcamera/py_helpers.h index 983969dfff..895006d0c0 100644 --- a/src/py/libcamera/py_helpers.h +++ b/src/py/libcamera/py_helpers.h @@ -9,5 +9,5 @@ #include <pybind11/pybind11.h> -pybind11::object controlValueToPy(const libcamera::ControlValue &cv); +pybind11::object controlValueToPy(const libcamera::ControlValueView &cv); libcamera::ControlValue pyToControlValue(const pybind11::object &ob, libcamera::ControlType type); diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp index a983ea75c3..77e0ead68a 100644 --- a/src/py/libcamera/py_main.cpp +++ b/src/py/libcamera/py_main.cpp @@ -466,7 +466,7 @@ PYBIND11_MODULE(_libcamera, m) self.controls().set(id.id(), pyToControlValue(value, id.type())); }) .def_property_readonly("metadata", [](Request &self) { - /* Convert ControlList to std container */ + /* Convert MetadataList to std container */ std::unordered_map<const ControlId *, py::object> ret;