<div dir="ltr"><div dir="ltr">Hi Paul,</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 14, 2021 at 6:32 PM Kieran Bingham <<a href="mailto:kieran.bingham@ideasonboard.com">kieran.bingham@ideasonboard.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Paul,<br>
<br>
On 14/05/2021 10:27, Paul Elder wrote:<br>
> Add utility functions to CameraMetadata to check if it has been resized,<br>
> and for outputting the actual entry and data count. This is meant to be<br>
> used to output information on resizing, to assist developers in<br>
> choosing proper initial sizes to avoid resizing. Also make CameraDevice<br>
> use these functions for static and result metadata.<br>
<br>
Great, that's exactly what I had envisioned, and allows developers to<br>
initialise the static metadata reservations with exact sizes when they<br>
get adjusted, while still allowing the system to perform correctly if<br>
the initial reservations were too low.<br>
<br>
For metadata which is used more dynamically, it will be harder to get an<br>
exact size - but that's up to the developers to identify and size<br>
correctly to balance the initial reservation against expected usages.<br>
<br>
Thanks!<br>
<br>
Reviewed-by: Kieran Bingham <<a href="mailto:kieran.bingham@ideasonboard.com" target="_blank">kieran.bingham@ideasonboard.com</a>><br>
<br>
<br>
> Signed-off-by: Paul Elder <<a href="mailto:paul.elder@ideasonboard.com" target="_blank">paul.elder@ideasonboard.com</a>><br>
> ---<br>
> src/android/camera_device.cpp | 16 ++++++++++++++++<br>
> src/android/camera_metadata.cpp | 14 +++++++++++++-<br>
> src/android/camera_metadata.h | 4 ++++<br>
> 3 files changed, 33 insertions(+), 1 deletion(-)<br>
> <br>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp<br>
> index b32e8be5..15f81b04 100644<br>
> --- a/src/android/camera_device.cpp<br>
> +++ b/src/android/camera_device.cpp<br>
> @@ -1391,6 +1391,14 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()<br>
> return nullptr;<br>
> }<br>
> <br>
> + if (staticMetadata_->resized()) {<br>
> + size_t entryCount, dataCount;<br>
> + std::tie(entryCount, dataCount) = staticMetadata_->usage();<br></blockquote><div><br></div><div>nit: You can write these two lines as auto [entryCount, dataCount] = staticMetadata->usage() since C++17.</div><div><br></div><div>Reviewed-by: Hirokazu Honda <<a href="mailto:hiroh@chromium.org">hiroh@chromium.org</a>></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> + LOG(HAL, Info)<br>
> + << "Static metadata resized: " << entryCount<br>
> + << " entries and " << dataCount << " bytes used";<br>
> + }<br>
> +<br>
> return staticMetadata_->get();<br>
> }<br>
> <br>
> @@ -2269,5 +2277,13 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons<br>
> LOG(HAL, Error) << "Failed to construct result metadata";<br>
> }<br>
> <br>
> + if (resultMetadata->resized()) {<br>
> + size_t entryCount, dataCount;<br>
> + std::tie(entryCount, dataCount) = resultMetadata->usage();<br>
> + LOG(HAL, Info)<br>
> + << "Result metadata resized: " << entryCount<br>
> + << " entries and " << dataCount << " bytes used";<br>
> + }<br>
> +<br>
> return resultMetadata;<br>
> }<br>
> diff --git a/src/android/camera_metadata.cpp b/src/android/camera_metadata.cpp<br>
> index bf8d2781..0588ea4e 100644<br>
> --- a/src/android/camera_metadata.cpp<br>
> +++ b/src/android/camera_metadata.cpp<br>
> @@ -14,17 +14,19 @@ using namespace libcamera;<br>
> LOG_DEFINE_CATEGORY(CameraMetadata)<br>
> <br>
> CameraMetadata::CameraMetadata()<br>
> - : metadata_(nullptr), valid_(false)<br>
> + : metadata_(nullptr), valid_(false), resized_(false)<br>
> {<br>
> }<br>
> <br>
> CameraMetadata::CameraMetadata(size_t entryCapacity, size_t dataCapacity)<br>
> + : resized_(false)<br>
> {<br>
> metadata_ = allocate_camera_metadata(entryCapacity, dataCapacity);<br>
> valid_ = metadata_ != nullptr;<br>
> }<br>
> <br>
> CameraMetadata::CameraMetadata(const camera_metadata_t *metadata)<br>
> + : resized_(false)<br>
> {<br>
> metadata_ = clone_camera_metadata(metadata);<br>
> valid_ = metadata_ != nullptr;<br>
> @@ -55,6 +57,14 @@ CameraMetadata &CameraMetadata::operator=(const CameraMetadata &other)<br>
> return *this;<br>
> }<br>
> <br>
> +std::tuple<size_t, size_t> CameraMetadata::usage() const<br>
> +{<br>
> + size_t currentEntryCount = get_camera_metadata_entry_count(metadata_);<br>
> + size_t currentDataCount = get_camera_metadata_data_count(metadata_);<br>
> +<br>
> + return { currentEntryCount, currentDataCount };<br>
> +}<br>
> +<br>
> bool CameraMetadata::getEntry(uint32_t tag, camera_metadata_ro_entry_t *entry) const<br>
> {<br>
> if (find_camera_metadata_ro_entry(metadata_, tag, entry))<br>
> @@ -104,6 +114,8 @@ bool CameraMetadata::resize(size_t count, size_t size)<br>
> <br>
> append_camera_metadata(metadata_, oldMetadata);<br>
> free_camera_metadata(oldMetadata);<br>
> +<br>
> + resized_ = true;<br>
> }<br>
> <br>
> return true;<br>
> diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h<br>
> index 07afd4b2..b291fbf9 100644<br>
> --- a/src/android/camera_metadata.h<br>
> +++ b/src/android/camera_metadata.h<br>
> @@ -23,6 +23,9 @@ public:<br>
> <br>
> CameraMetadata &operator=(const CameraMetadata &other);<br>
> <br>
> + std::tuple<size_t, size_t> usage() const;<br>
> + bool resized() const { return resized_; }<br>
> +<br>
> bool isValid() const { return valid_; }<br>
> bool resize(size_t count, size_t size);<br>
> bool getEntry(uint32_t tag, camera_metadata_ro_entry_t *entry) const;<br>
> @@ -81,6 +84,7 @@ public:<br>
> private:<br>
> camera_metadata_t *metadata_;<br>
> bool valid_;<br>
> + bool resized_;<br>
> };<br>
> <br>
> #endif /* __ANDROID_CAMERA_METADATA_H__ */<br>
> <br>
<br>
-- <br>
Regards<br>
--<br>
Kieran<br>
_______________________________________________<br>
libcamera-devel mailing list<br>
<a href="mailto:libcamera-devel@lists.libcamera.org" target="_blank">libcamera-devel@lists.libcamera.org</a><br>
<a href="https://lists.libcamera.org/listinfo/libcamera-devel" rel="noreferrer" target="_blank">https://lists.libcamera.org/listinfo/libcamera-devel</a><br>
</blockquote></div></div>