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

Public Member Functions

 JsonStreamer (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< JsonStreamer, 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< JsonStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >
static JsonStreamercheck (HvtStreamingContext hvtHandle)
 
static JsonStreamercheck (HvtStreamingContext hvtHandle)
 
static JsonStreamercheck (HvtStreamingContext hvtHandle)
 
static JsonStreamercheck (HvtStreamingContext hvtHandle)
 
static JsonStreameropt_check (HvtStreamingContext hvtHandle)
 
static JsonStreameropt_check (HvtStreamingContext hvtHandle)
 
static JsonStreameropt_check (HvtStreamingContext hvtHandle)
 
static JsonStreameropt_check (HvtStreamingContext hvtHandle)
 
- Static Public Attributes inherited from Handle< JsonStreamer, HvtStreamingContext, HvtHandleType::CONTEXT >
static constexpr HvtHandleType staticType
 

Detailed Description

Definition at line 81 of file JsonStreamer.h.

Constructor & Destructor Documentation

◆ JsonStreamer()

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

Definition at line 66 of file JsonStreamer.cpp.

67{
68 initSettings();
69 initVk(uuid);
70 initVkResources();
71}

◆ ~JsonStreamer()

JsonStreamer::~JsonStreamer ( )

Definition at line 576 of file JsonStreamer.cpp.

576 {
577 stopStreaming();
578}

Member Function Documentation

◆ acquireStreamsFrames()

void JsonStreamer::acquireStreamsFrames ( const HvtAcquireStreamFramesInfo infos)

Definition at line 526 of file JsonStreamer.cpp.

526 {
527 if(infos.frameInfoCount != readStreams.size()) {
528 throw HvtResult::HVT_ERROR_WRONG_BUFFER_SIZE;
529 }
530
531 swapPendingToReading();
532
533 auto imageIndex = slotReadingIndex;
534
535 for(int i = 0; i < infos.frameInfoCount; i++) {
536 auto& stream = readStreams.at(i);
537 auto& desc = infos.pStreamFrameInfos[i];
538 desc.extrinsics = stream.extrinsics;
539 desc.intrinsics = stream.intrinsics;
540 desc.imageIndex = imageIndex;
541 }
542
543 if(infos.signalSemaphore){
544 auto sem = Semaphore::check(infos.signalSemaphore);
545 std::scoped_lock l(queueMutex);
546 syncQueue.submit(
547 vk::SubmitInfo(
548 {},
549 {},
550 {},
551 *sem->sem));
552 }
553}

◆ destroySemaphore()

void JsonStreamer::destroySemaphore ( Semaphore sem) const

Definition at line 507 of file JsonStreamer.cpp.

507 {
508 delete sem;
509}

◆ enumerateStreamsParameters()

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

Definition at line 338 of file JsonStreamer.cpp.

338 {
339 if(!parameters) {
340 *streamsCount = readStreams.size();
341 return;
342 }
343
344 if(*streamsCount != readStreams.size()){
345 throw HvtResult::HVT_ERROR_WRONG_BUFFER_SIZE;
346 }
347
348 for(int i = 0; const auto& readStream : readStreams) {
349 parameters[i] = HvtRGBDStreamParameters{
350 .colorResolution = {(uint32_t)readStream.resolution.x, (uint32_t)readStream.resolution.y},
351 .depthResolution = {(uint32_t)readStream.resolution.x, (uint32_t)readStream.resolution.y},
352
353 .nearDepth = readStream.anear,
354 .farDepth = readStream.afar,
355
356 .colorFormat = (HvtImageFormat)readStream.colorFormat,
357 .depthFormat = (HvtImageFormat)readStream.depthFormat,
358
359 .slotCount = numSlots,
360 .projectionType = readStream.projectionType
361 };
362 snprintf(parameters->name, HVT_MAX_STREAM_NAME_LENGHT, "%s", config->InputCameraNames.at(i).c_str());
363 i++;
364 }
365}
Description of an RGBD stream.
char name[HVT_MAX_STREAM_NAME_LENGHT]

◆ importSemaphore()

Semaphore * JsonStreamer::importSemaphore ( const HvtSemaphoreExportInfo exportInfos)

Definition at line 475 of file JsonStreamer.cpp.

475 {
476 #ifdef WIN32
477 if((vk::ExternalSemaphoreHandleTypeFlagBits)exportInfos.type != vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32){
478 #else
479 if((vk::ExternalSemaphoreHandleTypeFlagBits)exportInfos.type != vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd){
480 #endif
481 throw HvtResult::HVT_ERROR_UNSUPPORTED_SEMAPHORE_TYPE;
482 }
483
484 auto sem = device->createSemaphoreUnique({});
485 #ifdef WIN32
486 device->importSemaphoreWin32HandleKHR(
487 vk::ImportSemaphoreWin32HandleInfoKHR(
488 *sem,
489 {},
490 vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueWin32,
491 exportInfos.semaphore
492 ));
493 #else
494 device->importSemaphoreFdKHR(
495 vk::ImportSemaphoreFdInfoKHR(
496 *sem,
497 {},
498 vk::ExternalSemaphoreHandleTypeFlagBits::eOpaqueFd,
499 exportInfos.semaphore
500 ));
501 #endif
502 return new Semaphore{
503 .sem = std::move(sem)
504 };
505}

◆ importStreamImages()

void JsonStreamer::importStreamImages ( const HvtStreamImagesExportInfo exportInfos)

Definition at line 367 of file JsonStreamer.cpp.

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

◆ releaseStreamsFrames()

void JsonStreamer::releaseStreamsFrames ( Semaphore waitSem)

Definition at line 555 of file JsonStreamer.cpp.

555 {
556 std::scoped_lock l(queueMutex);
557
558 if(waitSem) {
559 vk::PipelineStageFlags stage = vk::PipelineStageFlagBits::eTopOfPipe;
560 syncQueue.submit(
561 vk::SubmitInfo(
562 *waitSem->sem,
563 stage,
564 {},
565 {}));
566 }
567}

◆ startStreaming()

void JsonStreamer::startStreaming ( )

Definition at line 511 of file JsonStreamer.cpp.

511 {
512 //assert that we have everything ready for streaming
513 for(auto& stream : readStreams) {
514 if(!stream.importedColor || !stream.importedDepth) {
515 throw HvtResult::HVT_ERROR_CALL_ORDER;
516 }
517 }
518
519 // Start worker
520 running = true;
521 streamingThread = std::thread([&]{
522 streamingLoop();
523 });
524}

◆ stopStreaming()

void JsonStreamer::stopStreaming ( )

Definition at line 569 of file JsonStreamer.cpp.

569 {
570 running = false;
571 if(streamingThread.joinable()) {
572 streamingThread.join();
573 }
574}

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