From 2b11411423ad282662b4b362ee0227c7766a5ce1 Mon Sep 17 00:00:00 2001 From: JohannesItten Date: Fri, 3 Jul 2026 10:01:39 +0300 Subject: [PATCH] fix: set p216_frame FourCC; scope audio_rate to has_audio branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ndiout: p216_frame.FourCC was zero-initialized — NDI needs it explicitly set to NDIlib_FourCC_video_type_P216 to send the correct format. All three nodes: audio_rate = {sample_rate, 1} was always declared even when has_audio is false (sample_rate = 0 in ndiout). Scoped into the has_audio block so the bad rate can never be passed to mxlGetCurrentIndex. Co-Authored-By: Claude Sonnet 4.6 --- nodes/ndiin/main.cpp | 7 +++++-- nodes/ndiout/main.cpp | 8 ++++++-- nodes/testpattern/main.cpp | 7 +++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/nodes/ndiin/main.cpp b/nodes/ndiin/main.cpp index efc2f74..4241d68 100644 --- a/nodes/ndiin/main.cpp +++ b/nodes/ndiin/main.cpp @@ -81,10 +81,13 @@ class NDIInNode : public dmf::NodeBase { // --- main loop --- const mxlRational video_rate = {fps_num, fps_den}; - const mxlRational audio_rate = {sample_rate, 1}; uint64_t video_index = mxlGetCurrentIndex(&video_rate); - uint64_t audio_index = has_audio ? mxlGetCurrentIndex(&audio_rate) : 0; + uint64_t audio_index = 0; + if (has_audio) { + const mxlRational audio_rate = {sample_rate, 1}; + audio_index = mxlGetCurrentIndex(&audio_rate); + } log("start video_index=%llu", video_index); std::vector latest_video(video_stride * height); diff --git a/nodes/ndiout/main.cpp b/nodes/ndiout/main.cpp index b1629be..b46b43e 100644 --- a/nodes/ndiout/main.cpp +++ b/nodes/ndiout/main.cpp @@ -106,6 +106,7 @@ class NDIOutNode : public dmf::NodeBase { NDIlib_video_frame_v2_t p216_frame{}; p216_frame.xres = width; p216_frame.yres = height; + p216_frame.FourCC = NDIlib_FourCC_video_type_P216; p216_frame.frame_rate_N = fps_num; p216_frame.frame_rate_D = fps_den; p216_frame.line_stride_in_bytes = width * static_cast(sizeof(uint16_t)); @@ -125,10 +126,13 @@ class NDIOutNode : public dmf::NodeBase { // --- main loop --- const mxlRational video_rate = {fps_num, fps_den}; - const mxlRational audio_rate = {sample_rate, 1}; uint64_t video_index = mxlGetCurrentIndex(&video_rate); - uint64_t audio_index = has_audio ? mxlGetCurrentIndex(&audio_rate) : 0; + uint64_t audio_index = 0; + if (has_audio) { + const mxlRational audio_rate = {sample_rate, 1}; + audio_index = mxlGetCurrentIndex(&audio_rate); + } uint64_t frame_count = 0; uint64_t invalid_count = 0; uint64_t late_count = 0; diff --git a/nodes/testpattern/main.cpp b/nodes/testpattern/main.cpp index 83f44b4..982d5f6 100644 --- a/nodes/testpattern/main.cpp +++ b/nodes/testpattern/main.cpp @@ -65,7 +65,6 @@ class TestPatternNode : public dmf::NodeBase { // --- main loop --- const mxlRational video_rate = {fps_num, fps_den}; - const mxlRational audio_rate = {sample_rate, 1}; const size_t samples_per_frame = static_cast(sample_rate) * static_cast(fps_den) / static_cast(fps_num); @@ -73,7 +72,11 @@ class TestPatternNode : public dmf::NodeBase { const float amplitude = static_cast(std::pow(10.0, -18.0 / 20.0)); uint64_t video_index = mxlGetCurrentIndex(&video_rate); - uint64_t audio_index = has_audio ? mxlGetCurrentIndex(&audio_rate) : 0; + uint64_t audio_index = 0; + if (has_audio) { + const mxlRational audio_rate = {sample_rate, 1}; + audio_index = mxlGetCurrentIndex(&audio_rate); + } log("start video_index=%llu", video_index); while (dmf::g_running.load(std::memory_order_relaxed)) {