[libcamera-devel] [PATCH] android; camera_device: Reset config_ if Camera::configure() fails

Hirokazu Honda hiroh at chromium.org
Tue Jun 15 08:10:01 CEST 2021


Hi Laurent, thank you for the patch.

On Tue, Jun 15, 2021 at 9:21 AM Laurent Pinchart <
laurent.pinchart at ideasonboard.com> wrote:

> The config_ pointer is reset in all error paths of the
> CameraDevice::configureStreams() function, except when
> Camera::configure() fails. Fix it by using a local unique pointer to
> store the configuration until the end of the function, to avoid similar
> issues in the future.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/android/camera_device.cpp | 17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index f3fd38690e63..f0b5f87bc38f 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1716,8 +1716,8 @@ int
> CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>          * Generate an empty configuration, and construct a
> StreamConfiguration
>          * for each camera3_stream to add to it.
>          */
> -       config_ = camera_->generateConfiguration();
> -       if (!config_) {
> +       std::unique_ptr<CameraConfiguration> config =
> camera_->generateConfiguration();
> +       if (!config) {
>                 LOG(HAL, Error) << "Failed to generate camera
> configuration";
>                 return -EINVAL;
>         }
> @@ -1855,29 +1855,27 @@ int
> CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>
>         sortCamera3StreamConfigs(streamConfigs, jpegStream);
>         for (const auto &streamConfig : streamConfigs) {
> -               config_->addConfiguration(streamConfig.config);
> +               config->addConfiguration(streamConfig.config);
>
>                 for (auto &stream : streamConfig.streams) {
>                         streams_.emplace_back(this, stream.type,
> stream.stream,
> -                                             config_->size() - 1);
> +                                             config->size() - 1);

                        stream.stream->priv = static_cast<void
> *>(&streams_.back());

                }
>         }
>
> -       switch (config_->validate()) {
> +       switch (config->validate()) {
>         case CameraConfiguration::Valid:
>                 break;
>         case CameraConfiguration::Adjusted:
>                 LOG(HAL, Info) << "Camera configuration adjusted";
>
> -               for (const StreamConfiguration &cfg : *config_)
> +               for (const StreamConfiguration &cfg : *config)
>                         LOG(HAL, Info) << " - " << cfg.toString();
>
> -               config_.reset();
>                 return -EINVAL;
>         case CameraConfiguration::Invalid:
>                 LOG(HAL, Info) << "Camera configuration invalid";
> -               config_.reset();
>                 return -EINVAL;
>         }
>
> @@ -1885,7 +1883,7 @@ int
> CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>          * Once the CameraConfiguration has been adjusted/validated
>          * it can be applied to the camera.
>          */
> -       int ret = camera_->configure(config_.get());
> +       int ret = camera_->configure(config.get());
>         if (ret) {
>                 LOG(HAL, Error) << "Failed to configure camera '"
>                                 << camera_->id() << "'";
> @@ -1905,6 +1903,7 @@ int
> CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>                 }
>         }
>
> +       config_ = std::move(config);
>         return 0;
>  }
>
>
Shall we also clear streams_ on failure?

Reviewed-by: Hirokazu Honda <hiroh at chromium.org>


> --
> Regards,
>
> Laurent Pinchart
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210615/b0432b9a/attachment.htm>


More information about the libcamera-devel mailing list