Message ID | 20230208033319.1361109-6-chenghaoyang@google.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Harvey, Thank you for the patch. On Wed, Feb 08, 2023 at 03:33:19AM +0000, Harvey Yang via libcamera-devel wrote: > From: Harvey Yang <chenghaoyang@chromium.org> > > This patch adds JEA implementation to replace libjpeg in CrOS platform, > where hardware accelerator is available. > > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> > --- > src/android/cros/camera3_hal.cpp | 4 +- > src/android/cros_mojo_token.h | 12 +++++ > src/android/jpeg/encoder_jea.cpp | 56 ++++++++++++++++++++++++ > src/android/jpeg/encoder_jea.h | 31 +++++++++++++ > src/android/jpeg/meson.build | 10 ++++- > src/android/jpeg/post_processor_jpeg.cpp | 8 ++++ > 6 files changed, 118 insertions(+), 3 deletions(-) > create mode 100644 src/android/cros_mojo_token.h > create mode 100644 src/android/jpeg/encoder_jea.cpp > create mode 100644 src/android/jpeg/encoder_jea.h > > diff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp > index fb863b5f..71acb441 100644 > --- a/src/android/cros/camera3_hal.cpp > +++ b/src/android/cros/camera3_hal.cpp > @@ -8,9 +8,11 @@ > #include <cros-camera/cros_camera_hal.h> > > #include "../camera_hal_manager.h" > +#include "../cros_mojo_token.h" > > -static void set_up([[maybe_unused]] cros::CameraMojoChannelManagerToken *token) > +static void set_up(cros::CameraMojoChannelManagerToken *token) > { > + gCrosMojoToken = token; > } > > static void tear_down() > diff --git a/src/android/cros_mojo_token.h b/src/android/cros_mojo_token.h > new file mode 100644 > index 00000000..043c752a > --- /dev/null > +++ b/src/android/cros_mojo_token.h > @@ -0,0 +1,12 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* > + * Copyright (C) 2022, Google Inc. > + * > + * cros_mojo_token.h - cros-specific mojo token > + */ > + > +#pragma once > + > +#include <cros-camera/cros_camera_hal.h> > + > +inline cros::CameraMojoChannelManagerToken *gCrosMojoToken = nullptr; > diff --git a/src/android/jpeg/encoder_jea.cpp b/src/android/jpeg/encoder_jea.cpp > new file mode 100644 > index 00000000..7880a6bd > --- /dev/null > +++ b/src/android/jpeg/encoder_jea.cpp > @@ -0,0 +1,56 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* > + * Copyright (C) 2022, Google Inc. > + * > + * encoder_jea.cpp - JPEG encoding using CrOS JEA > + */ > + > +#include "encoder_jea.h" > + > +#include "libcamera/internal/mapped_framebuffer.h" > + > +#include <cros-camera/camera_mojo_channel_manager_token.h> > + > +#include "../cros_mojo_token.h" > +#include "../hal_framebuffer.h" > + > +EncoderJea::EncoderJea() = default; > + > +EncoderJea::~EncoderJea() = default; > + > +int EncoderJea::configure(const libcamera::StreamConfiguration &cfg) > +{ > + size_ = cfg.size; > + > + if (jpegCompressor_) > + return 0; > + > + if (gCrosMojoToken == nullptr) > + return -ENOTSUP; > + > + jpegCompressor_ = cros::JpegCompressor::GetInstance(gCrosMojoToken); > + > + return 0; > +} > + > +int EncoderJea::encode(Camera3RequestDescriptor::StreamBuffer *buffer, > + libcamera::Span<const uint8_t> exifData, > + unsigned int quality) > +{ > + if (!jpegCompressor_) > + return -ENOTSUP; > + > + uint32_t outDataSize = 0; > + const HALFrameBuffer *fb = > + dynamic_cast<const HALFrameBuffer *>(buffer->srcBuffer); > + > + if (!jpegCompressor_->CompressImageFromHandle(fb->handle(), > + *buffer->camera3Buffer, > + size_.width, size_.height, > + quality, exifData.data(), > + exifData.size(), > + &outDataSize)) > + return -EBUSY; > + > + return outDataSize; > +} > diff --git a/src/android/jpeg/encoder_jea.h b/src/android/jpeg/encoder_jea.h > new file mode 100644 > index 00000000..ffe9df27 > --- /dev/null > +++ b/src/android/jpeg/encoder_jea.h > @@ -0,0 +1,31 @@ > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > +/* > + * Copyright (C) 2022, Google Inc. > + * > + * encoder_jea.h - JPEG encoding using CrOS JEA > + */ > + > +#pragma once > + > +#include <libcamera/geometry.h> > + > +#include <cros-camera/jpeg_compressor.h> > + > +#include "encoder.h" > + > +class EncoderJea : public Encoder > +{ > +public: > + EncoderJea(); > + ~EncoderJea(); > + > + int configure(const libcamera::StreamConfiguration &cfg) override; > + int encode(Camera3RequestDescriptor::StreamBuffer *buffer, > + libcamera::Span<const uint8_t> exifData, > + unsigned int quality) override; > + > +private: > + libcamera::Size size_; > + > + std::unique_ptr<cros::JpegCompressor> jpegCompressor_; > +}; > diff --git a/src/android/jpeg/meson.build b/src/android/jpeg/meson.build > index 08397a87..9162576b 100644 > --- a/src/android/jpeg/meson.build > +++ b/src/android/jpeg/meson.build > @@ -1,8 +1,14 @@ > # SPDX-License-Identifier: CC0-1.0 > > android_hal_sources += files([ > - 'encoder_libjpeg.cpp', > 'exif.cpp', > + 'encoder_libjpeg.cpp', > + 'thumbnailer.cpp', > 'post_processor_jpeg.cpp', > - 'thumbnailer.cpp' > ]) This doesn't seem right, or needed. I'll fix this locally and push the series after running it through CTS. > + > +platform = get_option('android_platform') > +if platform == 'cros' > + android_hal_sources += files(['encoder_jea.cpp']) > + android_deps += [dependency('libcros_camera')] > +endif > diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp > index 3e676eb4..40261652 100644 > --- a/src/android/jpeg/post_processor_jpeg.cpp > +++ b/src/android/jpeg/post_processor_jpeg.cpp > @@ -12,7 +12,11 @@ > #include "../camera_device.h" > #include "../camera_metadata.h" > #include "../camera_request.h" > +#if defined(OS_CHROMEOS) > +#include "encoder_jea.h" > +#else /* !defined(OS_CHROMEOS) */ > #include "encoder_libjpeg.h" > +#endif > #include "exif.h" > > #include <libcamera/base/log.h> > @@ -46,7 +50,11 @@ int PostProcessorJpeg::configure(const StreamConfiguration &inCfg, > > thumbnailer_.configure(inCfg.size, inCfg.pixelFormat); > > +#if defined(OS_CHROMEOS) > + encoder_ = std::make_unique<EncoderJea>(); > +#else /* !defined(OS_CHROMEOS) */ > encoder_ = std::make_unique<EncoderLibJpeg>(); > +#endif > > return encoder_->configure(inCfg); > }
Quoting Laurent Pinchart via libcamera-devel (2023-02-09 21:55:21) > Hi Harvey, > > Thank you for the patch. > > On Wed, Feb 08, 2023 at 03:33:19AM +0000, Harvey Yang via libcamera-devel wrote: > > From: Harvey Yang <chenghaoyang@chromium.org> > > > > This patch adds JEA implementation to replace libjpeg in CrOS platform, > > where hardware accelerator is available. > > > > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> > > --- > > src/android/cros/camera3_hal.cpp | 4 +- > > src/android/cros_mojo_token.h | 12 +++++ > > src/android/jpeg/encoder_jea.cpp | 56 ++++++++++++++++++++++++ > > src/android/jpeg/encoder_jea.h | 31 +++++++++++++ > > src/android/jpeg/meson.build | 10 ++++- > > src/android/jpeg/post_processor_jpeg.cpp | 8 ++++ > > 6 files changed, 118 insertions(+), 3 deletions(-) > > create mode 100644 src/android/cros_mojo_token.h > > create mode 100644 src/android/jpeg/encoder_jea.cpp > > create mode 100644 src/android/jpeg/encoder_jea.h > > > > diff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp > > index fb863b5f..71acb441 100644 > > --- a/src/android/cros/camera3_hal.cpp > > +++ b/src/android/cros/camera3_hal.cpp > > @@ -8,9 +8,11 @@ > > #include <cros-camera/cros_camera_hal.h> > > > > #include "../camera_hal_manager.h" > > +#include "../cros_mojo_token.h" > > > > -static void set_up([[maybe_unused]] cros::CameraMojoChannelManagerToken *token) > > +static void set_up(cros::CameraMojoChannelManagerToken *token) > > { > > + gCrosMojoToken = token; > > } > > > > static void tear_down() > > diff --git a/src/android/cros_mojo_token.h b/src/android/cros_mojo_token.h > > new file mode 100644 > > index 00000000..043c752a > > --- /dev/null > > +++ b/src/android/cros_mojo_token.h > > @@ -0,0 +1,12 @@ > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > +/* > > + * Copyright (C) 2022, Google Inc. > > + * > > + * cros_mojo_token.h - cros-specific mojo token > > + */ > > + > > +#pragma once > > + > > +#include <cros-camera/cros_camera_hal.h> > > + > > +inline cros::CameraMojoChannelManagerToken *gCrosMojoToken = nullptr; > > diff --git a/src/android/jpeg/encoder_jea.cpp b/src/android/jpeg/encoder_jea.cpp > > new file mode 100644 > > index 00000000..7880a6bd > > --- /dev/null > > +++ b/src/android/jpeg/encoder_jea.cpp > > @@ -0,0 +1,56 @@ > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > +/* > > + * Copyright (C) 2022, Google Inc. > > + * > > + * encoder_jea.cpp - JPEG encoding using CrOS JEA > > + */ > > + > > +#include "encoder_jea.h" > > + > > +#include "libcamera/internal/mapped_framebuffer.h" > > + > > +#include <cros-camera/camera_mojo_channel_manager_token.h> > > + > > +#include "../cros_mojo_token.h" > > +#include "../hal_framebuffer.h" > > + > > +EncoderJea::EncoderJea() = default; > > + > > +EncoderJea::~EncoderJea() = default; > > + > > +int EncoderJea::configure(const libcamera::StreamConfiguration &cfg) > > +{ > > + size_ = cfg.size; > > + > > + if (jpegCompressor_) > > + return 0; > > + > > + if (gCrosMojoToken == nullptr) > > + return -ENOTSUP; > > + > > + jpegCompressor_ = cros::JpegCompressor::GetInstance(gCrosMojoToken); > > + > > + return 0; > > +} > > + > > +int EncoderJea::encode(Camera3RequestDescriptor::StreamBuffer *buffer, > > + libcamera::Span<const uint8_t> exifData, > > + unsigned int quality) > > +{ > > + if (!jpegCompressor_) > > + return -ENOTSUP; > > + > > + uint32_t outDataSize = 0; > > + const HALFrameBuffer *fb = > > + dynamic_cast<const HALFrameBuffer *>(buffer->srcBuffer); > > + > > + if (!jpegCompressor_->CompressImageFromHandle(fb->handle(), > > + *buffer->camera3Buffer, > > + size_.width, size_.height, > > + quality, exifData.data(), > > + exifData.size(), > > + &outDataSize)) > > + return -EBUSY; > > + > > + return outDataSize; > > +} > > diff --git a/src/android/jpeg/encoder_jea.h b/src/android/jpeg/encoder_jea.h > > new file mode 100644 > > index 00000000..ffe9df27 > > --- /dev/null > > +++ b/src/android/jpeg/encoder_jea.h > > @@ -0,0 +1,31 @@ > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > +/* > > + * Copyright (C) 2022, Google Inc. > > + * > > + * encoder_jea.h - JPEG encoding using CrOS JEA > > + */ > > + > > +#pragma once > > + > > +#include <libcamera/geometry.h> > > + > > +#include <cros-camera/jpeg_compressor.h> > > + > > +#include "encoder.h" > > + > > +class EncoderJea : public Encoder > > +{ > > +public: > > + EncoderJea(); > > + ~EncoderJea(); > > + > > + int configure(const libcamera::StreamConfiguration &cfg) override; > > + int encode(Camera3RequestDescriptor::StreamBuffer *buffer, > > + libcamera::Span<const uint8_t> exifData, > > + unsigned int quality) override; > > + > > +private: > > + libcamera::Size size_; > > + > > + std::unique_ptr<cros::JpegCompressor> jpegCompressor_; > > +}; > > diff --git a/src/android/jpeg/meson.build b/src/android/jpeg/meson.build > > index 08397a87..9162576b 100644 > > --- a/src/android/jpeg/meson.build > > +++ b/src/android/jpeg/meson.build > > @@ -1,8 +1,14 @@ > > # SPDX-License-Identifier: CC0-1.0 > > > > android_hal_sources += files([ > > - 'encoder_libjpeg.cpp', > > 'exif.cpp', > > + 'encoder_libjpeg.cpp', > > + 'thumbnailer.cpp', > > 'post_processor_jpeg.cpp', > > - 'thumbnailer.cpp' > > ]) > > This doesn't seem right, or needed. I'll fix this locally and push the > series after running it through CTS. Feel free to run again, but I ran this through CTS earlier: - https://results.uk.libcamera.org/0.0.4+10-53502641/2023.02.09_15.09.10/test_result.xml 8 failures, but not a regression - so this is OK with me. -- Kieran > > > + > > +platform = get_option('android_platform') > > +if platform == 'cros' > > + android_hal_sources += files(['encoder_jea.cpp']) > > + android_deps += [dependency('libcros_camera')] > > +endif > > diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp > > index 3e676eb4..40261652 100644 > > --- a/src/android/jpeg/post_processor_jpeg.cpp > > +++ b/src/android/jpeg/post_processor_jpeg.cpp > > @@ -12,7 +12,11 @@ > > #include "../camera_device.h" > > #include "../camera_metadata.h" > > #include "../camera_request.h" > > +#if defined(OS_CHROMEOS) > > +#include "encoder_jea.h" > > +#else /* !defined(OS_CHROMEOS) */ > > #include "encoder_libjpeg.h" > > +#endif > > #include "exif.h" > > > > #include <libcamera/base/log.h> > > @@ -46,7 +50,11 @@ int PostProcessorJpeg::configure(const StreamConfiguration &inCfg, > > > > thumbnailer_.configure(inCfg.size, inCfg.pixelFormat); > > > > +#if defined(OS_CHROMEOS) > > + encoder_ = std::make_unique<EncoderJea>(); > > +#else /* !defined(OS_CHROMEOS) */ > > encoder_ = std::make_unique<EncoderLibJpeg>(); > > +#endif > > > > return encoder_->configure(inCfg); > > } > > -- > Regards, > > Laurent Pinchart
Thank you Laurent, Kieran, and all for reviewing and helping land the series of patches! On Fri, Feb 10, 2023 at 6:47 AM Kieran Bingham < kieran.bingham@ideasonboard.com> wrote: > Quoting Laurent Pinchart via libcamera-devel (2023-02-09 21:55:21) > > Hi Harvey, > > > > Thank you for the patch. > > > > On Wed, Feb 08, 2023 at 03:33:19AM +0000, Harvey Yang via > libcamera-devel wrote: > > > From: Harvey Yang <chenghaoyang@chromium.org> > > > > > > This patch adds JEA implementation to replace libjpeg in CrOS platform, > > > where hardware accelerator is available. > > > > > > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org> > > > --- > > > src/android/cros/camera3_hal.cpp | 4 +- > > > src/android/cros_mojo_token.h | 12 +++++ > > > src/android/jpeg/encoder_jea.cpp | 56 ++++++++++++++++++++++++ > > > src/android/jpeg/encoder_jea.h | 31 +++++++++++++ > > > src/android/jpeg/meson.build | 10 ++++- > > > src/android/jpeg/post_processor_jpeg.cpp | 8 ++++ > > > 6 files changed, 118 insertions(+), 3 deletions(-) > > > create mode 100644 src/android/cros_mojo_token.h > > > create mode 100644 src/android/jpeg/encoder_jea.cpp > > > create mode 100644 src/android/jpeg/encoder_jea.h > > > > > > diff --git a/src/android/cros/camera3_hal.cpp > b/src/android/cros/camera3_hal.cpp > > > index fb863b5f..71acb441 100644 > > > --- a/src/android/cros/camera3_hal.cpp > > > +++ b/src/android/cros/camera3_hal.cpp > > > @@ -8,9 +8,11 @@ > > > #include <cros-camera/cros_camera_hal.h> > > > > > > #include "../camera_hal_manager.h" > > > +#include "../cros_mojo_token.h" > > > > > > -static void set_up([[maybe_unused]] > cros::CameraMojoChannelManagerToken *token) > > > +static void set_up(cros::CameraMojoChannelManagerToken *token) > > > { > > > + gCrosMojoToken = token; > > > } > > > > > > static void tear_down() > > > diff --git a/src/android/cros_mojo_token.h > b/src/android/cros_mojo_token.h > > > new file mode 100644 > > > index 00000000..043c752a > > > --- /dev/null > > > +++ b/src/android/cros_mojo_token.h > > > @@ -0,0 +1,12 @@ > > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > > +/* > > > + * Copyright (C) 2022, Google Inc. > > > + * > > > + * cros_mojo_token.h - cros-specific mojo token > > > + */ > > > + > > > +#pragma once > > > + > > > +#include <cros-camera/cros_camera_hal.h> > > > + > > > +inline cros::CameraMojoChannelManagerToken *gCrosMojoToken = nullptr; > > > diff --git a/src/android/jpeg/encoder_jea.cpp > b/src/android/jpeg/encoder_jea.cpp > > > new file mode 100644 > > > index 00000000..7880a6bd > > > --- /dev/null > > > +++ b/src/android/jpeg/encoder_jea.cpp > > > @@ -0,0 +1,56 @@ > > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > > +/* > > > + * Copyright (C) 2022, Google Inc. > > > + * > > > + * encoder_jea.cpp - JPEG encoding using CrOS JEA > > > + */ > > > + > > > +#include "encoder_jea.h" > > > + > > > +#include "libcamera/internal/mapped_framebuffer.h" > > > + > > > +#include <cros-camera/camera_mojo_channel_manager_token.h> > > > + > > > +#include "../cros_mojo_token.h" > > > +#include "../hal_framebuffer.h" > > > + > > > +EncoderJea::EncoderJea() = default; > > > + > > > +EncoderJea::~EncoderJea() = default; > > > + > > > +int EncoderJea::configure(const libcamera::StreamConfiguration &cfg) > > > +{ > > > + size_ = cfg.size; > > > + > > > + if (jpegCompressor_) > > > + return 0; > > > + > > > + if (gCrosMojoToken == nullptr) > > > + return -ENOTSUP; > > > + > > > + jpegCompressor_ = > cros::JpegCompressor::GetInstance(gCrosMojoToken); > > > + > > > + return 0; > > > +} > > > + > > > +int EncoderJea::encode(Camera3RequestDescriptor::StreamBuffer *buffer, > > > + libcamera::Span<const uint8_t> exifData, > > > + unsigned int quality) > > > +{ > > > + if (!jpegCompressor_) > > > + return -ENOTSUP; > > > + > > > + uint32_t outDataSize = 0; > > > + const HALFrameBuffer *fb = > > > + dynamic_cast<const HALFrameBuffer *>(buffer->srcBuffer); > > > + > > > + if (!jpegCompressor_->CompressImageFromHandle(fb->handle(), > > > + > *buffer->camera3Buffer, > > > + size_.width, > size_.height, > > > + quality, > exifData.data(), > > > + exifData.size(), > > > + &outDataSize)) > > > + return -EBUSY; > > > + > > > + return outDataSize; > > > +} > > > diff --git a/src/android/jpeg/encoder_jea.h > b/src/android/jpeg/encoder_jea.h > > > new file mode 100644 > > > index 00000000..ffe9df27 > > > --- /dev/null > > > +++ b/src/android/jpeg/encoder_jea.h > > > @@ -0,0 +1,31 @@ > > > +/* SPDX-License-Identifier: LGPL-2.1-or-later */ > > > +/* > > > + * Copyright (C) 2022, Google Inc. > > > + * > > > + * encoder_jea.h - JPEG encoding using CrOS JEA > > > + */ > > > + > > > +#pragma once > > > + > > > +#include <libcamera/geometry.h> > > > + > > > +#include <cros-camera/jpeg_compressor.h> > > > + > > > +#include "encoder.h" > > > + > > > +class EncoderJea : public Encoder > > > +{ > > > +public: > > > + EncoderJea(); > > > + ~EncoderJea(); > > > + > > > + int configure(const libcamera::StreamConfiguration &cfg) > override; > > > + int encode(Camera3RequestDescriptor::StreamBuffer *buffer, > > > + libcamera::Span<const uint8_t> exifData, > > > + unsigned int quality) override; > > > + > > > +private: > > > + libcamera::Size size_; > > > + > > > + std::unique_ptr<cros::JpegCompressor> jpegCompressor_; > > > +}; > > > diff --git a/src/android/jpeg/meson.build > b/src/android/jpeg/meson.build > > > index 08397a87..9162576b 100644 > > > --- a/src/android/jpeg/meson.build > > > +++ b/src/android/jpeg/meson.build > > > @@ -1,8 +1,14 @@ > > > # SPDX-License-Identifier: CC0-1.0 > > > > > > android_hal_sources += files([ > > > - 'encoder_libjpeg.cpp', > > > 'exif.cpp', > > > + 'encoder_libjpeg.cpp', > > > + 'thumbnailer.cpp', > > > 'post_processor_jpeg.cpp', > > > - 'thumbnailer.cpp' > > > ]) > > > > This doesn't seem right, or needed. I'll fix this locally and push the > > series after running it through CTS. > > Feel free to run again, but I ran this through CTS earlier: > > - > https://results.uk.libcamera.org/0.0.4+10-53502641/2023.02.09_15.09.10/test_result.xml > > 8 failures, but not a regression - so this is OK with me. > > -- > Kieran > > > > > > > + > > > +platform = get_option('android_platform') > > > +if platform == 'cros' > > > + android_hal_sources += files(['encoder_jea.cpp']) > > > + android_deps += [dependency('libcros_camera')] > > > +endif > > > diff --git a/src/android/jpeg/post_processor_jpeg.cpp > b/src/android/jpeg/post_processor_jpeg.cpp > > > index 3e676eb4..40261652 100644 > > > --- a/src/android/jpeg/post_processor_jpeg.cpp > > > +++ b/src/android/jpeg/post_processor_jpeg.cpp > > > @@ -12,7 +12,11 @@ > > > #include "../camera_device.h" > > > #include "../camera_metadata.h" > > > #include "../camera_request.h" > > > +#if defined(OS_CHROMEOS) > > > +#include "encoder_jea.h" > > > +#else /* !defined(OS_CHROMEOS) */ > > > #include "encoder_libjpeg.h" > > > +#endif > > > #include "exif.h" > > > > > > #include <libcamera/base/log.h> > > > @@ -46,7 +50,11 @@ int PostProcessorJpeg::configure(const > StreamConfiguration &inCfg, > > > > > > thumbnailer_.configure(inCfg.size, inCfg.pixelFormat); > > > > > > +#if defined(OS_CHROMEOS) > > > + encoder_ = std::make_unique<EncoderJea>(); > > > +#else /* !defined(OS_CHROMEOS) */ > > > encoder_ = std::make_unique<EncoderLibJpeg>(); > > > +#endif > > > > > > return encoder_->configure(inCfg); > > > } > > > > -- > > Regards, > > > > Laurent Pinchart >
diff --git a/src/android/cros/camera3_hal.cpp b/src/android/cros/camera3_hal.cpp index fb863b5f..71acb441 100644 --- a/src/android/cros/camera3_hal.cpp +++ b/src/android/cros/camera3_hal.cpp @@ -8,9 +8,11 @@ #include <cros-camera/cros_camera_hal.h> #include "../camera_hal_manager.h" +#include "../cros_mojo_token.h" -static void set_up([[maybe_unused]] cros::CameraMojoChannelManagerToken *token) +static void set_up(cros::CameraMojoChannelManagerToken *token) { + gCrosMojoToken = token; } static void tear_down() diff --git a/src/android/cros_mojo_token.h b/src/android/cros_mojo_token.h new file mode 100644 index 00000000..043c752a --- /dev/null +++ b/src/android/cros_mojo_token.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2022, Google Inc. + * + * cros_mojo_token.h - cros-specific mojo token + */ + +#pragma once + +#include <cros-camera/cros_camera_hal.h> + +inline cros::CameraMojoChannelManagerToken *gCrosMojoToken = nullptr; diff --git a/src/android/jpeg/encoder_jea.cpp b/src/android/jpeg/encoder_jea.cpp new file mode 100644 index 00000000..7880a6bd --- /dev/null +++ b/src/android/jpeg/encoder_jea.cpp @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2022, Google Inc. + * + * encoder_jea.cpp - JPEG encoding using CrOS JEA + */ + +#include "encoder_jea.h" + +#include "libcamera/internal/mapped_framebuffer.h" + +#include <cros-camera/camera_mojo_channel_manager_token.h> + +#include "../cros_mojo_token.h" +#include "../hal_framebuffer.h" + +EncoderJea::EncoderJea() = default; + +EncoderJea::~EncoderJea() = default; + +int EncoderJea::configure(const libcamera::StreamConfiguration &cfg) +{ + size_ = cfg.size; + + if (jpegCompressor_) + return 0; + + if (gCrosMojoToken == nullptr) + return -ENOTSUP; + + jpegCompressor_ = cros::JpegCompressor::GetInstance(gCrosMojoToken); + + return 0; +} + +int EncoderJea::encode(Camera3RequestDescriptor::StreamBuffer *buffer, + libcamera::Span<const uint8_t> exifData, + unsigned int quality) +{ + if (!jpegCompressor_) + return -ENOTSUP; + + uint32_t outDataSize = 0; + const HALFrameBuffer *fb = + dynamic_cast<const HALFrameBuffer *>(buffer->srcBuffer); + + if (!jpegCompressor_->CompressImageFromHandle(fb->handle(), + *buffer->camera3Buffer, + size_.width, size_.height, + quality, exifData.data(), + exifData.size(), + &outDataSize)) + return -EBUSY; + + return outDataSize; +} diff --git a/src/android/jpeg/encoder_jea.h b/src/android/jpeg/encoder_jea.h new file mode 100644 index 00000000..ffe9df27 --- /dev/null +++ b/src/android/jpeg/encoder_jea.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2022, Google Inc. + * + * encoder_jea.h - JPEG encoding using CrOS JEA + */ + +#pragma once + +#include <libcamera/geometry.h> + +#include <cros-camera/jpeg_compressor.h> + +#include "encoder.h" + +class EncoderJea : public Encoder +{ +public: + EncoderJea(); + ~EncoderJea(); + + int configure(const libcamera::StreamConfiguration &cfg) override; + int encode(Camera3RequestDescriptor::StreamBuffer *buffer, + libcamera::Span<const uint8_t> exifData, + unsigned int quality) override; + +private: + libcamera::Size size_; + + std::unique_ptr<cros::JpegCompressor> jpegCompressor_; +}; diff --git a/src/android/jpeg/meson.build b/src/android/jpeg/meson.build index 08397a87..9162576b 100644 --- a/src/android/jpeg/meson.build +++ b/src/android/jpeg/meson.build @@ -1,8 +1,14 @@ # SPDX-License-Identifier: CC0-1.0 android_hal_sources += files([ - 'encoder_libjpeg.cpp', 'exif.cpp', + 'encoder_libjpeg.cpp', + 'thumbnailer.cpp', 'post_processor_jpeg.cpp', - 'thumbnailer.cpp' ]) + +platform = get_option('android_platform') +if platform == 'cros' + android_hal_sources += files(['encoder_jea.cpp']) + android_deps += [dependency('libcros_camera')] +endif diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp index 3e676eb4..40261652 100644 --- a/src/android/jpeg/post_processor_jpeg.cpp +++ b/src/android/jpeg/post_processor_jpeg.cpp @@ -12,7 +12,11 @@ #include "../camera_device.h" #include "../camera_metadata.h" #include "../camera_request.h" +#if defined(OS_CHROMEOS) +#include "encoder_jea.h" +#else /* !defined(OS_CHROMEOS) */ #include "encoder_libjpeg.h" +#endif #include "exif.h" #include <libcamera/base/log.h> @@ -46,7 +50,11 @@ int PostProcessorJpeg::configure(const StreamConfiguration &inCfg, thumbnailer_.configure(inCfg.size, inCfg.pixelFormat); +#if defined(OS_CHROMEOS) + encoder_ = std::make_unique<EncoderJea>(); +#else /* !defined(OS_CHROMEOS) */ encoder_ = std::make_unique<EncoderLibJpeg>(); +#endif return encoder_->configure(inCfg); }