diff --git a/main.cpp b/main.cpp index 137e8b0..509f4ee 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,9 @@ #include +#include #include #include #include +#include #include using namespace libcamera; @@ -13,7 +15,24 @@ static std::shared_ptr camera; static void requestComplete(Request *request) { - + if (request->status() == Request::RequestCancelled) + return; + + for (auto const &bufferPair : request->buffers()) { + FrameBuffer *buffer = bufferPair.second; + const FrameMetadata &metadata = buffer->metadata(); + if (metadata.status != FrameMetadata::FrameSuccess) + continue; + + int fd = buffer->planes()[0].fd.get(); // Import this dma-buf fd into EGL/OpenGL. + std::cout << "frame " << std::setw(6) << std::setfill('0') << metadata.sequence + << " fd " << fd << " bytes " << metadata.planes()[0].bytesused + << std::endl; + } + + request->reuse(Request::ReuseBuffers); + if (capturing) + camera->queueRequest(request); } int main() @@ -40,17 +59,39 @@ int main() config->validate(); camera->configure(config.get()); + FrameBufferAllocator *allocator = new FrameBufferAllocator(camera); + Stream *stream = streamConfig.stream(); + if (allocator->allocate(stream) < 0) { + std::cerr << "Can't allocate buffers" << std::endl; + delete allocator; + camera->release(); + cm->stop(); + return 1; + } + const std::vector> &buffers = allocator->buffers(stream); + std::vector> requests; + for (const std::unique_ptr &buffer : buffers) { + std::unique_ptr request = camera->createRequest(); + if (!request || request->addBuffer(stream, buffer.get()) < 0) { + std::cerr << "Can't create request" << std::endl; + allocator->free(stream); + delete allocator; + camera->release(); + cm->stop(); + return 1; + } + requests.push_back(std::move(request)); + } - - - - camera->requestCompleted.connect(requestCompleted); + camera->requestCompleted.connect(requestComplete); camera->start(); for (auto &req : requests) { camera->queueRequest(req.get()); } + std::this_thread::sleep_for(10000ms); + // end the cameras capturing = false; camera->stop();