Message ID | 20190228200410.3022-8-jacopo@jmondi.org |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, Thank you for the patch. On Thu, Feb 28, 2019 at 09:04:07PM +0100, Jacopo Mondi wrote: > Implement queueRequest for the IPU3 pipeline manager. When a request is > queued, a new buffer is queued to the ImgU output and the CIO2 output. > Also queue buffers for the viewfinder and stat video nodes, even if > they're not used at the moment. > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > --- > src/libcamera/pipeline/ipu3/ipu3.cpp | 27 ++++++++++++++++++++++++++- > 1 file changed, 26 insertions(+), 1 deletion(-) > > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp > index 60a48859b398..8ce661e27f62 100644 > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp > @@ -152,11 +152,15 @@ private: > > std::shared_ptr<MediaDevice> cio2MediaDev_; > std::shared_ptr<MediaDevice> imguMediaDev_; > + > + unsigned int tmpBufferCount; > }; > > PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager) > : PipelineHandler(manager), cio2MediaDev_(nullptr), imguMediaDev_(nullptr) > { > + /* FIXME: this is an hack. */ > + tmpBufferCount = 0; > } > > PipelineHandlerIPU3::~PipelineHandlerIPU3() > @@ -430,9 +434,30 @@ void PipelineHandlerIPU3::stop(const Camera *camera) > int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request) > { > IPU3CameraData *data = cameraData(camera); > + V4L2Device *viewfinder = data->imgu->viewfinder; > + V4L2Device *output = data->imgu->output; > V4L2Device *cio2 = data->cio2.output; > + V4L2Device *stat = data->imgu->stat; > Stream *stream = &data->stream_; > + Buffer *tmpBuffer; > + > + /* > + * Queue buffer on VF and stat. > + * FIXME: this is an hack! > + */ > + tmpBuffer = &data->imgu->vfPool.buffers()[tmpBufferCount]; > + viewfinder->queueBuffer(tmpBuffer); > + > + tmpBuffer = &data->imgu->statPool.buffers()[tmpBufferCount]; > + stat->queueBuffer(tmpBuffer); Let's not use the video nodes we don't need and get rid of this hack. > + > + tmpBuffer = &data->cio2.pool.buffers()[tmpBufferCount]; > + cio2->queueBuffer(tmpBuffer); All cio2 buffers should be queued internally at stream start, they're unrelated to requests. > + > + tmpBufferCount++; > + tmpBufferCount %= IPU3_BUF_NUM; > > + /* Queue a buffer to the ImgU output for capture. */ > Buffer *buffer = request->findBuffer(stream); > if (!buffer) { > LOG(IPU3, Error) > @@ -440,7 +465,7 @@ int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request) > return -ENOENT; > } > > - cio2->queueBuffer(buffer); > + output->queueBuffer(buffer); > > return 0; > }
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 60a48859b398..8ce661e27f62 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -152,11 +152,15 @@ private: std::shared_ptr<MediaDevice> cio2MediaDev_; std::shared_ptr<MediaDevice> imguMediaDev_; + + unsigned int tmpBufferCount; }; PipelineHandlerIPU3::PipelineHandlerIPU3(CameraManager *manager) : PipelineHandler(manager), cio2MediaDev_(nullptr), imguMediaDev_(nullptr) { + /* FIXME: this is an hack. */ + tmpBufferCount = 0; } PipelineHandlerIPU3::~PipelineHandlerIPU3() @@ -430,9 +434,30 @@ void PipelineHandlerIPU3::stop(const Camera *camera) int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request) { IPU3CameraData *data = cameraData(camera); + V4L2Device *viewfinder = data->imgu->viewfinder; + V4L2Device *output = data->imgu->output; V4L2Device *cio2 = data->cio2.output; + V4L2Device *stat = data->imgu->stat; Stream *stream = &data->stream_; + Buffer *tmpBuffer; + + /* + * Queue buffer on VF and stat. + * FIXME: this is an hack! + */ + tmpBuffer = &data->imgu->vfPool.buffers()[tmpBufferCount]; + viewfinder->queueBuffer(tmpBuffer); + + tmpBuffer = &data->imgu->statPool.buffers()[tmpBufferCount]; + stat->queueBuffer(tmpBuffer); + + tmpBuffer = &data->cio2.pool.buffers()[tmpBufferCount]; + cio2->queueBuffer(tmpBuffer); + + tmpBufferCount++; + tmpBufferCount %= IPU3_BUF_NUM; + /* Queue a buffer to the ImgU output for capture. */ Buffer *buffer = request->findBuffer(stream); if (!buffer) { LOG(IPU3, Error) @@ -440,7 +465,7 @@ int PipelineHandlerIPU3::queueRequest(const Camera *camera, Request *request) return -ENOENT; } - cio2->queueBuffer(buffer); + output->queueBuffer(buffer); return 0; }
Implement queueRequest for the IPU3 pipeline manager. When a request is queued, a new buffer is queued to the ImgU output and the CIO2 output. Also queue buffers for the viewfinder and stat video nodes, even if they're not used at the moment. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> --- src/libcamera/pipeline/ipu3/ipu3.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)