summaryrefslogtreecommitdiff
path: root/src/android/camera_stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/camera_stream.cpp')
-rw-r--r--src/android/camera_stream.cpp77
1 files changed, 18 insertions, 59 deletions
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index d8e45c2a..1b8afa87 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -9,9 +9,9 @@
#include "camera_device.h"
#include "camera_metadata.h"
-#include "jpeg/encoder.h"
-#include "jpeg/encoder_libjpeg.h"
-#include "jpeg/exif.h"
+#include "jpeg/post_processor_jpeg.h"
+
+#include <libcamera/formats.h>
using namespace libcamera;
@@ -45,8 +45,15 @@ CameraStream::CameraStream(CameraDevice *cameraDevice, Type type,
{
config_ = cameraDevice_->cameraConfiguration();
- if (type_ == Type::Internal || type_ == Type::Mapped)
- encoder_ = std::make_unique<EncoderLibJpeg>();
+ if (type_ == Type::Internal || type_ == Type::Mapped) {
+ /*
+ * \todo There might be multiple post-processors. The logic
+ * which should be instantiated here, is deferred for the
+ * future. For now, we only have PostProcessorJpeg and that
+ * is what we instantiate here.
+ */
+ postProcessor_ = std::make_unique<PostProcessorJpeg>(cameraDevice_);
+ }
if (type == Type::Internal) {
allocator_ = std::make_unique<FrameBufferAllocator>(cameraDevice_->camera());
@@ -66,8 +73,10 @@ Stream *CameraStream::stream() const
int CameraStream::configure()
{
- if (encoder_) {
- int ret = encoder_->configure(configuration());
+ if (postProcessor_) {
+ StreamConfiguration output = configuration();
+ output.pixelFormat = formats::MJPEG;
+ int ret = postProcessor_->configure(configuration(), output);
if (ret)
return ret;
}
@@ -90,60 +99,10 @@ int CameraStream::configure()
int CameraStream::process(const libcamera::FrameBuffer &source,
MappedCamera3Buffer *dest, CameraMetadata *metadata)
{
- if (!encoder_)
+ if (!postProcessor_)
return 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(cameraDevice_->orientation());
- exif.setSize(configuration().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(&source, dest->maps()[0], exif.data());
- if (jpeg_size < 0) {
- LOG(HAL, Error) << "Failed to encode stream image";
- return jpeg_size;
- }
-
- /*
- * Fill in the JPEG blob header.
- *
- * The mapped size of the buffer is being returned as
- * substantially larger than the requested JPEG_MAX_SIZE
- * (which is referenced from maxJpegBufferSize_). Utilise
- * this static size to ensure the correct offset of the blob is
- * determined.
- *
- * \todo Investigate if the buffer size mismatch is an issue or
- * expected behaviour.
- */
- uint8_t *resultPtr = dest->maps()[0].data() +
- cameraDevice_->maxJpegBufferSize() -
- sizeof(struct camera3_jpeg_blob);
- auto *blob = reinterpret_cast<struct camera3_jpeg_blob *>(resultPtr);
- blob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
- blob->jpeg_size = jpeg_size;
-
- /* Update the JPEG result Metadata. */
- metadata->addEntry(ANDROID_JPEG_SIZE, &jpeg_size, 1);
-
- const uint32_t jpeg_quality = 95;
- metadata->addEntry(ANDROID_JPEG_QUALITY, &jpeg_quality, 1);
-
- const uint32_t jpeg_orientation = 0;
- metadata->addEntry(ANDROID_JPEG_ORIENTATION, &jpeg_orientation, 1);
-
- return 0;
+ return postProcessor_->process(&source, dest->maps()[0], metadata);
}
FrameBuffer *CameraStream::getBuffer()