[libcamera-devel] [PATCH v6 5/6] libcamera: ipu3: Connect viewfinder's BufferReady signal
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Apr 19 12:42:06 CEST 2019
Hi Jacopo,
On Fri, Apr 19, 2019 at 08:51:15AM +0200, Jacopo Mondi wrote:
> On Thu, Apr 18, 2019 at 11:43:35PM +0300, Laurent Pinchart wrote:
> > On Thu, Apr 18, 2019 at 06:46:37PM +0200, Jacopo Mondi wrote:
> >> The viewfinder and main output require identical logic for buffer and
> >> request completion. Connect the viewfinder bufferReady signal to the slot
> >> and handle requests for both main output and viewfinder there.
> >>
> >> Update the slot logic to ignore internal buffers that are not part of
> >> the request,
> >
> > Is this still needed ?
>
> Again no, as the below code handling this case.
>
> >> and to complete the request only when the last buffer completes.
> >>
> >> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> >> ---
> >> src/libcamera/pipeline/ipu3/ipu3.cpp | 32 +++++++++++++++++++++++++---
> >> 1 file changed, 29 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> index 8353272642bd..647b4f4f365f 100644
> >> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> @@ -729,6 +729,8 @@ int PipelineHandlerIPU3::registerCameras()
> >> &IPU3CameraData::imguInputBufferReady);
> >> data->imgu_->output_.dev->bufferReady.connect(data.get(),
> >> &IPU3CameraData::imguOutputBufferReady);
> >> + data->imgu_->viewfinder_.dev->bufferReady.connect(data.get(),
> >> + &IPU3CameraData::imguOutputBufferReady);
> >>
> >> /* Create and register the Camera instance. */
> >> std::string cameraName = cio2->sensor_->entity()->name() + " "
> >> @@ -774,10 +776,34 @@ void PipelineHandlerIPU3::IPU3CameraData::imguInputBufferReady(Buffer *buffer)
> >> */
> >> void PipelineHandlerIPU3::IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
> >> {
> >> - Request *request = queuedRequests_.front();
> >> + Request *request = buffer->request();
> >> + if (!request)
> >> + /* Completed buffers not part of a request are ignored. */
> >> + return;
> >
> > Now that you don't queue dummy buffers anymore, can this still happen ?
>
> It should not.
>
> >> +
> >> + if (!pipe_->completeBuffer(camera_, request, buffer))
> >> + /* Request not completed yet, return here. */
> >> + return;
> >> +
> >> + /*
> >> + * Complete requests in queuing order: if some other request is
> >> + * pending, post-pone completion.
> >> + */
> >> + Request *front = queuedRequests_.front();
> >> + if (front != request)
> >> + return;
> >>
> >> - pipe_->completeBuffer(camera_, request, buffer);
> >> - pipe_->completeRequest(camera_, request);
> >> + /*
> >> + * Complete the current request, and all the other pending ones,
> >> + * in queuing order.
> >> + */
> >> + while (1) {
> >
> > I think you've missed my review of v5.
>
> This one on v4 you mean?
>
> -------------------------------------------------------------------------
>
> I think you can simplify all this with
>
> /* Complete requests in queuing order. */
> while (1) {
> request = queuedRequest_.front();
> if (!request->empty())
> break;
>
> pipe_->completeRequest(camera_, request);
> ------------------------------------------------------------------------
>
> I might have missed why it is better, considering here above I have to
> check (front == request) to proceed to complete it.
That's my point, I don't think you need that check, you can complete all
requests that have no pending buffer in order until you reach a request
that still has pending buffers.
> >> + if (front->hasPendingBuffers())
> >> + break;
> >> +
> >> + pipe_->completeRequest(camera_, front);
> >> + front = queuedRequests_.front();
> >> + }
> >> }
> >>
> >> /**
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list