[libcamera-devel] [PATCH 03/15] android: camera_stream: Delegate Encoder construction

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Oct 6 14:53:36 CEST 2020


Hi Jacopo,

On 06/10/2020 13:44, Jacopo Mondi wrote:
> 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.

I disagree to 'over-engineered' ... it's laying foundations for what we
need to do next (supporting YUVY->NV12, Rescaling, Encoding, Decoding...)

But no blockers here ;-) Moving on ...

> 
> 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

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list