<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>