NDI related tests
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
#include "NdiInput.h"
|
||||
|
||||
#include "NdiInputFormat.h"
|
||||
#include "logging/Logger.h"
|
||||
#include "video/core/VideoIOFormat.h"
|
||||
|
||||
#include <Processing.NDI.Lib.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <cstring>
|
||||
#include <mutex>
|
||||
@@ -44,32 +44,6 @@ bool IsDefaultDeviceName(const std::string& device)
|
||||
return device.empty() || device == "default" || device == "auto";
|
||||
}
|
||||
|
||||
std::string FourCcName(NDIlib_FourCC_video_type_e fourCc)
|
||||
{
|
||||
char text[5] = {};
|
||||
const auto value = static_cast<uint32_t>(fourCc);
|
||||
text[0] = static_cast<char>(value & 0xff);
|
||||
text[1] = static_cast<char>((value >> 8) & 0xff);
|
||||
text[2] = static_cast<char>((value >> 16) & 0xff);
|
||||
text[3] = static_cast<char>((value >> 24) & 0xff);
|
||||
return text;
|
||||
}
|
||||
|
||||
bool MapNdiPixelFormat(NDIlib_FourCC_video_type_e fourCc, VideoIOPixelFormat& pixelFormat)
|
||||
{
|
||||
switch (fourCc)
|
||||
{
|
||||
case NDIlib_FourCC_video_type_BGRA:
|
||||
case NDIlib_FourCC_video_type_BGRX:
|
||||
pixelFormat = VideoIOPixelFormat::Bgra8;
|
||||
return true;
|
||||
case NDIlib_FourCC_video_type_UYVY:
|
||||
pixelFormat = VideoIOPixelFormat::Uyvy8;
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NdiInput::NdiInput(InputFrameMailbox& mailbox) :
|
||||
@@ -262,12 +236,12 @@ void NdiInput::HandleVideoFrame(void*, const void* frame)
|
||||
}
|
||||
|
||||
VideoIOPixelFormat pixelFormat = VideoIOPixelFormat::Bgra8;
|
||||
if (!MapNdiPixelFormat(videoFrame.FourCC, pixelFormat))
|
||||
if (!MapNdiFourCcToVideoIOPixelFormat(videoFrame.FourCC, pixelFormat))
|
||||
{
|
||||
mUnsupportedFrames.fetch_add(1, std::memory_order_relaxed);
|
||||
bool expected = false;
|
||||
if (mLoggedUnsupportedFrame.compare_exchange_strong(expected, true, std::memory_order_relaxed))
|
||||
TryLog(LogLevel::Warning, "ndi-input", "Unsupported NDI input frame format " + FourCcName(videoFrame.FourCC) + ".");
|
||||
TryLog(LogLevel::Warning, "ndi-input", std::string("Unsupported NDI input frame format ") + NdiFourCcName(videoFrame.FourCC) + ".");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
35
src/video/ndi/NdiInputFormat.cpp
Normal file
35
src/video/ndi/NdiInputFormat.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include "NdiInputFormat.h"
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
|
||||
namespace RenderCadenceCompositor
|
||||
{
|
||||
const char* NdiFourCcName(NDIlib_FourCC_video_type_e fourCc)
|
||||
{
|
||||
static thread_local std::array<char, 5> text = {};
|
||||
const auto value = static_cast<uint32_t>(fourCc);
|
||||
text[0] = static_cast<char>(value & 0xff);
|
||||
text[1] = static_cast<char>((value >> 8) & 0xff);
|
||||
text[2] = static_cast<char>((value >> 16) & 0xff);
|
||||
text[3] = static_cast<char>((value >> 24) & 0xff);
|
||||
text[4] = '\0';
|
||||
return text.data();
|
||||
}
|
||||
|
||||
bool MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_e fourCc, VideoIOPixelFormat& pixelFormat)
|
||||
{
|
||||
switch (fourCc)
|
||||
{
|
||||
case NDIlib_FourCC_video_type_BGRA:
|
||||
case NDIlib_FourCC_video_type_BGRX:
|
||||
pixelFormat = VideoIOPixelFormat::Bgra8;
|
||||
return true;
|
||||
case NDIlib_FourCC_video_type_UYVY:
|
||||
pixelFormat = VideoIOPixelFormat::Uyvy8;
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
src/video/ndi/NdiInputFormat.h
Normal file
11
src/video/ndi/NdiInputFormat.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "video/core/VideoIOFormat.h"
|
||||
|
||||
#include <Processing.NDI.Lib.h>
|
||||
|
||||
namespace RenderCadenceCompositor
|
||||
{
|
||||
const char* NdiFourCcName(NDIlib_FourCC_video_type_e fourCc);
|
||||
bool MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_e fourCc, VideoIOPixelFormat& pixelFormat);
|
||||
}
|
||||
@@ -136,6 +136,13 @@ add_video_shader_test(VideoIOFormatTests
|
||||
"${TEST_DIR}/VideoIOFormatTests.cpp"
|
||||
)
|
||||
|
||||
add_video_shader_test(NdiInputFormatTests
|
||||
"${SRC_DIR}/video/ndi/NdiInputFormat.cpp"
|
||||
${VIDEO_FORMAT_SOURCES}
|
||||
"${TEST_DIR}/NdiInputFormatTests.cpp"
|
||||
)
|
||||
target_include_directories(NdiInputFormatTests PRIVATE "${NDI_INCLUDE_DIR}")
|
||||
|
||||
add_video_shader_test(VideoPlayoutSchedulerTests
|
||||
"${SRC_DIR}/video/playout/VideoPlayoutScheduler.cpp"
|
||||
"${TEST_DIR}/VideoPlayoutSchedulerTests.cpp"
|
||||
|
||||
62
tests/NdiInputFormatTests.cpp
Normal file
62
tests/NdiInputFormatTests.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "video/ndi/NdiInputFormat.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
namespace
|
||||
{
|
||||
int gFailures = 0;
|
||||
|
||||
void Expect(bool condition, const std::string& message)
|
||||
{
|
||||
if (condition)
|
||||
return;
|
||||
|
||||
++gFailures;
|
||||
std::cerr << "FAILED: " << message << "\n";
|
||||
}
|
||||
|
||||
void TestNdiFourCcMapping()
|
||||
{
|
||||
using namespace RenderCadenceCompositor;
|
||||
|
||||
VideoIOPixelFormat format = VideoIOPixelFormat::Uyvy8;
|
||||
Expect(MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_BGRA, format), "BGRA maps successfully");
|
||||
Expect(format == VideoIOPixelFormat::Bgra8, "BGRA maps to Bgra8");
|
||||
|
||||
format = VideoIOPixelFormat::Uyvy8;
|
||||
Expect(MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_BGRX, format), "BGRX maps successfully");
|
||||
Expect(format == VideoIOPixelFormat::Bgra8, "BGRX maps to Bgra8");
|
||||
|
||||
format = VideoIOPixelFormat::Bgra8;
|
||||
Expect(MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_UYVY, format), "UYVY maps successfully");
|
||||
Expect(format == VideoIOPixelFormat::Uyvy8, "UYVY maps to Uyvy8");
|
||||
|
||||
format = VideoIOPixelFormat::Bgra8;
|
||||
Expect(!MapNdiFourCcToVideoIOPixelFormat(NDIlib_FourCC_video_type_RGBA, format), "RGBA is unsupported until conversion is implemented");
|
||||
Expect(format == VideoIOPixelFormat::Bgra8, "unsupported mapping leaves output untouched");
|
||||
}
|
||||
|
||||
void TestNdiFourCcNames()
|
||||
{
|
||||
using namespace RenderCadenceCompositor;
|
||||
|
||||
Expect(std::string(NdiFourCcName(NDIlib_FourCC_video_type_BGRA)) == "BGRA", "BGRA name is readable");
|
||||
Expect(std::string(NdiFourCcName(NDIlib_FourCC_video_type_UYVY)) == "UYVY", "UYVY name is readable");
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
TestNdiFourCcMapping();
|
||||
TestNdiFourCcNames();
|
||||
|
||||
if (gFailures != 0)
|
||||
{
|
||||
std::cerr << gFailures << " NdiInputFormat test failure(s).\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << "NdiInputFormat tests passed.\n";
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user