android: jpeg: Support an initial set of EXIF metadata tags

Create a Exif object with various metadata tags set, just before
the encoder starts to encode the frame. The object is passed
directly as libcamera::Span<> to make sure EXIF tags can be set
in a single place i.e. in CameraDevice and the encoder only has
the job to write the data in the final output.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Umang Jain <email@uajain.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Umang Jain 2020-09-09 16:44:45 +05:30 committed by Laurent Pinchart
parent c3d1329b93
commit 6f09a619cc
6 changed files with 88 additions and 4 deletions

View file

@ -24,6 +24,7 @@
#include "system/graphics.h"
#include "jpeg/encoder_libjpeg.h"
#include "jpeg/exif.h"
using namespace libcamera;
@ -1439,7 +1440,23 @@ void CameraDevice::requestComplete(Request *request)
continue;
}
int jpeg_size = encoder->encode(buffer, mapped.maps()[0]);
/* Set EXIF metadata for various tags. */
Exif exif;
/* \todo Set Make and Model from external vendor tags. */
exif.setMake("libcamera");
exif.setModel("cameraModel");
exif.setOrientation(orientation_);
exif.setSize(cameraStream->size);
/*
* We set the frame's EXIF timestamp as the time of encode.
* Since the precision we need for EXIF timestamp is only one
* second, it is good enough.
*/
exif.setTimestamp(std::time(nullptr));
if (exif.generate() != 0)
LOG(HAL, Error) << "Failed to generate valid EXIF data";
int jpeg_size = encoder->encode(buffer, mapped.maps()[0], exif.data());
if (jpeg_size < 0) {
LOG(HAL, Error) << "Failed to encode stream image";
status = CAMERA3_BUFFER_STATUS_ERROR;