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:
Jacopo Mondi 2019-04-16 15:31:45 +02:00
parent 911bc4aa41
commit da341a4dd1
2 changed files with 11 additions and 6 deletions

View file

@ -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;
}

View file

@ -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,