Message ID | 20200824204646.16866-3-email@uajain.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
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); >
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);
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(-)