14static Q_LOGGING_CATEGORY(qLcV4L2MemoryTransfer,
"qt.multimedia.ffmpeg.v4l2camera.memorytransfer");
21 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
22 buf.memory = memoryType;
33 if (!fileDescriptor->requestBuffers(V4L2_MEMORY_USERPTR, buffersCount)) {
34 qCWarning(qLcV4L2MemoryTransfer) <<
"Cannot request V4L2_MEMORY_USERPTR buffers";
38 std::unique_ptr<UserPtrMemoryTransfer>
result(
39 new UserPtrMemoryTransfer(std::move(fileDescriptor), buffersCount,
imageSize));
44 std::optional<Buffer> dequeueBuffer()
override
46 auto v4l2Buffer = makeV4l2Buffer(V4L2_MEMORY_USERPTR);
47 if (!fileDescriptor().call(VIDIOC_DQBUF, &v4l2Buffer))
50 Q_ASSERT(v4l2Buffer.index < m_byteArrays.size());
51 Q_ASSERT(!m_byteArrays[v4l2Buffer.index].isEmpty());
53 return Buffer{ v4l2Buffer, std::move(m_byteArrays[v4l2Buffer.index]) };
61 auto buf = makeV4l2Buffer(V4L2_MEMORY_USERPTR,
index);
62 static_assert(
sizeof(
decltype(
buf.m.userptr)) ==
sizeof(size_t),
"Not compatible sizes");
66 buf.m.userptr = (
decltype(
buf.m.userptr))m_byteArrays[
index].data();
67 buf.length = m_byteArrays[
index].size();
69 if (!fileDescriptor().call(VIDIOC_QBUF, &
buf)) {
70 qWarning() <<
"Couldn't add V4L2 buffer" << errno << strerror(errno) <<
index;
77 quint32 buffersCount()
const override {
return static_cast<quint32>(m_byteArrays.size()); }
84 m_byteArrays(buffersCount)
90 std::vector<QByteArray> m_byteArrays;
100 bool inQueue =
false;
106 if (!fileDescriptor->requestBuffers(V4L2_MEMORY_MMAP, buffersCount)) {
107 qCWarning(qLcV4L2MemoryTransfer) <<
"Cannot request V4L2_MEMORY_MMAP buffers";
111 std::unique_ptr<MMapMemoryTransfer>
result(
112 new MMapMemoryTransfer(std::move(fileDescriptor)));
120 auto buf = makeV4l2Buffer(V4L2_MEMORY_MMAP,
index);
122 if (!fileDescriptor().call(VIDIOC_QUERYBUF, &
buf)) {
127 auto mappedData = mmap(
nullptr,
buf.length, PROT_READ | PROT_WRITE, MAP_SHARED,
128 fileDescriptor().
get(),
buf.m.offset);
135 m_spans.push_back(MemorySpan{ mappedData,
buf.length,
false });
138 m_spans.shrink_to_fit();
140 return enqueueBuffers();
143 ~MMapMemoryTransfer()
override
145 for (
const auto &
span : m_spans)
149 std::optional<Buffer> dequeueBuffer()
override
151 auto v4l2Buffer = makeV4l2Buffer(V4L2_MEMORY_MMAP);
152 if (!fileDescriptor().call(VIDIOC_DQBUF, &v4l2Buffer))
155 const auto index = v4l2Buffer.index;
162 span.inQueue =
false;
164 return Buffer{ v4l2Buffer,
173 auto buf = makeV4l2Buffer(V4L2_MEMORY_MMAP,
index);
174 if (!fileDescriptor().call(VIDIOC_QBUF, &
buf))
177 m_spans[
index].inQueue =
true;
181 quint32 buffersCount()
const override {
return static_cast<quint32>(m_spans.size()); }
187 std::vector<MemorySpan> m_spans;
192 : m_fileDescriptor(
std::move(fileDescriptor))
195 Q_ASSERT(!m_fileDescriptor->streamStarted());
200 Q_ASSERT(!m_fileDescriptor->streamStarted());
215 return UserPtrMemoryTransfer::create(std::move(fileDescriptor),
imageSize);
220 return MMapMemoryTransfer::create(std::move(fileDescriptor));
QV4L2MemoryTransfer(QV4L2FileDescriptorPtr fileDescriptor)
virtual quint32 buffersCount() const =0
virtual bool enqueueBuffer(quint32 index)=0
virtual ~QV4L2MemoryTransfer()
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
static QDBusError::ErrorType get(const char *name)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei imageSize
GLenum GLenum GLsizei void GLsizei void void * span
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QV4L2MemoryTransferUPtr makeUserPtrMemoryTransfer(QV4L2FileDescriptorPtr fileDescriptor, quint32 imageSize)
QV4L2MemoryTransferUPtr makeMMapMemoryTransfer(QV4L2FileDescriptorPtr fileDescriptor)
std::unique_ptr< QV4L2MemoryTransfer > QV4L2MemoryTransferUPtr
std::shared_ptr< QV4L2FileDescriptor > QV4L2FileDescriptorPtr