[libcamera-devel,3/7] android: camera_metadata: Add appendEntry helper
diff mbox series

Message ID 20211123104042.3100902-4-paul.elder@ideasonboard.com
State Superseded
Delegated to: Paul Elder
Headers show
Series
  • android: Miscellaneous fixes
Related show

Commit Message

Paul Elder Nov. 23, 2021, 10:40 a.m. UTC
Add appendEntry() helper, that automatically detects if updateEntry() or
addEntry() should be used.

For now only implement it for enums and arithmetic values, as they will
mainly be used in populating templates, where the preview template
generator may or may not have (based on capabilities) already added a
key.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
 src/android/camera_metadata.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Kieran Bingham Nov. 25, 2021, 11:05 a.m. UTC | #1
Quoting Paul Elder (2021-11-23 10:40:38)
> Add appendEntry() helper, that automatically detects if updateEntry() or
> addEntry() should be used.
> 
> For now only implement it for enums and arithmetic values, as they will
> mainly be used in populating templates, where the preview template
> generator may or may not have (based on capabilities) already added a
> key.

I'm curious, should this always be the case? or is it better to be
explicit to only use update when we know it could already be there to
ensure efficiencies.

Otherwise it might be simpler to add this check into addEntry()
directly?

I assume we never want a tag to be added multiple times?

If this is explicitly separated for efficiency reasons then:


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> 
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> ---
>  src/android/camera_metadata.h | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h
> index 8555c7c3..cca14d6c 100644
> --- a/src/android/camera_metadata.h
> +++ b/src/android/camera_metadata.h
> @@ -33,6 +33,17 @@ public:
>  
>         bool hasEntry(uint32_t tag) const;
>  
> +       template<typename T,
> +                std::enable_if_t<std::is_arithmetic_v<T> ||
> +                                 std::is_enum_v<T>> * = nullptr>
> +       bool appendEntry(uint32_t tag, const T &data)
> +       {
> +               if (hasEntry(tag))
> +                       return updateEntry(tag, &data, 1, sizeof(T));
> +               else
> +                       return addEntry(tag, &data, 1, sizeof(T));
> +       }
> +
>         template<typename T,
>                  std::enable_if_t<std::is_arithmetic_v<T> ||
>                                   std::is_enum_v<T>> * = nullptr>
> -- 
> 2.27.0
>
Paul Elder Dec. 20, 2021, 10:48 p.m. UTC | #2
Hi Kieran,

On Thu, Nov 25, 2021 at 11:05:13AM +0000, Kieran Bingham wrote:
> Quoting Paul Elder (2021-11-23 10:40:38)
> > Add appendEntry() helper, that automatically detects if updateEntry() or
> > addEntry() should be used.
> > 
> > For now only implement it for enums and arithmetic values, as they will
> > mainly be used in populating templates, where the preview template
> > generator may or may not have (based on capabilities) already added a
> > key.
> 
> I'm curious, should this always be the case? or is it better to be
> explicit to only use update when we know it could already be there to
> ensure efficiencies.

updateEntry() will fail if the entry is not yet added, and addEntry()
will fail if the entry is already added. It's not a nice noisy failure
either, you get weird behavior and scratch your head like "wtf I added
this key with this value what are you talking about".

> 
> Otherwise it might be simpler to add this check into addEntry()
> directly?

I considered it tbh. But decided against it for efficiency reasons (that
were never really quantitatively assesed).

> 
> I assume we never want a tag to be added multiple times?

Yeah, it'll fail.

> 
> If this is explicitly separated for efficiency reasons then:

It's for correctness. For keys up to now, the preview template generator
would *always* add a key, and the other template generators, that use
the preview template as a base, could reliably use updateEntry. Now we
can't anymore, since the preview template generator would do if
(capability) { addEntry() }, so the later template generators can't
guarantee updateEntry() is the correct function.

I thought I explained this in the commit message :/

Clearly it wasn't sufficient. I'll add a line about correctness with
addEntry and updateEntry.

> 
> 
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>


Thanks,

Paul

> 
> > 
> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> > ---
> >  src/android/camera_metadata.h | 11 +++++++++++
> >  1 file changed, 11 insertions(+)
> > 
> > diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h
> > index 8555c7c3..cca14d6c 100644
> > --- a/src/android/camera_metadata.h
> > +++ b/src/android/camera_metadata.h
> > @@ -33,6 +33,17 @@ public:
> >  
> >         bool hasEntry(uint32_t tag) const;
> >  
> > +       template<typename T,
> > +                std::enable_if_t<std::is_arithmetic_v<T> ||
> > +                                 std::is_enum_v<T>> * = nullptr>
> > +       bool appendEntry(uint32_t tag, const T &data)
> > +       {
> > +               if (hasEntry(tag))
> > +                       return updateEntry(tag, &data, 1, sizeof(T));
> > +               else
> > +                       return addEntry(tag, &data, 1, sizeof(T));
> > +       }
> > +
> >         template<typename T,
> >                  std::enable_if_t<std::is_arithmetic_v<T> ||
> >                                   std::is_enum_v<T>> * = nullptr>
> > -- 
> > 2.27.0
> >

Patch
diff mbox series

diff --git a/src/android/camera_metadata.h b/src/android/camera_metadata.h
index 8555c7c3..cca14d6c 100644
--- a/src/android/camera_metadata.h
+++ b/src/android/camera_metadata.h
@@ -33,6 +33,17 @@  public:
 
 	bool hasEntry(uint32_t tag) const;
 
+	template<typename T,
+		 std::enable_if_t<std::is_arithmetic_v<T> ||
+				  std::is_enum_v<T>> * = nullptr>
+	bool appendEntry(uint32_t tag, const T &data)
+	{
+		if (hasEntry(tag))
+			return updateEntry(tag, &data, 1, sizeof(T));
+		else
+			return addEntry(tag, &data, 1, sizeof(T));
+	}
+
 	template<typename T,
 		 std::enable_if_t<std::is_arithmetic_v<T> ||
 				  std::is_enum_v<T>> * = nullptr>