[libcamera-devel,2/3] android: jpeg: Pass a Exif object while encoding

Message ID 20200824204646.16866-3-email@uajain.com
State Superseded
Headers show
Series
  • Initial EXIF metadata support
Related show

Commit Message

Umang Jain Aug. 24, 2020, 8:46 p.m. UTC
Create a Exif object when the jpeg encoder is about to start
encoding the stream in CameraDevice::requestComplete(). This is
done so that the CameraDevice's metadata (like Orientation) can
be populated inside the Exif object and passed on to the encoder
(which will populate FrameBuffer associated metadata).

Signed-off-by: Umang Jain <email@uajain.com>
---
 src/android/camera_device.cpp        | 4 +++-
 src/android/jpeg/encoder.h           | 5 ++++-
 src/android/jpeg/encoder_libjpeg.cpp | 3 ++-
 src/android/jpeg/encoder_libjpeg.h   | 3 ++-
 4 files changed, 11 insertions(+), 4 deletions(-)

Comments

Kieran Bingham Aug. 24, 2020, 9:03 p.m. UTC | #1
Hi Umang,

On 24/08/2020 21:46, Umang Jain wrote:
> Create a Exif object when the jpeg encoder is about to start
> encoding the stream in CameraDevice::requestComplete(). This is
> done so that the CameraDevice's metadata (like Orientation) can
> be populated inside the Exif object and passed on to the encoder
> (which will populate FrameBuffer associated metadata).
> 
> Signed-off-by: Umang Jain <email@uajain.com>
> ---
>  src/android/camera_device.cpp        | 4 +++-
>  src/android/jpeg/encoder.h           | 5 ++++-
>  src/android/jpeg/encoder_libjpeg.cpp | 3 ++-
>  src/android/jpeg/encoder_libjpeg.h   | 3 ++-
>  4 files changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index de6f86f..bc5690e 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1434,7 +1434,9 @@ void CameraDevice::requestComplete(Request *request)
>  			continue;
>  		}
>  
> -		int jpeg_size = encoder->encode(buffer, mapped.maps()[0]);
> +		Exif exif;

Can we populate the exif tags into the Exif here (from within the
CameraDevice)?

Hopefully, we have all the information we expect from the CameraDevice /
CameraStream ...

Also, I think we could make the Exif part of the CameraStream, and set
things like the width/height / Make / Model just a single time (per stream).

Then the 'only' tag we'd have to set here would be per frame things like
the timestamp.


> +
> +		int jpeg_size = encoder->encode(buffer, mapped.maps()[0], &exif);

Then perhaps pass the output span in to the encoder rather than making
the jpeg encoder have extra knowledge about the exif object?



>  		if (jpeg_size < 0) {
>  			LOG(HAL, Error) << "Failed to encode stream image";
>  			status = CAMERA3_BUFFER_STATUS_ERROR;
> diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
> index f9eb88e..806cf4f 100644
> --- a/src/android/jpeg/encoder.h
> +++ b/src/android/jpeg/encoder.h
> @@ -7,6 +7,8 @@
>  #ifndef __ANDROID_JPEG_ENCODER_H__
>  #define __ANDROID_JPEG_ENCODER_H__
>  
> +#include "exif.h"
> +
>  #include <libcamera/buffer.h>
>  #include <libcamera/span.h>
>  #include <libcamera/stream.h>
> @@ -18,7 +20,8 @@ public:
>  
>  	virtual int configure(const libcamera::StreamConfiguration &cfg) = 0;
>  	virtual int encode(const libcamera::FrameBuffer *source,
> -			   const libcamera::Span<uint8_t> &destination) = 0;
> +			   const libcamera::Span<uint8_t> &destination,
> +			   Exif *exif) = 0;
>  };
>  
>  #endif /* __ANDROID_JPEG_ENCODER_H__ */
> diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
> index 977538c..0cd93b6 100644
> --- a/src/android/jpeg/encoder_libjpeg.cpp
> +++ b/src/android/jpeg/encoder_libjpeg.cpp
> @@ -180,7 +180,8 @@ void EncoderLibJpeg::compressNV(const libcamera::MappedBuffer *frame)
>  }
>  
>  int EncoderLibJpeg::encode(const FrameBuffer *source,
> -			   const libcamera::Span<uint8_t> &dest)
> +			   const libcamera::Span<uint8_t> &dest,
> +			   Exif *exif)
>  {
>  	MappedFrameBuffer frame(source, PROT_READ);
>  	if (!frame.isValid()) {
> diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
> index aed081a..7e0757a 100644
> --- a/src/android/jpeg/encoder_libjpeg.h
> +++ b/src/android/jpeg/encoder_libjpeg.h
> @@ -22,7 +22,8 @@ public:
>  
>  	int configure(const libcamera::StreamConfiguration &cfg) override;
>  	int encode(const libcamera::FrameBuffer *source,
> -		   const libcamera::Span<uint8_t> &destination) override;
> +		   const libcamera::Span<uint8_t> &destination,
> +		   Exif *exif) override;
>  
>  private:
>  	void compressRGB(const libcamera::MappedBuffer *frame);
>

Patch

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index de6f86f..bc5690e 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1434,7 +1434,9 @@  void CameraDevice::requestComplete(Request *request)
 			continue;
 		}
 
-		int jpeg_size = encoder->encode(buffer, mapped.maps()[0]);
+		Exif exif;
+
+		int jpeg_size = encoder->encode(buffer, mapped.maps()[0], &exif);
 		if (jpeg_size < 0) {
 			LOG(HAL, Error) << "Failed to encode stream image";
 			status = CAMERA3_BUFFER_STATUS_ERROR;
diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
index f9eb88e..806cf4f 100644
--- a/src/android/jpeg/encoder.h
+++ b/src/android/jpeg/encoder.h
@@ -7,6 +7,8 @@ 
 #ifndef __ANDROID_JPEG_ENCODER_H__
 #define __ANDROID_JPEG_ENCODER_H__
 
+#include "exif.h"
+
 #include <libcamera/buffer.h>
 #include <libcamera/span.h>
 #include <libcamera/stream.h>
@@ -18,7 +20,8 @@  public:
 
 	virtual int configure(const libcamera::StreamConfiguration &cfg) = 0;
 	virtual int encode(const libcamera::FrameBuffer *source,
-			   const libcamera::Span<uint8_t> &destination) = 0;
+			   const libcamera::Span<uint8_t> &destination,
+			   Exif *exif) = 0;
 };
 
 #endif /* __ANDROID_JPEG_ENCODER_H__ */
diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
index 977538c..0cd93b6 100644
--- a/src/android/jpeg/encoder_libjpeg.cpp
+++ b/src/android/jpeg/encoder_libjpeg.cpp
@@ -180,7 +180,8 @@  void EncoderLibJpeg::compressNV(const libcamera::MappedBuffer *frame)
 }
 
 int EncoderLibJpeg::encode(const FrameBuffer *source,
-			   const libcamera::Span<uint8_t> &dest)
+			   const libcamera::Span<uint8_t> &dest,
+			   Exif *exif)
 {
 	MappedFrameBuffer frame(source, PROT_READ);
 	if (!frame.isValid()) {
diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
index aed081a..7e0757a 100644
--- a/src/android/jpeg/encoder_libjpeg.h
+++ b/src/android/jpeg/encoder_libjpeg.h
@@ -22,7 +22,8 @@  public:
 
 	int configure(const libcamera::StreamConfiguration &cfg) override;
 	int encode(const libcamera::FrameBuffer *source,
-		   const libcamera::Span<uint8_t> &destination) override;
+		   const libcamera::Span<uint8_t> &destination,
+		   Exif *exif) override;
 
 private:
 	void compressRGB(const libcamera::MappedBuffer *frame);