@@ -877,8 +877,6 @@ void CameraDevice::abortRequest(Camera3RequestDescriptor *descriptor) const
buffer.status = CAMERA3_BUFFER_STATUS_ERROR;
}
result.output_buffers = resultBuffers.data();
-
- descriptor->status_ = Camera3RequestDescriptor::Status::Error;
}
bool CameraDevice::isValidRequest(camera3_capture_request_t *camera3Request) const
@@ -1058,8 +1056,10 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
if (state_ == State::Flushing) {
abortRequest(descriptor.get());
+
{
MutexLocker descriptorsLock(descriptorsMutex_);
+ descriptor->status_ = Camera3RequestDescriptor::Status::Error;
descriptors_.push(std::move(descriptor));
}
@@ -1154,8 +1154,7 @@ void CameraDevice::requestComplete(Request *request)
buffer.status = CAMERA3_BUFFER_STATUS_ERROR;
}
- descriptor->status_ = Camera3RequestDescriptor::Status::Error;
- sendCaptureResults();
+ completeDescriptor(descriptor, Camera3RequestDescriptor::Status::Error);
return;
}
@@ -1215,13 +1214,24 @@ void CameraDevice::requestComplete(Request *request)
}
captureResult.result = descriptor->resultMetadata_->get();
- descriptor->status_ = Camera3RequestDescriptor::Status::Success;
+
+ completeDescriptor(descriptor, Camera3RequestDescriptor::Status::Success);
+}
+
+void CameraDevice::completeDescriptor(Camera3RequestDescriptor *descriptor,
+ Camera3RequestDescriptor::Status status)
+{
+ MutexLocker lock(descriptorsMutex_);
+ descriptor->status_ = status;
+ lock.unlock();
+
sendCaptureResults();
}
void CameraDevice::sendCaptureResults()
{
MutexLocker lock(descriptorsMutex_);
+
while (!descriptors_.empty() && !descriptors_.front()->isPending()) {
auto descriptor = std::move(descriptors_.front());
descriptors_.pop();
@@ -1262,12 +1272,13 @@ void CameraDevice::streamProcessingComplete(CameraStream *cameraStream,
if (cameraStream->type() == CameraStream::Type::Internal)
cameraStream->putBuffer(request->internalBuffer_);
+ Camera3RequestDescriptor::Status descriptorStatus;
if (status == PostProcessor::Status::Success)
- request->status_ = Camera3RequestDescriptor::Status::Success;
+ descriptorStatus = Camera3RequestDescriptor::Status::Success;
else
- request->status_ = Camera3RequestDescriptor::Status::Error;
+ descriptorStatus = Camera3RequestDescriptor::Status::Error;
- sendCaptureResults();
+ completeDescriptor(request, descriptorStatus);
}
std::string CameraDevice::logPrefix() const
@@ -126,6 +126,8 @@ private:
void notifyError(uint32_t frameNumber, camera3_stream_t *stream,
camera3_error_msg_code code) const;
int processControls(Camera3RequestDescriptor *descriptor);
+ void completeDescriptor(Camera3RequestDescriptor *descriptor,
+ Camera3RequestDescriptor::Status status);
void sendCaptureResults();
std::unique_ptr<CameraMetadata> getResultMetadata(
const Camera3RequestDescriptor &descriptor) const;
@@ -147,7 +149,7 @@ private:
std::vector<CameraStream> streams_;
- libcamera::Mutex descriptorsMutex_; /* Protects descriptors_. */
+ libcamera::Mutex descriptorsMutex_; /* Protects descriptors_ and Camera3RequestDescriptor::status_. */
std::queue<std::unique_ptr<Camera3RequestDescriptor>> descriptors_;
std::string maker_;