[libcamera-devel,v10,5/5] android: jpeg: Add JEA implementation
diff mbox series

Message ID 20230208033319.1361109-6-chenghaoyang@google.com
State Accepted
Headers show
Series
  • Add CrOS JEA implementation
Related show

Commit Message

Cheng-Hao Yang Feb. 8, 2023, 3:33 a.m. UTC
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

Comments

Laurent Pinchart Feb. 9, 2023, 9:55 p.m. UTC | #1
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);
>  }
Kieran Bingham Feb. 9, 2023, 10:47 p.m. UTC | #2
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
Cheng-Hao Yang Feb. 14, 2023, 9:45 a.m. UTC | #3
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
>

Patch
diff mbox series

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);
 }