11#include <promeki/config.h>
12#if PROMEKI_ENABLE_V4L2
22PROMEKI_NAMESPACE_BEGIN
77 Role role = Role::Encoder;
88 uint32_t outputFourcc = 0;
89 uint32_t captureFourcc = 0;
91 uint32_t outputBufferCount = 6;
92 uint32_t captureBufferCount = 6;
101 Memory outputMemory = Memory::Mmap;
102 Memory captureMemory = Memory::Mmap;
111 uint32_t codedBufferSize = 0;
118 uint32_t colorspace = 0;
119 uint32_t ycbcrEnc = 0;
120 uint32_t xferFunc = 0;
121 uint32_t quantization = 0;
126 uint8_t *data =
nullptr;
132 struct CapturePlane {
133 const uint8_t *data =
nullptr;
140 V4l2M2mCodec(
const V4l2M2mCodec &) =
delete;
141 V4l2M2mCodec &operator=(
const V4l2M2mCodec &) =
delete;
151 static String findDevice(Role role, uint32_t outputFourcc, uint32_t captureFourcc);
154 Error open(
const OpenParams ¶ms);
160 bool isOpen()
const {
return _fd >= 0; }
163 int fd()
const {
return _fd; }
166 const String &devPath()
const {
return _devPath; }
169 const String &driverName()
const {
return _driver; }
172 uint32_t negotiatedWidth()
const {
return _width; }
173 uint32_t negotiatedHeight()
const {
return _height; }
176 uint32_t outputPlaneCount()
const {
return _outPlaneCount; }
179 uint32_t outputStride(uint32_t plane)
const;
182 uint32_t negotiatedColorspace()
const {
return _colorspace; }
183 uint32_t negotiatedYcbcrEnc()
const {
return _ycbcrEnc; }
184 uint32_t negotiatedXferFunc()
const {
return _xferFunc; }
185 uint32_t negotiatedQuantization()
const {
return _quantization; }
200 Error setControl(uint32_t
id, int32_t value,
bool optional =
true);
216 Error setControlCompound(uint32_t
id,
void *payload, uint32_t size,
bool optional =
true);
260 Error dequeueEvent(
bool &sourceChange,
bool &eos);
273 Error setupCapture();
276 bool captureConfigured()
const {
return _captureConfigured; }
279 uint32_t captureWidth()
const {
return _capWidth; }
280 uint32_t captureHeight()
const {
return _capHeight; }
281 uint32_t captureFourcc()
const {
return _capFourcc; }
282 uint32_t capturePlaneCount()
const {
return _capPlaneCount; }
284 uint32_t captureStride(uint32_t plane)
const;
300 Error dequeueRawFrame(List<CapturePlane> &planes,
int &index, int64_t &ptsUsec,
304 Error requeueRawFrame(
int index);
318 Error acquireOutput(
int &index, List<OutPlane> &planes);
329 Error submitOutput(
int index,
const List<size_t> &bytesused, int64_t ptsUsec);
349 Error queueOutputDmabuf(
int fd,
size_t bytesused, int64_t ptsUsec,
bool &queued);
362 Result<int> exportBuffer(
bool capture,
int index);
380 Error dequeueCapture(Buffer &out, int64_t &ptsUsec,
bool &keyframe,
bool &endOfStream);
389 Error poll(
bool &outputWritable,
bool &captureReadable,
int timeoutMs);
398 Error pollEvents(
bool &outputWritable,
bool &captureReadable,
bool &eventPending,
int timeoutMs);
411 void *start =
nullptr;
414 struct MappedBuffer {
415 List<MappedPlane> planes;
419 Error negotiateFormats(
const OpenParams &p);
420 Error allocQueue(uint32_t type, uint32_t memory, uint32_t count, List<MappedBuffer> &pool,
421 uint32_t &planeCount);
422 void unmapQueue(List<MappedBuffer> &pool);
423 Error queueAllCapture();
424 void reclaimOutput();
425 Error subscribeEvents();
430 Role _role = Role::Encoder;
439 uint32_t _outputType = 0;
440 uint32_t _captureType = 0;
442 uint32_t _outputMemory = 0;
443 uint32_t _captureMemory = 0;
447 uint32_t _outputBufferCount = 6;
448 uint32_t _captureBufferCount = 6;
451 uint32_t _height = 0;
452 uint32_t _outPlaneCount = 1;
453 uint32_t _capPlaneCount = 1;
454 uint32_t _outStride[4] = {0, 0, 0, 0};
458 uint32_t _capWidth = 0;
459 uint32_t _capHeight = 0;
460 uint32_t _capFourcc = 0;
461 uint32_t _capStride[4] = {0, 0, 0, 0};
462 uint32_t _rawFourccWanted = 0;
465 uint32_t _colorspace = 0;
466 uint32_t _ycbcrEnc = 0;
467 uint32_t _xferFunc = 0;
468 uint32_t _quantization = 0;
470 List<MappedBuffer> _outputPool;
471 List<MappedBuffer> _capturePool;
473 bool _streaming =
false;
474 bool _captureConfigured =
false;
475 bool _captureDrained =
false;