HoviTron Video Pipeline
Data Structures | Public Member Functions
opencvStreamer Class Reference
Inheritance diagram for opencvStreamer:
Handle< opencvStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >

Public Member Functions

 opencvStreamer (std::span< const uint8_t, VK_UUID_SIZE > uuid)
 
void enumerateStreamsParameters (uint32_t *streamsCount, HvtRGBDStreamParameters *parameters) const
 
void importStreamImages (const HvtStreamImagesExportInfo &exportInfos)
 
SemaphoreimportSemaphore (const HvtSemaphoreExportInfo &exportInfos)
 
void destroySemaphore (Semaphore *sem) const
 
void startStreaming ()
 
void acquireStreamsFrames (const HvtAcquireStreamFramesInfo &infos)
 
void releaseStreamsFrames (Semaphore *waitSem)
 
void stopStreaming ()
 
- Public Member Functions inherited from Handle< opencvStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >
HvtStreamingContext to_handle ()
 
HvtStreamingContext to_handle ()
 
HvtStreamingContext to_handle ()
 
HvtStreamingContext to_handle ()
 

Additional Inherited Members

- Static Public Member Functions inherited from Handle< opencvStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >
static opencvStreamercheck (HvtStreamingContext hvtHandle)
 
static opencvStreamercheck (HvtStreamingContext hvtHandle)
 
static opencvStreamercheck (HvtStreamingContext hvtHandle)
 
static opencvStreamercheck (HvtStreamingContext hvtHandle)
 
static opencvStreameropt_check (HvtStreamingContext hvtHandle)
 
static opencvStreameropt_check (HvtStreamingContext hvtHandle)
 
static opencvStreameropt_check (HvtStreamingContext hvtHandle)
 
static opencvStreameropt_check (HvtStreamingContext hvtHandle)
 
- Static Public Attributes inherited from Handle< opencvStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >
static constexpr HvtHandleType staticType
 

Detailed Description

Definition at line 88 of file opencvStreamer.h.

Constructor & Destructor Documentation

◆ opencvStreamer()

opencvStreamer::opencvStreamer ( std::span< const uint8_t, VK_UUID_SIZE >  uuid)

Definition at line 74 of file opencvStreamer.cpp.

75 {
76 initSettings();
77 initVk(uuid);
78 initVkResources();
79 }

◆ ~opencvStreamer()

opencvStreamer::~opencvStreamer ( )

Definition at line 596 of file opencvStreamer.cpp.

596 {
597 stopStreaming();
598 }

Member Function Documentation

◆ acquireStreamsFrames()

void opencvStreamer::acquireStreamsFrames ( const HvtAcquireStreamFramesInfo infos)

Definition at line 546 of file opencvStreamer.cpp.

546 {
547 if (infos.frameInfoCount != readStreams.size()) {
548 throw HvtResult::HVT_ERROR_WRONG_BUFFER_SIZE;
549 }
550
551 swapPendingToReading();
552
553 auto imageIndex = slotReadingIndex;
554
555 for (int i = 0; i < infos.frameInfoCount; i++) {
556 auto& stream = readStreams.at(i);
557 auto& desc = infos.pStreamFrameInfos[i];
558 desc.extrinsics = stream.extrinsics;
559 desc.intrinsics = stream.intrinsics;
560 desc.imageIndex = imageIndex;
561 }
562
563 if (infos.signalSemaphore) {
564 auto sem = Semaphore::check(infos.signalSemaphore);
565 std::scoped_lock l(queueMutex);
566 syncQueue.submit(
567 vk::SubmitInfo(
568 {},
569 {},
570 {},
571 *sem->sem));
572 }
573 }

◆ destroySemaphore()

void opencvStreamer::destroySemaphore ( Semaphore sem) const

Definition at line 527 of file opencvStreamer.cpp.

527 {
528 delete sem;
529 }

◆ enumerateStreamsParameters()

void opencvStreamer::enumerateStreamsParameters ( uint32_t *  streamsCount,
HvtRGBDStreamParameters parameters 
) const

Definition at line 358 of file opencvStreamer.cpp.

358 {
359 if (!parameters) {
360 *streamsCount = readStreams.size();
361 return;
362 }
363
364 if (*streamsCount != readStreams.size()) {
365 throw HvtResult::HVT_ERROR_WRONG_BUFFER_SIZE;
366 }
367
368 for (int i = 0; const auto & readStream : readStreams) {
369 parameters[i] = HvtRGBDStreamParameters{
370 .colorResolution = {(uint32_t)readStream.resolution.x, (uint32_t)readStream.resolution.y},
371 .depthResolution = {(uint32_t)readStream.resolution.x, (uint32_t)readStream.resolution.y},
372
373 .nearDepth = readStream.anear,
374 .farDepth = readStream.afar,
375
376 .colorFormat = (HvtImageFormat)readStream.colorFormat,
377 .depthFormat = (HvtImageFormat)readStream.depthFormat,
378
379 .slotCount = numSlots,
380 .projectionType = readStream.projectionType
381 };
382 snprintf(parameters->name, HVT_MAX_STREAM_NAME_LENGHT, "%s", config->InputCameraNames.at(i).c_str());
383 i++;
384 }
385 }
Description of an RGBD stream.
char name[HVT_MAX_STREAM_NAME_LENGHT]

◆ importSemaphore()

Semaphore * opencvStreamer::importSemaphore ( const HvtSemaphoreExportInfo exportInfos)

Definition at line 495 of file opencvStreamer.cpp.

495 {
496#ifdef WIN32
497 if ((vk::ExternalSemaphoreHandleTypeFlagBits)exportInfos.type != vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32) {
498#else
499 if ((vk::ExternalSemaphoreHandleTypeFlagBits)exportInfos.type != vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd) {
500#endif
501 throw HvtResult::HVT_ERROR_UNSUPPORTED_SEMAPHORE_TYPE;
502 }
503
504 auto sem = device->createSemaphoreUnique({});
505#ifdef WIN32
506 device->importSemaphoreWin32HandleKHR(
507 vk::ImportSemaphoreWin32HandleInfoKHR(
508 *sem,
509 {},
510 vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32,
511 exportInfos.semaphore
512 ));
513#else
514 device->importSemaphoreFdKHR(
515 vk::ImportSemaphoreFdInfoKHR(
516 *sem,
517 {},
518 vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,
519 exportInfos.semaphore
520 ));
521#endif
522 return new Semaphore{
523 .sem = std::move(sem)
524 };
525 }

◆ importStreamImages()

void opencvStreamer::importStreamImages ( const HvtStreamImagesExportInfo exportInfos)

Definition at line 387 of file opencvStreamer.cpp.

387 {
388 auto memtype = (vk::ExternalMemoryHandleTypeFlagBits)exportInfos.memoryType;
389
390#ifdef WIN32
391 if (memtype != vk::ExternalMemoryHandleTypeFlagBits::eOpaqueWin32)
392#else
393 if (memtype != vk::ExternalMemoryHandleTypeFlagBits::eOpaqueFd)
394#endif
395 {
396 throw HvtResult::HVT_ERROR_UNSUPPORTED_MEMORY_TYPE;
397 }
398
399 auto isDepth = (bool)exportInfos.depth;
400 auto& stream = readStreams.at(exportInfos.streamIndex);
401 auto format = isDepth ? stream.depthFormat : stream.colorFormat;
402 auto& slots = isDepth ? stream.depthSlots : stream.colorSlots;
403
404 if (exportInfos.imagesCount != numSlots) {
405 throw HvtResult::HVT_ERROR_WRONG_BUFFER_SIZE;
406 }
407
408 vk::ImageCreateInfo imgCreateInfo(
409 {}, //Flags,
410 vk::ImageType::e2D,
411 format,
412 vk::Extent3D(stream.resolution.x, stream.resolution.y, 1),
413 1, //Mip count,
414 1, //Array layers,
415 vk::SampleCountFlagBits::e1,
416 vk::ImageTiling::eOptimal,
417 vk::ImageUsageFlagBits::eTransferDst,
418 vk::SharingMode::eExclusive,
419 {}, //Queue families
420 vk::ImageLayout::eUndefined
421 );
422
423 for (int i = 0; i < numSlots; i++) {
424 auto memoryInfos = exportInfos.pImages[i];
425
426 auto imgImportInfo = vk::ExternalMemoryImageCreateInfo(memtype);
427 auto createChain = vk::StructureChain(imgCreateInfo, imgImportInfo);
428
429 auto image = device->createImageUnique(createChain.get<vk::ImageCreateInfo>());
430 auto reqs = device->getImageMemoryRequirements(*image);
431
432 auto memIndex = findMemoryType(reqs.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal);
433
434 assert(reqs.size == memoryInfos.size);
435 assert(reqs.alignment == memoryInfos.alignment);
436
437 auto memoryAllocInfo = vk::StructureChain(
438 vk::MemoryAllocateInfo(reqs.size, memIndex),
439#ifdef WIN32
440 vk::ImportMemoryWin32HandleInfoKHR(memtype, memoryInfos.handle)
441#else
442 vk::ImportMemoryFdInfoKHR(memtype, memoryInfos.handle)
443#endif
444 );
445
446 auto memory = device->allocateMemoryUnique(memoryAllocInfo.get<vk::MemoryAllocateInfo>());
447
448 device->bindImageMemory(*image, *memory, 0);
449
450 // Transition images to their unique layout
451 oneTimeSubmit([&](vk::CommandBuffer& cmd) {
452 vk::ImageMemoryBarrier colorMemoryBarrier(
453 {},
454 vk::AccessFlagBits::eTransferWrite,
455 vk::ImageLayout::eUndefined, //Don't care about what was there previously
456 vk::ImageLayout::eTransferDstOptimal,
457 VK_QUEUE_FAMILY_IGNORED, // No queue ownership transfer
458 VK_QUEUE_FAMILY_IGNORED,
459 *image,
460 vk::ImageSubresourceRange(
461 vk::ImageAspectFlagBits::ePlane0 | vk::ImageAspectFlagBits::ePlane1 | vk::ImageAspectFlagBits::ePlane2,
462 0, 1,
463 0, 1));
464
465 vk::ImageMemoryBarrier depthMemoryBarrier(
466 {},
467 vk::AccessFlagBits::eTransferWrite,
468 vk::ImageLayout::eUndefined,
469 vk::ImageLayout::eTransferDstOptimal,
470 VK_QUEUE_FAMILY_IGNORED,
471 VK_QUEUE_FAMILY_IGNORED,
472 *image,
473 vk::ImageSubresourceRange(
474 vk::ImageAspectFlagBits::eColor,
475 0, 1,
476 0, 1));
477
478 cmd.pipelineBarrier(
479 vk::PipelineStageFlagBits::eTransfer,
480 vk::PipelineStageFlagBits::eTransfer,
481 vk::DependencyFlagBits::eByRegion,
482 {},
483 {},
484 isDepth ? depthMemoryBarrier : colorMemoryBarrier);
485 });
486
487 slots.at(i) = ImageSlot{
488 .image = std::move(image),
489 .memory = std::move(memory)
490 };
491 }
492 (isDepth ? stream.importedDepth : stream.importedColor) = true;
493 }

◆ releaseStreamsFrames()

void opencvStreamer::releaseStreamsFrames ( Semaphore waitSem)

Definition at line 575 of file opencvStreamer.cpp.

575 {
576 std::scoped_lock l(queueMutex);
577
578 if (waitSem) {
579 vk::PipelineStageFlags stage = vk::PipelineStageFlagBits::eTopOfPipe;
580 syncQueue.submit(
581 vk::SubmitInfo(
582 *waitSem->sem,
583 stage,
584 {},
585 {}));
586 }
587 }

◆ startStreaming()

void opencvStreamer::startStreaming ( )

Definition at line 531 of file opencvStreamer.cpp.

531 {
532 //assert that we have everything ready for streaming
533 for (auto& stream : readStreams) {
534 if (!stream.importedColor || !stream.importedDepth) {
535 throw HvtResult::HVT_ERROR_CALL_ORDER;
536 }
537 }
538
539 // Start worker
540 running = true;
541 streamingThread = std::thread([&] {
542 streamingLoop();
543 });
544 }

◆ stopStreaming()

void opencvStreamer::stopStreaming ( )

Definition at line 589 of file opencvStreamer.cpp.

589 {
590 running = false;
591 if (streamingThread.joinable()) {
592 streamingThread.join();
593 }
594 }

The documentation for this class was generated from the following files: