libcamera: camera: Don't call freeBuffer() on allocateBuffer() error
Do not assume the freeBuffer() function can handle allocateBuffer() method failures, as error handling and clean up should be performed by allocateBuffer() method itself. Perform clean-up on allocations failures in the IPU3 pipeline handler, now that freeBuffers() is not called anymore. Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
parent
911bc4aa41
commit
da341a4dd1
2 changed files with 11 additions and 6 deletions
|
@ -650,7 +650,6 @@ int Camera::allocateBuffers()
|
|||
int ret = pipe_->allocateBuffers(this, activeStreams_);
|
||||
if (ret) {
|
||||
LOG(Camera, Error) << "Failed to allocate buffers";
|
||||
freeBuffers();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -314,6 +314,7 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
|
|||
Stream *stream = *streams.begin();
|
||||
CIO2Device *cio2 = &data->cio2_;
|
||||
ImgUDevice *imgu = data->imgu_;
|
||||
unsigned int bufferCount;
|
||||
int ret;
|
||||
|
||||
/* Share buffers between CIO2 output and ImgU input. */
|
||||
|
@ -323,31 +324,36 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
|
|||
|
||||
ret = imgu->importBuffers(pool);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto error;
|
||||
|
||||
/* Export ImgU output buffers to the stream's pool. */
|
||||
ret = imgu->exportBuffers(&imgu->output_, &stream->bufferPool());
|
||||
if (ret)
|
||||
return ret;
|
||||
goto error;
|
||||
|
||||
/*
|
||||
* Reserve memory in viewfinder and stat output devices. Use the
|
||||
* same number of buffers as the ones requested for the output
|
||||
* stream.
|
||||
*/
|
||||
unsigned int bufferCount = stream->bufferPool().count();
|
||||
bufferCount = stream->bufferPool().count();
|
||||
|
||||
imgu->viewfinder_.pool->createBuffers(bufferCount);
|
||||
ret = imgu->exportBuffers(&imgu->viewfinder_, imgu->viewfinder_.pool);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto error;
|
||||
|
||||
imgu->stat_.pool->createBuffers(bufferCount);
|
||||
ret = imgu->exportBuffers(&imgu->stat_, imgu->stat_.pool);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto error;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
freeBuffers(camera, streams);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PipelineHandlerIPU3::freeBuffers(Camera *camera,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue