pipeline: rkisp1: Use ScopeExitActions to simplify error handling in start
Error handling in the PipelineHandlerRkISP1::start() function is cumbersome. Simplify it using the utils::ScopeExitActions class. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
This commit is contained in:
@@ -914,71 +914,62 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)
|
||||
int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlList *controls)
|
||||
{
|
||||
RkISP1CameraData *data = cameraData(camera);
|
||||
utils::ScopeExitActions actions;
|
||||
int ret;
|
||||
|
||||
/* Allocate buffers for internal pipeline usage. */
|
||||
ret = allocateBuffers(camera);
|
||||
if (ret)
|
||||
return ret;
|
||||
actions += [&]() { freeBuffers(camera); };
|
||||
|
||||
ret = data->ipa_->start();
|
||||
if (ret) {
|
||||
freeBuffers(camera);
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start IPA " << camera->id();
|
||||
return ret;
|
||||
}
|
||||
actions += [&]() { data->ipa_->stop(); };
|
||||
|
||||
data->frame_ = 0;
|
||||
|
||||
if (!isRaw_) {
|
||||
ret = param_->streamOn();
|
||||
if (ret) {
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start parameters " << camera->id();
|
||||
return ret;
|
||||
}
|
||||
actions += [&]() { param_->streamOff(); };
|
||||
|
||||
ret = stat_->streamOn();
|
||||
if (ret) {
|
||||
param_->streamOff();
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
LOG(RkISP1, Error)
|
||||
<< "Failed to start statistics " << camera->id();
|
||||
return ret;
|
||||
}
|
||||
actions += [&]() { stat_->streamOff(); };
|
||||
}
|
||||
|
||||
if (data->mainPath_->isEnabled()) {
|
||||
ret = mainPath_.start();
|
||||
if (ret) {
|
||||
param_->streamOff();
|
||||
stat_->streamOff();
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
actions += [&]() { mainPath_.stop(); };
|
||||
}
|
||||
|
||||
if (hasSelfPath_ && data->selfPath_->isEnabled()) {
|
||||
ret = selfPath_.start();
|
||||
if (ret) {
|
||||
mainPath_.stop();
|
||||
param_->streamOff();
|
||||
stat_->streamOff();
|
||||
data->ipa_->stop();
|
||||
freeBuffers(camera);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
isp_->setFrameStartEnabled(true);
|
||||
|
||||
activeCamera_ = camera;
|
||||
return ret;
|
||||
|
||||
actions.release();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PipelineHandlerRkISP1::stopDevice(Camera *camera)
|
||||
|
||||
Reference in New Issue
Block a user