[libcamera-devel] pipeline: ipa: raspberrypi: Handle failures during IPA configuration
diff mbox series

Message ID 20201127133031.1103686-1-naush@raspberrypi.com
State Superseded
Headers show
Series
  • [libcamera-devel] pipeline: ipa: raspberrypi: Handle failures during IPA configuration
Related show

Commit Message

Naushir Patuck Nov. 27, 2020, 1:30 p.m. UTC
If the IPA fails during configuration, return an error flag to the
pipeline handler and fail the use case gracefully.

At preset, the IPA configuration can fail for the following reasons:
- The sensor is not recognised, and fails to open a CamHelper object.
- The pipeline handler did not pass in controls for the ISP and sensor.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
---
 include/libcamera/ipa/raspberrypi.h              |  1 +
 src/ipa/raspberrypi/raspberrypi.cpp              | 16 ++++++++++++++--
 .../pipeline/raspberrypi/raspberrypi.cpp         |  5 +++++
 3 files changed, 20 insertions(+), 2 deletions(-)

Comments

Jacopo Mondi Nov. 27, 2020, 1:46 p.m. UTC | #1
Hello Naush,

On Fri, Nov 27, 2020 at 01:30:31PM +0000, Naushir Patuck wrote:
> If the IPA fails during configuration, return an error flag to the
> pipeline handler and fail the use case gracefully.
>
> At preset, the IPA configuration can fail for the following reasons:
> - The sensor is not recognised, and fails to open a CamHelper object.
> - The pipeline handler did not pass in controls for the ISP and sensor.
>
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>

Looks good to me one minor nit apart. See below.

Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Thanks
  j

> ---
>  include/libcamera/ipa/raspberrypi.h              |  1 +
>  src/ipa/raspberrypi/raspberrypi.cpp              | 16 ++++++++++++++--
>  .../pipeline/raspberrypi/raspberrypi.cpp         |  5 +++++
>  3 files changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
> index 2b55dbfc..86c97ffa 100644
> --- a/include/libcamera/ipa/raspberrypi.h
> +++ b/include/libcamera/ipa/raspberrypi.h
> @@ -21,6 +21,7 @@ enum ConfigParameters {
>  	IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
>  	IPA_CONFIG_SENSOR = (1 << 2),
>  	IPA_CONFIG_DROP_FRAMES = (1 << 3),
> +	IPA_CONFIG_FAILED = (1 << 4),
>  };
>
>  enum Operations {
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 9853a343..7542dd26 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -197,8 +197,14 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>  		       const IPAOperationData &ipaConfig,
>  		       IPAOperationData *result)
>  {
> -	if (entityControls.empty())
> +	std::string cameraName(sensorInfo.model);
> +
> +	if (entityControls.size() != 2) {
> +		LOG(IPARPI, Error) << "No ISP or sensor controls found for "
> +				   << cameraName;

This will print the sensor name while the error is global to the
camera, as the ISP controls might be missing as well.

> +		result->operation = RPi::IPA_CONFIG_FAILED;
>  		return;
> +	}
>
>  	result->operation = 0;
>
> @@ -213,10 +219,16 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>  	 * that the kernel driver doesn't. We only do this the first time; we don't need
>  	 * to re-parse the metadata after a simple mode-switch for no reason.
>  	 */
> -	std::string cameraName(sensorInfo.model);
>  	if (!helper_) {
>  		helper_ = std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
>
> +		if (!helper_) {
> +			LOG(IPARPI, Error) << "Could not create camera helper for "
> +					   << cameraName;
> +			result->operation = RPi::IPA_CONFIG_FAILED;
> +			return;
> +		}
> +
>  		/*
>  		 * Pass out the sensor config to the pipeline handler in order
>  		 * to setup the staggered writer class.
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 6fcdf557..76252806 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1194,6 +1194,11 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)
>  	ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig,
>  			&result);
>
> +	if (result.operation & RPi::IPA_CONFIG_FAILED) {
> +		LOG(RPI, Error) << "IPA configuration failed!";
> +		return -EPIPE;
> +	}
> +
>  	unsigned int resultIdx = 0;
>  	if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
>  		/*
> --
> 2.25.1
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Naushir Patuck Nov. 27, 2020, 1:51 p.m. UTC | #2
HI Jacopo,

Thank you for the review.

On Fri, 27 Nov 2020 at 13:46, Jacopo Mondi <jacopo@jmondi.org> wrote:

> Hello Naush,
>
> On Fri, Nov 27, 2020 at 01:30:31PM +0000, Naushir Patuck wrote:
> > If the IPA fails during configuration, return an error flag to the
> > pipeline handler and fail the use case gracefully.
> >
> > At preset, the IPA configuration can fail for the following reasons:
> > - The sensor is not recognised, and fails to open a CamHelper object.
> > - The pipeline handler did not pass in controls for the ISP and sensor.
> >
> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
>
> Looks good to me one minor nit apart. See below.
>
> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
>
> Thanks
>   j
>
> > ---
> >  include/libcamera/ipa/raspberrypi.h              |  1 +
> >  src/ipa/raspberrypi/raspberrypi.cpp              | 16 ++++++++++++++--
> >  .../pipeline/raspberrypi/raspberrypi.cpp         |  5 +++++
> >  3 files changed, 20 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/libcamera/ipa/raspberrypi.h
> b/include/libcamera/ipa/raspberrypi.h
> > index 2b55dbfc..86c97ffa 100644
> > --- a/include/libcamera/ipa/raspberrypi.h
> > +++ b/include/libcamera/ipa/raspberrypi.h
> > @@ -21,6 +21,7 @@ enum ConfigParameters {
> >       IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
> >       IPA_CONFIG_SENSOR = (1 << 2),
> >       IPA_CONFIG_DROP_FRAMES = (1 << 3),
> > +     IPA_CONFIG_FAILED = (1 << 4),
> >  };
> >
> >  enum Operations {
> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp
> b/src/ipa/raspberrypi/raspberrypi.cpp
> > index 9853a343..7542dd26 100644
> > --- a/src/ipa/raspberrypi/raspberrypi.cpp
> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> > @@ -197,8 +197,14 @@ void IPARPi::configure(const CameraSensorInfo
> &sensorInfo,
> >                      const IPAOperationData &ipaConfig,
> >                      IPAOperationData *result)
> >  {
> > -     if (entityControls.empty())
> > +     std::string cameraName(sensorInfo.model);
> > +
> > +     if (entityControls.size() != 2) {
> > +             LOG(IPARPI, Error) << "No ISP or sensor controls found for
> "
> > +                                << cameraName;
>
> This will print the sensor name while the error is global to the
> camera, as the ISP controls might be missing as well.
>

You are right, it is a bit pointless here.  I will remove and submit an
update after waiting a bit for any more feedback.

Regards,
Naush



>
> > +             result->operation = RPi::IPA_CONFIG_FAILED;
> >               return;
> > +     }
> >
> >       result->operation = 0;
> >
> > @@ -213,10 +219,16 @@ void IPARPi::configure(const CameraSensorInfo
> &sensorInfo,
> >        * that the kernel driver doesn't. We only do this the first time;
> we don't need
> >        * to re-parse the metadata after a simple mode-switch for no
> reason.
> >        */
> > -     std::string cameraName(sensorInfo.model);
> >       if (!helper_) {
> >               helper_ =
> std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
> >
> > +             if (!helper_) {
> > +                     LOG(IPARPI, Error) << "Could not create camera
> helper for "
> > +                                        << cameraName;
> > +                     result->operation = RPi::IPA_CONFIG_FAILED;
> > +                     return;
> > +             }
> > +
> >               /*
> >                * Pass out the sensor config to the pipeline handler in
> order
> >                * to setup the staggered writer class.
> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > index 6fcdf557..76252806 100644
> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > @@ -1194,6 +1194,11 @@ int RPiCameraData::configureIPA(const
> CameraConfiguration *config)
> >       ipa_->configure(sensorInfo_, streamConfig, entityControls,
> ipaConfig,
> >                       &result);
> >
> > +     if (result.operation & RPi::IPA_CONFIG_FAILED) {
> > +             LOG(RPI, Error) << "IPA configuration failed!";
> > +             return -EPIPE;
> > +     }
> > +
> >       unsigned int resultIdx = 0;
> >       if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
> >               /*
> > --
> > 2.25.1
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel@lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
>
Dave Stevenson Nov. 27, 2020, 2:21 p.m. UTC | #3
Hi Naush

On Fri, 27 Nov 2020 at 13:52, Naushir Patuck <naush@raspberrypi.com> wrote:
>
> HI Jacopo,
>
> Thank you for the review.
>
> On Fri, 27 Nov 2020 at 13:46, Jacopo Mondi <jacopo@jmondi.org> wrote:
>>
>> Hello Naush,
>>
>> On Fri, Nov 27, 2020 at 01:30:31PM +0000, Naushir Patuck wrote:
>> > If the IPA fails during configuration, return an error flag to the
>> > pipeline handler and fail the use case gracefully.
>> >
>> > At preset, the IPA configuration can fail for the following reasons:

s/preset/present

>> > - The sensor is not recognised, and fails to open a CamHelper object.
>> > - The pipeline handler did not pass in controls for the ISP and sensor.
>> >
>> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
>>
>> Looks good to me one minor nit apart. See below.
>>
>> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
>>
>> Thanks
>>   j
>>
>> > ---
>> >  include/libcamera/ipa/raspberrypi.h              |  1 +
>> >  src/ipa/raspberrypi/raspberrypi.cpp              | 16 ++++++++++++++--
>> >  .../pipeline/raspberrypi/raspberrypi.cpp         |  5 +++++
>> >  3 files changed, 20 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
>> > index 2b55dbfc..86c97ffa 100644
>> > --- a/include/libcamera/ipa/raspberrypi.h
>> > +++ b/include/libcamera/ipa/raspberrypi.h
>> > @@ -21,6 +21,7 @@ enum ConfigParameters {
>> >       IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
>> >       IPA_CONFIG_SENSOR = (1 << 2),
>> >       IPA_CONFIG_DROP_FRAMES = (1 << 3),
>> > +     IPA_CONFIG_FAILED = (1 << 4),
>> >  };
>> >
>> >  enum Operations {
>> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
>> > index 9853a343..7542dd26 100644
>> > --- a/src/ipa/raspberrypi/raspberrypi.cpp
>> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp
>> > @@ -197,8 +197,14 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>> >                      const IPAOperationData &ipaConfig,
>> >                      IPAOperationData *result)
>> >  {
>> > -     if (entityControls.empty())
>> > +     std::string cameraName(sensorInfo.model);
>> > +
>> > +     if (entityControls.size() != 2) {
>> > +             LOG(IPARPI, Error) << "No ISP or sensor controls found for "
>> > +                                << cameraName;
>>
>> This will print the sensor name while the error is global to the
>> camera, as the ISP controls might be missing as well.
>
>
> You are right, it is a bit pointless here.  I will remove and submit an update after waiting a bit for any more feedback.
>
> Regards,
> Naush
>
>
>>
>>
>> > +             result->operation = RPi::IPA_CONFIG_FAILED;
>> >               return;
>> > +     }
>> >
>> >       result->operation = 0;
>> >
>> > @@ -213,10 +219,16 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>> >        * that the kernel driver doesn't. We only do this the first time; we don't need
>> >        * to re-parse the metadata after a simple mode-switch for no reason.
>> >        */
>> > -     std::string cameraName(sensorInfo.model);
>> >       if (!helper_) {
>> >               helper_ = std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
>> >
>> > +             if (!helper_) {
>> > +                     LOG(IPARPI, Error) << "Could not create camera helper for "
>> > +                                        << cameraName;
>> > +                     result->operation = RPi::IPA_CONFIG_FAILED;
>> > +                     return;
>> > +             }
>> > +
>> >               /*
>> >                * Pass out the sensor config to the pipeline handler in order
>> >                * to setup the staggered writer class.
>> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> > index 6fcdf557..76252806 100644
>> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> > @@ -1194,6 +1194,11 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)
>> >       ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig,
>> >                       &result);
>> >
>> > +     if (result.operation & RPi::IPA_CONFIG_FAILED) {
>> > +             LOG(RPI, Error) << "IPA configuration failed!";
>> > +             return -EPIPE;
>> > +     }
>> > +
>> >       unsigned int resultIdx = 0;
>> >       if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
>> >               /*
>> > --
>> > 2.25.1
>> >
>> > _______________________________________________
>> > libcamera-devel mailing list
>> > libcamera-devel@lists.libcamera.org
>> > https://lists.libcamera.org/listinfo/libcamera-devel
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Naushir Patuck Nov. 27, 2020, 2:54 p.m. UTC | #4
Hi Dave,

Thanks for the review.

On Fri, 27 Nov 2020 at 14:21, Dave Stevenson <dave.stevenson@raspberrypi.com>
wrote:

> Hi Naush
>
> On Fri, 27 Nov 2020 at 13:52, Naushir Patuck <naush@raspberrypi.com>
> wrote:
> >
> > HI Jacopo,
> >
> > Thank you for the review.
> >
> > On Fri, 27 Nov 2020 at 13:46, Jacopo Mondi <jacopo@jmondi.org> wrote:
> >>
> >> Hello Naush,
> >>
> >> On Fri, Nov 27, 2020 at 01:30:31PM +0000, Naushir Patuck wrote:
> >> > If the IPA fails during configuration, return an error flag to the
> >> > pipeline handler and fail the use case gracefully.
> >> >
> >> > At preset, the IPA configuration can fail for the following reasons:
>
> s/preset/present
>

Ack.  Will post an update shortly.

Regards,
Naush


>
> >> > - The sensor is not recognised, and fails to open a CamHelper object.
> >> > - The pipeline handler did not pass in controls for the ISP and
> sensor.
> >> >
> >> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> >>
> >> Looks good to me one minor nit apart. See below.
> >>
> >> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
> >>
> >> Thanks
> >>   j
> >>
> >> > ---
> >> >  include/libcamera/ipa/raspberrypi.h              |  1 +
> >> >  src/ipa/raspberrypi/raspberrypi.cpp              | 16
> ++++++++++++++--
> >> >  .../pipeline/raspberrypi/raspberrypi.cpp         |  5 +++++
> >> >  3 files changed, 20 insertions(+), 2 deletions(-)
> >> >
> >> > diff --git a/include/libcamera/ipa/raspberrypi.h
> b/include/libcamera/ipa/raspberrypi.h
> >> > index 2b55dbfc..86c97ffa 100644
> >> > --- a/include/libcamera/ipa/raspberrypi.h
> >> > +++ b/include/libcamera/ipa/raspberrypi.h
> >> > @@ -21,6 +21,7 @@ enum ConfigParameters {
> >> >       IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
> >> >       IPA_CONFIG_SENSOR = (1 << 2),
> >> >       IPA_CONFIG_DROP_FRAMES = (1 << 3),
> >> > +     IPA_CONFIG_FAILED = (1 << 4),
> >> >  };
> >> >
> >> >  enum Operations {
> >> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp
> b/src/ipa/raspberrypi/raspberrypi.cpp
> >> > index 9853a343..7542dd26 100644
> >> > --- a/src/ipa/raspberrypi/raspberrypi.cpp
> >> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> >> > @@ -197,8 +197,14 @@ void IPARPi::configure(const CameraSensorInfo
> &sensorInfo,
> >> >                      const IPAOperationData &ipaConfig,
> >> >                      IPAOperationData *result)
> >> >  {
> >> > -     if (entityControls.empty())
> >> > +     std::string cameraName(sensorInfo.model);
> >> > +
> >> > +     if (entityControls.size() != 2) {
> >> > +             LOG(IPARPI, Error) << "No ISP or sensor controls found
> for "
> >> > +                                << cameraName;
> >>
> >> This will print the sensor name while the error is global to the
> >> camera, as the ISP controls might be missing as well.
> >
> >
> > You are right, it is a bit pointless here.  I will remove and submit an
> update after waiting a bit for any more feedback.
> >
> > Regards,
> > Naush
> >
> >
> >>
> >>
> >> > +             result->operation = RPi::IPA_CONFIG_FAILED;
> >> >               return;
> >> > +     }
> >> >
> >> >       result->operation = 0;
> >> >
> >> > @@ -213,10 +219,16 @@ void IPARPi::configure(const CameraSensorInfo
> &sensorInfo,
> >> >        * that the kernel driver doesn't. We only do this the first
> time; we don't need
> >> >        * to re-parse the metadata after a simple mode-switch for no
> reason.
> >> >        */
> >> > -     std::string cameraName(sensorInfo.model);
> >> >       if (!helper_) {
> >> >               helper_ =
> std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
> >> >
> >> > +             if (!helper_) {
> >> > +                     LOG(IPARPI, Error) << "Could not create camera
> helper for "
> >> > +                                        << cameraName;
> >> > +                     result->operation = RPi::IPA_CONFIG_FAILED;
> >> > +                     return;
> >> > +             }
> >> > +
> >> >               /*
> >> >                * Pass out the sensor config to the pipeline handler
> in order
> >> >                * to setup the staggered writer class.
> >> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> >> > index 6fcdf557..76252806 100644
> >> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> >> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> >> > @@ -1194,6 +1194,11 @@ int RPiCameraData::configureIPA(const
> CameraConfiguration *config)
> >> >       ipa_->configure(sensorInfo_, streamConfig, entityControls,
> ipaConfig,
> >> >                       &result);
> >> >
> >> > +     if (result.operation & RPi::IPA_CONFIG_FAILED) {
> >> > +             LOG(RPI, Error) << "IPA configuration failed!";
> >> > +             return -EPIPE;
> >> > +     }
> >> > +
> >> >       unsigned int resultIdx = 0;
> >> >       if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
> >> >               /*
> >> > --
> >> > 2.25.1
> >> >
> >> > _______________________________________________
> >> > libcamera-devel mailing list
> >> > libcamera-devel@lists.libcamera.org
> >> > https://lists.libcamera.org/listinfo/libcamera-devel
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel@lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
>

Patch
diff mbox series

diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h
index 2b55dbfc..86c97ffa 100644
--- a/include/libcamera/ipa/raspberrypi.h
+++ b/include/libcamera/ipa/raspberrypi.h
@@ -21,6 +21,7 @@  enum ConfigParameters {
 	IPA_CONFIG_STAGGERED_WRITE = (1 << 1),
 	IPA_CONFIG_SENSOR = (1 << 2),
 	IPA_CONFIG_DROP_FRAMES = (1 << 3),
+	IPA_CONFIG_FAILED = (1 << 4),
 };
 
 enum Operations {
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 9853a343..7542dd26 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -197,8 +197,14 @@  void IPARPi::configure(const CameraSensorInfo &sensorInfo,
 		       const IPAOperationData &ipaConfig,
 		       IPAOperationData *result)
 {
-	if (entityControls.empty())
+	std::string cameraName(sensorInfo.model);
+
+	if (entityControls.size() != 2) {
+		LOG(IPARPI, Error) << "No ISP or sensor controls found for "
+				   << cameraName;
+		result->operation = RPi::IPA_CONFIG_FAILED;
 		return;
+	}
 
 	result->operation = 0;
 
@@ -213,10 +219,16 @@  void IPARPi::configure(const CameraSensorInfo &sensorInfo,
 	 * that the kernel driver doesn't. We only do this the first time; we don't need
 	 * to re-parse the metadata after a simple mode-switch for no reason.
 	 */
-	std::string cameraName(sensorInfo.model);
 	if (!helper_) {
 		helper_ = std::unique_ptr<RPiController::CamHelper>(RPiController::CamHelper::Create(cameraName));
 
+		if (!helper_) {
+			LOG(IPARPI, Error) << "Could not create camera helper for "
+					   << cameraName;
+			result->operation = RPi::IPA_CONFIG_FAILED;
+			return;
+		}
+
 		/*
 		 * Pass out the sensor config to the pipeline handler in order
 		 * to setup the staggered writer class.
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 6fcdf557..76252806 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -1194,6 +1194,11 @@  int RPiCameraData::configureIPA(const CameraConfiguration *config)
 	ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig,
 			&result);
 
+	if (result.operation & RPi::IPA_CONFIG_FAILED) {
+		LOG(RPI, Error) << "IPA configuration failed!";
+		return -EPIPE;
+	}
+
 	unsigned int resultIdx = 0;
 	if (result.operation & RPi::IPA_CONFIG_STAGGERED_WRITE) {
 		/*