[libcamera-devel] [PATCH 1/2] pipeline: raspberrypi: Store timestamp in the correct Request metadata

Naushir Patuck naush at raspberrypi.com
Mon May 17 15:24:27 CEST 2021


Hi Kieran,

Thank you for your feedback.

On Mon, 17 May 2021 at 13:40, Kieran Bingham <
kieran.bingham at ideasonboard.com> wrote:

> Hi Naush,
>
> On 12/05/2021 09:47, Naushir Patuck wrote:
> > Write the controls::SensorTimestamp value in the Request metadata when
> > the request is popped from the queue ready to run the pipeline. This
> > ensures that the timestamp is written to the correct Request item,
> > which may not be at the top of the queue when the Unicam buffer dequeue
> > occurs.
> >
> > Fixes: fcfb1dc02a6b ("libcamera: raspberry: Report sensor timestamp")
> > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > ---
> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 29 +++++++++++--------
> >  1 file changed, 17 insertions(+), 12 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > index 6fbdba0487bf..eb6d31670567 100644
> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > @@ -221,6 +221,8 @@ public:
> >
> >  private:
> >       void checkRequestCompleted();
> > +     void fillRequestMetadata(const ControlList &bufferControls,
> > +                              Request *request);
> >       void tryRunPipeline();
> >       bool findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer
> *&embeddedBuffer);
> >
> > @@ -1416,18 +1418,6 @@ void
> RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
> >                       << ", timestamp: " << buffer->metadata().timestamp;
> >
> >       if (stream == &unicam_[Unicam::Image]) {
> > -             /*
> > -              * Record the sensor timestamp in the Request.
> > -              *
> > -              * \todo Do not assume the request in the front of the
> queue
> > -              * is the correct one
> > -              */
> > -             Request *request = requestQueue_.front();
> > -             ASSERT(request);
> > -
> > -             request->metadata().set(controls::SensorTimestamp,
> > -                                     buffer->metadata().timestamp);
> > -
> >               /*
> >                * Lookup the sensor controls used for this frame sequence
> from
> >                * DelayedControl and queue them along with the frame
> buffer.
> > @@ -1689,6 +1679,13 @@ void RPiCameraData::applyScalerCrop(const
> ControlList &controls)
> >       }
> >  }
> >
> > +void RPiCameraData::fillRequestMetadata(const ControlList
> &bufferControls,
> > +                                     Request *request)
> > +{
> > +     request->metadata().set(controls::SensorTimestamp,
> > +
>  bufferControls.get(controls::SensorTimestamp));
> > +}
> > +
> >  void RPiCameraData::tryRunPipeline()
> >  {
> >       FrameBuffer *embeddedBuffer;
> > @@ -1708,6 +1705,14 @@ void RPiCameraData::tryRunPipeline()
> >       /* See if a new ScalerCrop value needs to be applied. */
> >       applyScalerCrop(request->controls());
> >
> > +     /*
> > +      * Clear the request metadata and fill it with some initial non-IPA
> > +      * related controls. We clear it first because the request metadata
> > +      * may have been populated if we have dropped the previous frame.
> > +      */
>
> Aha, I was going to say is this the right place to clear this, and then
> I re-read that comment and now I understand why it's here.
>
> So I think this is fine.
>
> Is there anything else that would have to be cleared down if a request
> gets 're-used' internally?
>

I think that's it.... for now :-)


>
> I suspect not at the moment, but it may be that we need a specific call
> on a request to clean it up more generically.
>
> This should be fine though
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>
>
> Hrm, thinking about it more, i think this comes down to the
> ControlList->merge() doesn't it ... if the entry is already there it
> won't be updated? I almost feel like in this case - it should be
> updated, because it's newer and more correct information...
>

Correct.  It's a consequence of doing the ControlList::merge() now.
I think  ControlList::merge() follows the convention of std::map::merge()
where it does not merge if duplicate keys exist between the two maps.

Regards,
Naush



>
>
>
> > +     request->metadata().clear();
> > +     fillRequestMetadata(bayerFrame.controls, request);
> > +
> >       /*
> >        * Process all the user controls by the IPA. Once this is
> complete, we
> >        * queue the ISP output buffer listed in the request to start the
> HW
> >
>
> --
> Regards
> --
> Kieran
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210517/8edb8d74/attachment-0001.htm>


More information about the libcamera-devel mailing list