[libcamera-devel] [PATCH v2 6/9] android: camera_device: Maintain a vector of CameraStream
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jul 3 11:49:03 CEST 2020
Hi all,
On 03/07/2020 01:37, Laurent Pinchart wrote:
> Hi Kieran,
>
> Thank you for the patch.
>
> On Fri, Jul 03, 2020 at 01:31:09AM +0200, Niklas Söderlund wrote:
>> On 2020-07-02 22:36:51 +0100, Kieran Bingham wrote:
>>> Introduce a vector storing a CameraStream to track and maintain
>>> state between an Android stream (camera3_stream_t) and a libcamera
>>> Stream.
>>>
>>> Only the index of the libcamera stream is stored, to facilitate identifying
>>> the correct index for both the StreamConfiguration and Stream vectors.
>>>
>>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>> ---
>>> src/android/camera_device.cpp | 18 ++++++++++++++++--
>>> src/android/camera_device.h | 6 ++++++
>>> 2 files changed, 22 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
>>> index 77083219d8a1..fc3962dac230 100644
>>> --- a/src/android/camera_device.cpp
>>> +++ b/src/android/camera_device.cpp
>>> @@ -952,6 +952,14 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>>> return -EINVAL;
>>> }
>>>
>>> + streams_.reserve(stream_list->num_streams);
>>
>> Should you not also empty the vector before reserving memory? I'm
>> thinking of if something below fails and exits we could be stuch with a
>> streams_ that is half of B and half of A. Or maybe streams_ should be
>> emptied on error instead?
>
> reserve() will only reserve memory to avoid a memory allocation for
> every entry added to the vector, entries are still populated when adding
> them. Said different, reserve() doesn't change size().
>
>>> +
>>> + /*
>>> + * Track actually created streams, as there may not be a 1:1 mapping of
>>> + * camera3 streams to libcamera streams.
>>> + */
>>> + unsigned int streamIndex = 0;
>>> +
>>> for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
>>> camera3_stream_t *stream = stream_list->streams[i];
>>>
>>> @@ -967,6 +975,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>>> if (!format.isValid())
>>> return -EINVAL;
>>>
>>> + /* Maintain internal state of all stream mappings. */
>>> + streams_[i].androidStream = stream;
>>> +
>>> StreamConfiguration streamConfiguration;
>>>
>>> streamConfiguration.size.width = stream->width;
>>> @@ -974,6 +985,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>>> streamConfiguration.pixelFormat = format;
>>>
>>> config_->addConfiguration(streamConfiguration);
>>> + streams_[i].libcameraIndex = streamIndex++;
>>> }
>>>
>>> switch (config_->validate()) {
>>> @@ -991,10 +1003,12 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>>>
>>> for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
>>> camera3_stream_t *stream = stream_list->streams[i];
>>> - StreamConfiguration &streamConfiguration = config_->at(i);
>>> + CameraStream *cameraStream = &streams_[i];
>>> +
>>
>> nit: I would drop the extra newline, with or without fixed,
Niklas, was there a tag to go in here? :-D
>>
>>> + StreamConfiguration &cfg = config_->at(cameraStream->libcameraIndex);
>>>
>>> /* Use the bufferCount confirmed by the validation process. */
>>> - stream->max_buffers = streamConfiguration.bufferCount;
>>> + stream->max_buffers = cfg.bufferCount;
>>> }
>>>
>>> /*
>>> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
>>> index 5bd6cf416156..275760f0aa26 100644
>>> --- a/src/android/camera_device.h
>>> +++ b/src/android/camera_device.h
>>> @@ -25,6 +25,11 @@
>>>
>>> class CameraMetadata;
>>>
>>> +struct CameraStream {
>>> + camera3_stream *androidStream;
>
> I'd name this halStream, the rationale being that prefixing names with
> hal instead of android will keep them shorter.
I like halStream
>
>>> + unsigned int libcameraIndex;
>
> And I'd simply use index here (no prefix for the libcamera side), but I
> won't insist too much. The rationale is that otherwise I fear a
> libcamera prefix will spread in many places. A short comment along the
> lines of "The index of the stream in the CameraConfiguration" could also
> possibly be useful.
And I'm happy with just index too, but it does /require/ the comment
then, because the index is not required to match the index of the halStream.
I'll update both.
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Thanks,
>
>>> +};
>>> +
>>> class CameraDevice : protected libcamera::Loggable
>>> {
>>> public:
>>> @@ -89,6 +94,7 @@ private:
>>>
>>> std::vector<Camera3StreamConfiguration> streamConfigurations_;
>>> std::map<int, libcamera::PixelFormat> formatsMap_;
>>> + std::vector<CameraStream> streams_;
>>>
>>> int facing_;
>>> int orientation_;
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list