[libcamera-devel] [PATCH v3 6/8] android: camera_device: Maintain a vector of CameraStream
Jacopo Mondi
jacopo at jmondi.org
Mon Jul 6 16:16:30 CEST 2020
On Mon, Jul 06, 2020 at 02:05:04PM +0100, Kieran Bingham wrote:
> Hi Jacopo,
>
> On 06/07/2020 09:22, Jacopo Mondi wrote:
> > Hi Kieran
> > sorry, I'm going to be picky.
> >
> > On Fri, Jul 03, 2020 at 01:39:17PM +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>
> >> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >> ---
> >> src/android/camera_device.cpp | 22 ++++++++++++++++++++--
> >> src/android/camera_device.h | 10 ++++++++++
> >> 2 files changed, 30 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> >> index 4e77a92dbea5..28334751a26e 100644
> >> --- a/src/android/camera_device.cpp
> >> +++ b/src/android/camera_device.cpp
> >> @@ -952,6 +952,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> >> return -EINVAL;
> >> }
> >>
> >> + /*
> >> + * Clear and remove any existing configuration from previous calls, and
> >> + * ensure the required entries are available without further
> >> + * re-allcoation.
> >> + */
> >> + streams_.clear();
> >> + streams_.reserve(stream_list->num_streams);
> >> +
> >> + /*
> >> + * 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];
> >>
> >> @@ -974,6 +988,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> >> streamConfiguration.pixelFormat = format;
> >>
> >> config_->addConfiguration(streamConfiguration);
> >> +
> >> + /* Maintain internal state of all stream mappings. */
> >
> > I don't want to be rude, but these are the comments I would prefer not
> > to see in code, and I'm the first one with a tendency to over-comment
>
>
> Don't worry - it's fine. I normally write comments before code, so
> sometimes indeed I'll end up with possibly inappropriate comments left
> that I haven't yet removed.
>
> And in this series, these code blocks have bounced around so much in the
> patches they might think they're on a trampoline ;)
>
>
> Indeed, this code block started out with storing much more content and
> internal state for JPEG, which has then been simplified to try to get
> this multi-stream series separated...
>
>
> > trivial operations (like recording an index) with comments that might
> > even be misleading. "maintain the internal state of all stream
> > mappings" makes me look around for some kind of 'internal state' until
> > I don't realize we're just recording an index for later use. I would
> > prefer to know where the index is use and why, with a slightly longer:
>
> It's been simplified to a single index (for now).
>
>
> >
> > /*
> > * Record the index of the StreamConfiguration
> > * associated to the camera3 stream. As not all
> > * camera3 streams maps to a libcamera stream, the
> > * index might be repeated.
> > */
>
> Isn't that what's stated above at declaration of streamIndex?
>
> The comment for /* maintain internal state of all stream mappings */
> helps later on when there are several lines here, and it becomes a
> distinct code block, but it has been simplified to a single line for
> this patch.
>
> I'll just remove the line, there's no need to add a big block again. The
> single line was more of a separator...
>
>
> And in fact, I later found out I had to split the block anyway, as I can
> only increment the index after adding the Configuration, where JPEG
> streams that don't create a configuration break out of the loop earlier,
> so they have to update their internal streams_[i] structure before.
>
>
> >> + streams_[i].index = streamIndex++;
> >> }
> >>
> >> switch (config_->validate()) {
> >> @@ -991,10 +1008,11 @@ 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];
> >> + StreamConfiguration &cfg = config_->at(cameraStream->index);
> >>
> >> /* 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 d7834d94f439..8e306c1f6d8b 100644
> >> --- a/src/android/camera_device.h
> >> +++ b/src/android/camera_device.h
> >> @@ -25,6 +25,15 @@
> >>
> >> class CameraMetadata;
> >>
> >> +struct CameraStream {
> >> + /*
> >> + * The index represents the index for libcamera stream parameters. This
> >
> > What are "stream parameters" ?
>
> StreamConfigurations, and Streams ... but I think actually the Stream*
> is obtained from the StreamConfiguration anyway, so really it's just the
> StreamConfigurations
>
> >
> >> + * will differ from any index of the halStream, particularly for HAL
> >
> > I'm not sure I get what "from any index of the halStream" means.
> > I also think you removed 'halStream' from the patch
>
> Yes, I have now removed halStream, and I don't think I'll add it back
> later any more.
>
>
> > I would:
> > "Index of the libcamera StreamConfiguration associated with an Android
> > requested stream. Not all streams requested by the Android framework
> > are 1-to-1 mapped to a libcamera Stream as some of them, such as JPEG,
> > might be produced by the libcamera HAL by processing data produced by
> > an existing libcamera Stream. This implies different Android stream
> > might be associated with the same libcamera StreamConfiguration index."
> >
> > Feel free to adjust if you think it's worth taking this in.
>
> I've changed this to:
>
> /*
> * The index of the libcamera StreamConfiguration as added during
> * configureStreams(). A single libcamera Stream may be used to deliver
> * one or more streams to the Android framework.
> */
Sounds perfect!
Thanks
>
> >
> > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>
> Thanks,
>
>
> >
> > Thanks
> > j
> >
> >
> >> + * only streams such as MJPEG.
> >> + */
> >> + unsigned int index;
> >> +};
> >> +
> >> class CameraDevice : protected libcamera::Loggable
> >> {
> >> public:
> >> @@ -90,6 +99,7 @@ private:
> >>
> >> std::vector<Camera3StreamConfiguration> streamConfigurations_;
> >> std::map<int, libcamera::PixelFormat> formatsMap_;
> >> + std::vector<CameraStream> streams_;
> >>
> >> int facing_;
> >> int orientation_;
> >> --
> >> 2.25.1
> >>
> >> _______________________________________________
> >> libcamera-devel mailing list
> >> libcamera-devel at lists.libcamera.org
> >> https://lists.libcamera.org/listinfo/libcamera-devel
>
> --
> Regards
> --
> Kieran
More information about the libcamera-devel
mailing list