summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/rkisp1
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/pipeline/rkisp1')
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp55
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1_path.cpp55
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1_path.h10
3 files changed, 68 insertions, 52 deletions
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 6e6ebe4c..857c9330 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -817,60 +817,17 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
data->mainPathActive_ = false;
data->selfPathActive_ = false;
for (const StreamConfiguration &cfg : *config) {
- V4L2SubdeviceFormat ispFormat = format;
- V4L2Subdevice *resizer;
- V4L2VideoDevice *video;
-
if (cfg.stream() == &data->mainPathStream_) {
- resizer = mainPath_.resizer_;
- video = mainPath_.video_;
+ ret = mainPath_.configure(cfg, format);
+ if (ret)
+ return ret;
data->mainPathActive_ = true;
} else {
- resizer = selfPath_.resizer_;
- video = selfPath_.video_;
+ ret = selfPath_.configure(cfg, format);
+ if (ret)
+ return ret;
data->selfPathActive_ = true;
}
-
- ret = resizer->setFormat(0, &ispFormat);
- if (ret < 0)
- return ret;
-
- const char *name = resizer == mainPath_.resizer_ ? "main" : "self";
-
- LOG(RkISP1, Debug)
- << "Configured " << name << " resizer input pad with "
- << ispFormat.toString();
-
- ispFormat.size = cfg.size;
-
- LOG(RkISP1, Debug)
- << "Configuring " << name << " resizer output pad with "
- << ispFormat.toString();
-
- ret = resizer->setFormat(1, &ispFormat);
- if (ret < 0)
- return ret;
-
- LOG(RkISP1, Debug)
- << "Configured " << name << " resizer output pad with "
- << ispFormat.toString();
-
- const PixelFormatInfo &info = PixelFormatInfo::info(cfg.pixelFormat);
- V4L2DeviceFormat outputFormat = {};
- outputFormat.fourcc = video->toV4L2PixelFormat(cfg.pixelFormat);
- outputFormat.size = cfg.size;
- outputFormat.planesCount = info.numPlanes();
-
- ret = video->setFormat(&outputFormat);
- if (ret)
- return ret;
-
- if (outputFormat.size != cfg.size ||
- outputFormat.fourcc != video->toV4L2PixelFormat(cfg.pixelFormat)) {
- LOG(RkISP1, Error)
- << "Unable to configure capture in " << cfg.toString();
- return -EINVAL;
- }
}
V4L2DeviceFormat paramFormat = {};
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
index 2eae4234..66b5eebd 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
@@ -7,14 +7,18 @@
#include "rkisp1_path.h"
+#include <libcamera/stream.h>
+
#include "libcamera/internal/media_device.h"
#include "libcamera/internal/v4l2_subdevice.h"
#include "libcamera/internal/v4l2_videodevice.h"
namespace libcamera {
+LOG_DECLARE_CATEGORY(RkISP1)
+
RkISP1Path::RkISP1Path(const char *name)
- : resizer_(nullptr), video_(nullptr), name_(name)
+ : video_(nullptr), name_(name), resizer_(nullptr)
{
}
@@ -40,6 +44,55 @@ bool RkISP1Path::init(MediaDevice *media)
return true;
}
+int RkISP1Path::configure(const StreamConfiguration &config,
+ const V4L2SubdeviceFormat &inputFormat)
+{
+ int ret;
+
+ V4L2SubdeviceFormat ispFormat = inputFormat;
+
+ ret = resizer_->setFormat(0, &ispFormat);
+ if (ret < 0)
+ return ret;
+
+ LOG(RkISP1, Debug)
+ << "Configured " << name_ << " resizer input pad with "
+ << ispFormat.toString();
+
+ ispFormat.size = config.size;
+
+ LOG(RkISP1, Debug)
+ << "Configuring " << name_ << " resizer output pad with "
+ << ispFormat.toString();
+
+ ret = resizer_->setFormat(1, &ispFormat);
+ if (ret < 0)
+ return ret;
+
+ LOG(RkISP1, Debug)
+ << "Configured " << name_ << " resizer output pad with "
+ << ispFormat.toString();
+
+ const PixelFormatInfo &info = PixelFormatInfo::info(config.pixelFormat);
+ V4L2DeviceFormat outputFormat = {};
+ outputFormat.fourcc = video_->toV4L2PixelFormat(config.pixelFormat);
+ outputFormat.size = config.size;
+ outputFormat.planesCount = info.numPlanes();
+
+ ret = video_->setFormat(&outputFormat);
+ if (ret)
+ return ret;
+
+ if (outputFormat.size != config.size ||
+ outputFormat.fourcc != video_->toV4L2PixelFormat(config.pixelFormat)) {
+ LOG(RkISP1, Error)
+ << "Unable to configure capture in " << config.toString();
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
RkISP1MainPath::RkISP1MainPath()
: RkISP1Path("main")
{
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
index d3172e22..6eb01529 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
@@ -12,6 +12,8 @@ namespace libcamera {
class MediaDevice;
class V4L2Subdevice;
class V4L2VideoDevice;
+struct StreamConfiguration;
+struct V4L2SubdeviceFormat;
class RkISP1Path
{
@@ -21,12 +23,16 @@ public:
bool init(MediaDevice *media);
- /* \todo Make resizer and video private. */
- V4L2Subdevice *resizer_;
+ int configure(const StreamConfiguration &config,
+ const V4L2SubdeviceFormat &inputFormat);
+
+ /* \todo Make video private. */
V4L2VideoDevice *video_;
private:
const char *name_;
+
+ V4L2Subdevice *resizer_;
};
class RkISP1MainPath : public RkISP1Path