Skip to content

Commit 86fa203

Browse files
committed
async resume
1 parent 460b36b commit 86fa203

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

src/libcameracamera.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -320,24 +320,29 @@ void LibCameraWorker::captureImage() {
320320
}
321321

322322
void LibCameraWorker::processCaptureComplete(Request *request) {
323+
qDebug() << "[DEBUG] processCaptureComplete called, status:" << request->status();
324+
323325
if (request->status() == Request::RequestCancelled) {
324-
resumeViewfinder();
326+
// Defer resumeViewfinder to run outside this callback
327+
QMetaObject::invokeMethod(this, "resumeViewfinder", Qt::QueuedConnection);
325328
return;
326329
}
327330

328331
// Convert buffer to image
329332
if (!request->buffers().empty()) {
330333
QImage img = convertBufferToImage(request->buffers());
331334
if (!img.isNull()) {
332-
emit imageCaptured(img);
335+
Q_EMIT imageCaptured(img);
333336
} else {
334-
emit errorOccurred("libcamera: failed to convert capture buffer");
337+
Q_EMIT errorOccurred("libcamera: failed to convert capture buffer");
335338
}
336339
} else {
337-
emit errorOccurred("libcamera: capture request has no buffers");
340+
Q_EMIT errorOccurred("libcamera: capture request has no buffers");
338341
}
339342

340-
resumeViewfinder();
343+
// Defer resumeViewfinder to run outside this callback
344+
// This is critical - we cannot call mCamera->stop() from within the requestCompleted callback
345+
QMetaObject::invokeMethod(this, "resumeViewfinder", Qt::QueuedConnection);
341346
}
342347

343348
void LibCameraWorker::resumeViewfinder() {

src/libcameracamera.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public slots:
3333
void startCamera(const QString &cameraId);
3434
void stopCamera();
3535
void captureImage();
36+
void resumeViewfinder();
3637
void queueViewfinderRequest();
3738

3839
signals:
@@ -45,7 +46,7 @@ public slots:
4546
bool configureCamera(libcamera::StreamRole role);
4647
void processCompletedRequest(libcamera::Request *request);
4748
void processCaptureComplete(libcamera::Request *request);
48-
void resumeViewfinder();
49+
4950
QImage convertBufferToImage(
5051
const std::map<const libcamera::Stream *, libcamera::FrameBuffer *> &buffers);
5152

0 commit comments

Comments
 (0)