summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/ipu3/ipu3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/pipeline/ipu3/ipu3.cpp')
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 79dbfa13..55489c31 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -63,6 +63,8 @@ private:
delete sensor_;
}
+ void bufferReady(Buffer *buffer);
+
V4L2Device *cio2_;
V4L2Subdevice *csi2_;
V4L2Subdevice *sensor_;
@@ -236,6 +238,8 @@ void PipelineHandlerIPU3::stop(Camera *camera)
if (data->cio2_->streamOff())
LOG(IPU3, Info) << "Failed to stop camera " << camera->name();
+
+ PipelineHandler::stop(camera);
}
int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request)
@@ -250,7 +254,11 @@ int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request)
return -ENOENT;
}
- data->cio2_->queueBuffer(buffer);
+ int ret = data->cio2_->queueBuffer(buffer);
+ if (ret < 0)
+ return ret;
+
+ PipelineHandler::queueRequest(camera, request);
return 0;
}
@@ -396,6 +404,8 @@ void PipelineHandlerIPU3::registerCameras()
if (ret)
continue;
+ data->cio2_->bufferReady.connect(data.get(), &IPU3CameraData::bufferReady);
+
data->sensor_ = new V4L2Subdevice(sensor);
ret = data->sensor_->open();
if (ret)
@@ -417,6 +427,14 @@ void PipelineHandlerIPU3::registerCameras()
}
}
+void PipelineHandlerIPU3::IPU3CameraData::bufferReady(Buffer *buffer)
+{
+ Request *request = queuedRequests_.front();
+
+ pipe_->completeBuffer(camera_, request, buffer);
+ pipe_->completeRequest(camera_, request);
+}
+
REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);
} /* namespace libcamera */