[libcamera-devel] [libcamera-devel, v3, 1/1] libcamera: converter: Check converter validity

Suhrid Subramaniam suhridsubramaniam at gmail.com
Thu Mar 2 20:06:29 CET 2023


- In cases where ConverterFactoryBase::create returns a nullptr,
  converter_->isValid() causes a segmentation fault.

- Solve this by checking if converter_ is a nullptr.

- Additionally, check for converter validity in the create function itself
  and return a nullptr if the converter is invalid.

Signed-off-by: Suhrid Subramaniam <suhrid.subramaniam at mediatek.com>
---
 src/libcamera/converter.cpp              | 3 ++-
 src/libcamera/pipeline/simple/simple.cpp | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp
index 3de39cff..38141da6 100644
--- a/src/libcamera/converter.cpp
+++ b/src/libcamera/converter.cpp
@@ -226,8 +226,9 @@ std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)
 			<< "Creating converter from "
 			<< factory->name_ << " factory with "
 			<< (it == compatibles.end() ? "no" : media->driver()) << " alias.";
+		std::unique_ptr<Converter> converter_ = factory->createInstance(media);
 
-		return factory->createInstance(media);
+		return converter_->isValid() ? std::move(converter_) : nullptr;
 	}
 
 	return nullptr;
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 24ded4db..2423ec10 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -493,7 +493,7 @@ int SimpleCameraData::init()
 	MediaDevice *converter = pipe->converter();
 	if (converter) {
 		converter_ = ConverterFactoryBase::create(converter);
-		if (!converter_->isValid()) {
+		if (!converter_) {
 			LOG(SimplePipeline, Warning)
 				<< "Failed to create converter, disabling format conversion";
 			converter_.reset();
-- 
2.39.0



More information about the libcamera-devel mailing list