51 void *mapped = ::mmap(
nullptr, totalLength, PROT_READ, MAP_SHARED, fd, 0);
67 Stream *stream,
int bytesPerLine,
68 QVideoFrameFormat frameFormat,
double maxFrameRate)
69 : m_libcameraCamera(std::move(libcameraCamera)),
71 m_bytesPerLine(bytesPerLine),
72 m_frameFormat(std::move(frameFormat)),
73 m_maxFrameRate(maxFrameRate)
80 using namespace std::chrono;
82 switch (request->status()) {
83 case Request::RequestComplete:
85 case Request::RequestCancelled:
87 case Request::RequestPending:
88 qCWarning(lcLibCamera) <<
"Completed request is still pending";
92 FrameBuffer *buffer = request->findBuffer(m_stream);
94 qCWarning(lcLibCamera) <<
"Completed request has no buffer for our stream";
98 const auto timestamp = nanoseconds(int64_t(buffer->metadata().timestamp));
99 if (!m_firstFrameTimestamp)
100 m_firstFrameTimestamp = timestamp;
102 q23::expected<QVideoFrame, QString> frame =
103 createVideoFrameFromLibcameraBuffer(*buffer, m_frameFormat, m_bytesPerLine);
106 request->reuse(Request::ReuseFlag::ReuseBuffers);
107 withPendingControls([&](ControlList &pendingControls) {
108 request->controls().merge(pendingControls, ControlList::MergePolicy::OverwriteExisting);
110 const int queueResult = m_libcameraCamera->queueRequest(request);
111 switch (queueResult) {
116 qCDebug(lcLibCamera) <<
"Camera disconnected, not requeueing request";
119 qCWarning(lcLibCamera) <<
"Failed to requeue request:"
120 << QSystemError::stdString(-queueResult);
125 qCWarning(lcLibCamera) <<
"Failed to build video frame:" << frame.error();
129 const auto elapsed = duration_cast<microseconds>(timestamp - *m_firstFrameTimestamp);
130 frame->setStartTime(elapsed.count());
131 if (m_maxFrameRate > 0) {
132 const auto frameDuration =
133 duration_cast<microseconds>(duration<
double>(1.0 / m_maxFrameRate));
134 frame->setEndTime((elapsed + frameDuration).count());
137 QMetaObject::invokeMethod(
this, [
this, frame = std::move(*frame)] {
139 Q_EMIT newVideoFrame(frame);
140 }, Qt::QueuedConnection);