[libcamera-devel] [PATCH 03/15] android: camera_stream: Delegate Encoder construction
Jacopo Mondi
jacopo at jmondi.org
Tue Oct 6 14:44:33 CEST 2020
Hi Kieran,
On Mon, Oct 05, 2020 at 05:18:31PM +0100, Kieran Bingham wrote:
> Hi Jacopo
>
> On 05/10/2020 12:26, Laurent Pinchart wrote:
> > Hi Jacopo,
> >
> > Thank you for the patch.
> >
> > On Mon, Oct 05, 2020 at 01:46:37PM +0300, Laurent Pinchart wrote:
> >> From: Jacopo Mondi <jacopo at jmondi.org>
> >>
> >> Delegate the construction of the encoder to the CameraStream class
> >> for streams that need post-processing.
> >>
>
> Very happy to see this get pushed down to CameraStream ...
> This series is getting me far too excited - and I'm only on patch 3!
>
> :-)
>
>
> >> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> >> ---
> >> src/android/camera_device.cpp | 23 ++++++++++-------------
> >> src/android/camera_stream.cpp | 17 ++++++++++++++---
> >> src/android/camera_stream.h | 4 +++-
> >> 3 files changed, 27 insertions(+), 17 deletions(-)
> >>
> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> >> index 0600ebc81c64..9c9a5cfa3c2f 100644
> >> --- a/src/android/camera_device.cpp
> >> +++ b/src/android/camera_device.cpp
> >> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> >>
> >> StreamConfiguration &cfg = config_->at(index);
> >>
> >> - /*
> >> - * Construct a software encoder for the MJPEG streams from the
> >> - * chosen libcamera source stream.
> >> - */
> >> - Encoder *encoder = new EncoderLibJpeg();
> >> - int ret = encoder->configure(cfg);
> >> - if (ret) {
> >> - LOG(HAL, Error) << "Failed to configure encoder";
> >> - delete encoder;
> >> - return ret;
> >> - }
> >> -
> >> - streams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);
> >> + streams_.emplace_back(formats::MJPEG, cfg.size, type, index);
> >> jpegStream->priv = static_cast<void *>(&streams_.back());
> >> }
> >>
> >> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> >> return -EINVAL;
> >> }
> >>
> >> + /*
> >> + * Configure the HAL CameraStream instances using the associated
> >> + * StreamConfiguration and set the number of required buffers in
> >> + * the Android camera3_stream_t.
> >> + */
> >> for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
> >> camera3_stream_t *stream = stream_list->streams[i];
> >> CameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);
> >> StreamConfiguration &cfg = config_->at(cameraStream->index());
> >>
> >> + int ret = cameraStream->configure(cfg);
> >> + if (ret)
> >> + return ret;
> >> +
> >> /* Use the bufferCount confirmed by the validation process. */
> >> stream->max_buffers = cfg.bufferCount;
> >> }
> >> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> >> index 585bf2b68f4f..5b2b625c563b 100644
> >> --- a/src/android/camera_stream.cpp
> >> +++ b/src/android/camera_stream.cpp
> >> @@ -7,10 +7,21 @@
> >>
> >> #include "camera_stream.h"
> >>
> >> +#include "jpeg/encoder_libjpeg.h"
> >> +
> >> using namespace libcamera;
> >>
> >> -CameraStream::CameraStream(PixelFormat format, Size size,
> >> - Type type, unsigned int index, Encoder *encoder)
> >> - : format_(format), size_(size), type_(type), index_(index), encoder_(encoder)
> >> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)
> >> + : format_(format), size_(size), type_(type), index_(index), encoder(nullptr)
> >> {
> >> + if (type_ == Type::Internal || type_ == Type::Mapped)
> >> + encoder_.reset(new EncoderLibJpeg);
> >
> > encoder_ = std::make_unique<EncoderLibJpeg>();
> >
> > This is functionally equivalent but more "C++".
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >
> >> +}
> >> +
> >> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)
> >> +{
> >> + if (encoder_)
> >> + return encoder_->configure(cfg);
>
> I wonder if in the near future, the creation of the Encoder might happen
> on demand here depending on what is needed to fulfil the
> streamConfiguration, rather than being in the constructor.
>
> But I'm not worried about that now, and I'm very pleased to see the
> CameraStream specific code moving into here, so lets proceed!
Right now the Encoder is constructed only for Type::Internal which is
assigned by the CameraDevice. It's a bit clunky, and my preference
would be a CameraStream subclass (maybe two, one that does encoding
and one that does allocation ?) Anyway, it's a bit over-engineerd for
the current status I think.
Thanks
j
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> >> +
> >> + return 0;
> >> }
> >> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> >> index 07c714e3a365..d0dc40d81151 100644
> >> --- a/src/android/camera_stream.h
> >> +++ b/src/android/camera_stream.h
> >> @@ -100,7 +100,7 @@ public:
> >> Mapped,
> >> };
> >> CameraStream(libcamera::PixelFormat format, libcamera::Size size,
> >> - Type type, unsigned int index, Encoder *encoder = nullptr);
> >> + Type type, unsigned int index);
> >>
> >> const libcamera::PixelFormat &format() const { return format_; }
> >> const libcamera::Size &size() const { return size_; }
> >> @@ -108,6 +108,8 @@ public:
> >> unsigned int index() const { return index_; }
> >> Encoder *encoder() const { return encoder_.get(); }
> >>
> >> + int configure(const libcamera::StreamConfiguration &cfg);
> >> +
> >> private:
> >> libcamera::PixelFormat format_;
> >> libcamera::Size size_;
> >
>
> --
> Regards
> --
> Kieran
More information about the libcamera-devel
mailing list