浏览代码

aja: Static analysis bug fixes

* aja: Use inline const for header initializations

Avoids duplicating across compilation units. Detected by PVS Studio.

* aja: Avoid unnecessary type conversions

Detected by PVS Studio.

* aja: Remove duplicate assignments

Detected by PVS Studio.

* aja: Fix return value of aja_output_create

Detected by PVS Studio.

* aja: Remove unused variable

Detected by PVS Studio.

* aja: Fix compiler warning

* aja: Remove unreachable if branch in aja routing

* aja; Cleanup return in card manager

Co-authored-by: Colin Edwards <[email protected]>
Richard Stanway 3 年之前
父节点
当前提交
fad299f99f

+ 1 - 3
plugins/aja/aja-card-manager.cpp

@@ -181,15 +181,13 @@ bool CardEntry::ChannelReady(NTV2Channel chan, const std::string &owner) const
 {
 	const std::lock_guard<std::mutex> lock(mMutex);
 
-	bool found = false;
-
 	for (const auto &pwn : mChannelPwnz) {
 		if (pwn.second & (1 << static_cast<int32_t>(chan))) {
 			return pwn.first == owner;
 		}
 	}
 
-	return !found;
+	return true;
 }
 
 bool CardEntry::AcquireChannel(NTV2Channel chan, NTV2Mode mode,

+ 3 - 5
plugins/aja/aja-output.cpp

@@ -237,7 +237,6 @@ void AJAOutput::QueueVideoFrame(struct video_data *frame, size_t size)
 	vf.frame = *frame;
 	vf.frameNum = mVideoWriteFrames;
 	vf.size = size;
-	vf.frame = *frame;
 
 	if (mVideoQueue->size() > kVideoQueueMaxSize) {
 		auto &front = mVideoQueue->front();
@@ -259,7 +258,6 @@ void AJAOutput::QueueAudioFrames(struct audio_data *frames, size_t size)
 	af.frames = *frames;
 	af.offset = 0;
 	af.size = size;
-	af.frames = *frames;
 
 	if (mAudioQueue->size() > kAudioQueueMaxSize) {
 		auto &front = mAudioQueue->front();
@@ -374,8 +372,8 @@ void AJAOutput::DMAAudioFromQueue(NTV2AudioSystem audioSys)
 				     "AJAOutput::DMAAudioFromQueue: Drop %d audio samples",
 				     adjustSamples);
 			} else {
-				uint32_t samples =
-					sizeLeft / (kDefaultAudioSampleSize *
+				uint32_t samples = (uint32_t)sizeLeft /
+						   (kDefaultAudioSampleSize *
 						    kDefaultAudioChannels);
 				af.offset += sizeLeft;
 				sizeLeft = 0;
@@ -915,7 +913,7 @@ static void *aja_output_create(obs_data_t *settings, obs_output_t *output)
 	const char *cardID = obs_data_get_string(settings, kUIPropDevice.id);
 	if (!cardID) {
 		blog(LOG_ERROR, "aja_output_create: Card ID is null!");
-		return false;
+		return nullptr;
 	}
 	const char *outputID =
 		obs_data_get_string(settings, kUIPropAJAOutputID.id);

+ 1 - 9
plugins/aja/aja-routing.cpp

@@ -91,7 +91,6 @@ bool Routing::ParseRouteString(const std::string &route,
 	 * the route strings currently only come from a known set.
 	 */
 	NTV2StringList lines;
-	NTV2StringList tokens;
 
 	lines = aja::split(route_strip, ';');
 	if (lines.empty())
@@ -338,7 +337,6 @@ void Routing::StartSourceAudio(const SourceProps &props, CNTV2Card *card)
 	// Fix for AJA NTV2 internal bug #11467
 	ULWord magicAudioBits = 0;
 	if (NTV2_INPUT_SOURCE_IS_HDMI(inputSrc)) {
-		magicAudioBits = 0x00100000;
 		switch (inputSrc) {
 		default:
 		case NTV2_INPUTSOURCE_HDMI1:
@@ -407,13 +405,7 @@ SDIWireFormat GuessSDIWireFormat(NTV2VideoFormat vf, IOSelection io,
 			if (aja::IsSDIFourWireIOSelection(io)) {
 				swf = SDIWireFormat::UHD4K_ST292_Quad_1_5_Squares;
 			} else if (aja::IsSDITwoWireIOSelection(io)) {
-				if (t4k == SDI4KTransport::Squares) {
-					swf = SDIWireFormat::
-						UHD4K_ST292_Dual_1_5_Squares;
-				} else {
-					swf = SDIWireFormat::
-						UHD4K_ST425_Dual_3Gb_2SI;
-				}
+				swf = SDIWireFormat::UHD4K_ST292_Dual_1_5_Squares;
 			}
 		} else if (t4k == SDI4KTransport::TwoSampleInterleave) {
 			if (aja::IsSDIOneWireIOSelection(io)) {

+ 1 - 1
plugins/aja/aja-routing.hpp

@@ -50,7 +50,7 @@ struct RoutingConfig {
  */
 using VPIDSpec = std::pair<RasterDefinition, VPIDStandard>;
 
-static const std::map<VPIDSpec, SDIWireFormat> kSDIWireFormats = {
+static inline const std::map<VPIDSpec, SDIWireFormat> kSDIWireFormats = {
 	{{RasterDefinition::SD, VPIDStandard_483_576}, SDIWireFormat::SD_ST352},
 	{{RasterDefinition::HD, VPIDStandard_720},
 	 SDIWireFormat::HD_720p_ST292},

+ 2 - 3
plugins/aja/aja-source.cpp

@@ -919,8 +919,7 @@ static void aja_source_update(void *data, obs_data_t *settings)
 		auto prevCardEntry = cardManager.GetCardEntry(currentCardID);
 		if (prevCardEntry) {
 			const std::string &ioSelectStr =
-				aja::IOSelectionToString(curr_props.ioSelect)
-					.c_str();
+				aja::IOSelectionToString(curr_props.ioSelect);
 			if (!prevCardEntry->ReleaseInputSelection(
 				    curr_props.ioSelect, curr_props.deviceID,
 				    ajaSource->GetName())) {
@@ -985,7 +984,7 @@ static void aja_source_update(void *data, obs_data_t *settings)
 	// Release Channels if IOSelection changes
 	if (want_props.ioSelect != curr_props.ioSelect) {
 		const std::string &ioSelectStr =
-			aja::IOSelectionToString(curr_props.ioSelect).c_str();
+			aja::IOSelectionToString(curr_props.ioSelect);
 		if (!cardEntry->ReleaseInputSelection(curr_props.ioSelect,
 						      curr_props.deviceID,
 						      ajaSource->GetName())) {

+ 18 - 18
plugins/aja/routing/hdmi_rgb_capture.h

@@ -2,21 +2,21 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<HDMIWireFormat, RoutingConfig> kHDMIRGBCaptureConfigs = {
-	{HDMIWireFormat::HD_RGB_LFR,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "hdmi[{ch1}][0]->fb[{ch1}][0];",
-	 }}};
+static inline const std::map<HDMIWireFormat, RoutingConfig>
+	kHDMIRGBCaptureConfigs = {{HDMIWireFormat::HD_RGB_LFR,
+				   {
+					   NTV2_MODE_CAPTURE,
+					   1,
+					   1,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   "hdmi[{ch1}][0]->fb[{ch1}][0];",
+				   }}};

+ 25 - 24
plugins/aja/routing/hdmi_rgb_display.h

@@ -2,27 +2,28 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<HDMIWireFormat, RoutingConfig> kHDMIRGBDisplayConfigs = {
-	{HDMIWireFormat::HD_RGB_LFR,
-	 {NTV2_MODE_DISPLAY, 1, 1, true, false, false, false, false, false,
-	  false, false, false, false, "fb[{ch1}][0]->hdmi[0][0];"}},
-	{HDMIWireFormat::TTAP_PRO,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];"
-		 "fb[{ch1}][2]->hdmi[{ch1}][0];",
-	 }}};
+static inline const std::map<HDMIWireFormat, RoutingConfig>
+	kHDMIRGBDisplayConfigs = {{HDMIWireFormat::HD_RGB_LFR,
+				   {NTV2_MODE_DISPLAY, 1, 1, true, false, false,
+				    false, false, false, false, false, false,
+				    false, "fb[{ch1}][0]->hdmi[0][0];"}},
+				  {HDMIWireFormat::TTAP_PRO,
+				   {
+					   NTV2_MODE_DISPLAY,
+					   1,
+					   1,
+					   true,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   false,
+					   "fb[{ch1}][2]->dlo[{ch1}][0];"
+					   "dlo[{ch1}][0]->sdi[{ch1}][0];"
+					   "dlo[{ch1}][1]->sdi[{ch1}][1];"
+					   "fb[{ch1}][2]->hdmi[{ch1}][0];",
+				   }}};

+ 43 - 42
plugins/aja/routing/hdmi_ycbcr_capture.h

@@ -2,46 +2,47 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<HDMIWireFormat, RoutingConfig> kHDMIYCbCrCaptureConfigs = {
-	{HDMIWireFormat::HD_YCBCR_LFR,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "hdmi[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{HDMIWireFormat::UHD_4K_YCBCR_LFR,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 2,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "hdmi[0][0]->tsi[{ch1}][0];"
-		 "hdmi[0][1]->tsi[{ch1}][1];"
-		 "hdmi[0][2]->tsi[{ch2}][0];"
-		 "hdmi[0][3]->tsi[{ch2}][1];"
-		 "tsi[{ch1}][0]->fb[{ch1}][0];"
-		 "tsi[{ch1}][1]->fb[{ch1}][1];"
-		 "tsi[{ch2}][0]->fb[{ch2}][0];"
-		 "tsi[{ch2}][1]->fb[{ch2}][1];",
-	 }},
+static inline const std::map<HDMIWireFormat, RoutingConfig>
+	kHDMIYCbCrCaptureConfigs = {
+		{HDMIWireFormat::HD_YCBCR_LFR,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "hdmi[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{HDMIWireFormat::UHD_4K_YCBCR_LFR,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 2,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "hdmi[0][0]->tsi[{ch1}][0];"
+			 "hdmi[0][1]->tsi[{ch1}][1];"
+			 "hdmi[0][2]->tsi[{ch2}][0];"
+			 "hdmi[0][3]->tsi[{ch2}][1];"
+			 "tsi[{ch1}][0]->fb[{ch1}][0];"
+			 "tsi[{ch1}][1]->fb[{ch1}][1];"
+			 "tsi[{ch2}][0]->fb[{ch2}][0];"
+			 "tsi[{ch2}][1]->fb[{ch2}][1];",
+		 }},
 };

+ 60 - 60
plugins/aja/routing/hdmi_ycbcr_display.h

@@ -2,63 +2,63 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<HDMIWireFormat, RoutingConfig> kHDMIYCbCrDisplayConfigs = {
-	{HDMIWireFormat::HD_YCBCR_LFR,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "fb[{ch1}][0]->hdmi[0][0];",
-	 }},
-	{HDMIWireFormat::UHD_4K_YCBCR_LFR,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 2,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "fb[{ch1}][0]->tsi[{ch1}][0];"
-		 "fb[{ch1}][1]->tsi[{ch1}][1];"
-		 "fb[{ch2}][0]->tsi[{ch2}][0];"
-		 "fb[{ch2}][1]->tsi[{ch2}][1];"
-		 "tsi[{ch1}][0]->hdmi[0][0];"
-		 "tsi[{ch1}][1]->hdmi[0][1];"
-		 "tsi[{ch2}][0]->hdmi[0][2];"
-		 "tsi[{ch2}][1]->hdmi[0][3];",
-	 }},
-	{HDMIWireFormat::TTAP_PRO,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "fb[{ch1}][0]->sdi[{ch1}][0];"
-		 "fb[{ch1}][0]->hdmi[{ch1}][0];",
-	 }}};
+static inline const std::map<HDMIWireFormat, RoutingConfig>
+	kHDMIYCbCrDisplayConfigs = {{HDMIWireFormat::HD_YCBCR_LFR,
+				     {
+					     NTV2_MODE_DISPLAY,
+					     1,
+					     1,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     "fb[{ch1}][0]->hdmi[0][0];",
+				     }},
+				    {HDMIWireFormat::UHD_4K_YCBCR_LFR,
+				     {
+					     NTV2_MODE_DISPLAY,
+					     1,
+					     2,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     true,
+					     "fb[{ch1}][0]->tsi[{ch1}][0];"
+					     "fb[{ch1}][1]->tsi[{ch1}][1];"
+					     "fb[{ch2}][0]->tsi[{ch2}][0];"
+					     "fb[{ch2}][1]->tsi[{ch2}][1];"
+					     "tsi[{ch1}][0]->hdmi[0][0];"
+					     "tsi[{ch1}][1]->hdmi[0][1];"
+					     "tsi[{ch2}][0]->hdmi[0][2];"
+					     "tsi[{ch2}][1]->hdmi[0][3];",
+				     }},
+				    {HDMIWireFormat::TTAP_PRO,
+				     {
+					     NTV2_MODE_DISPLAY,
+					     1,
+					     1,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     false,
+					     "fb[{ch1}][0]->sdi[{ch1}][0];"
+					     "fb[{ch1}][0]->hdmi[{ch1}][0];",
+				     }}};

+ 452 - 451
plugins/aja/routing/sdi_rgb_capture.h

@@ -2,465 +2,466 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<SDIWireFormat, RoutingConfig> kSDIRGBCaptureConfigs = {
-	{
-		SDIWireFormat::SD_ST352,
+static inline const std::map<SDIWireFormat, RoutingConfig>
+	kSDIRGBCaptureConfigs = {
 		{
-			NTV2_MODE_CAPTURE, // i/o mode
-			1,                 // num wires
-			1,                 // num framestores
-			false,             // enable 3G output?
-			false,             // enable 6G output?
-			false,             // enable 12G output?
-			false,             // convert 3Gb -> 3Ga input?
-			false,             // convert 3Ga -> 3Gb output?
-			false,             // convert RGB 3Ga output?
-			false,             // enable 3Gb output?
-			false,             // enable 4K Square Division?
-			false,             // enable 8K Square Division?
-			false,             // enable two-sample-interleave?
-			"",
+			SDIWireFormat::SD_ST352,
+			{
+				NTV2_MODE_CAPTURE, // i/o mode
+				1,                 // num wires
+				1,                 // num framestores
+				false,             // enable 3G output?
+				false,             // enable 6G output?
+				false,             // enable 12G output?
+				false,             // convert 3Gb -> 3Ga input?
+				false,             // convert 3Ga -> 3Gb output?
+				false,             // convert RGB 3Ga output?
+				false,             // enable 3Gb output?
+				false,             // enable 4K Square Division?
+				false,             // enable 8K Square Division?
+				false, // enable two-sample-interleave?
+				"",
+			},
 		},
-	},
-	{SDIWireFormat::HD_720p_ST292,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080_ST292,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080_ST372_Dual,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch2}][0]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_720p_ST425_3Ga,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Ga,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Gb_DL,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_720p_ST425_3Gb,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Gb,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "dli[{ch1}][0]->fb[{ch1}][0];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_Dual_3Ga,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_Dual_3Gb,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST292_Quad_1_5_Squares,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->fb[{ch1}][0];"
-		 "sdi[{ch2}][0]->fb[{ch2}][0];"
-		 "sdi[{ch3}][0]->fb[{ch3}][0];"
-		 "sdi[{ch4}][0]->fb[{ch4}][0];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Ga_Squares,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 // Capture
-		 "sdi[{ch1}][0]->fb[{ch1}][0];"
-		 "sdi[{ch2}][0]->fb[{ch2}][0];"
-		 "sdi[{ch3}][0]->fb[{ch3}][0];"
-		 "sdi[{ch4}][0]->fb[{ch4}][0];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Gb_Squares,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
+		{SDIWireFormat::HD_720p_ST292,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080_ST292,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080_ST372_Dual,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch2}][0]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_720p_ST425_3Ga,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Ga,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Gb_DL,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_720p_ST425_3Gb,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Gb,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][0];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_Dual_3Ga,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_Dual_3Gb,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST292_Quad_1_5_Squares,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->fb[{ch1}][0];"
+			 "sdi[{ch2}][0]->fb[{ch2}][0];"
+			 "sdi[{ch3}][0]->fb[{ch3}][0];"
+			 "sdi[{ch4}][0]->fb[{ch4}][0];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Ga_Squares,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 // Capture
+			 "sdi[{ch1}][0]->fb[{ch1}][0];"
+			 "sdi[{ch2}][0]->fb[{ch2}][0];"
+			 "sdi[{ch3}][0]->fb[{ch3}][0];"
+			 "sdi[{ch4}][0]->fb[{ch4}][0];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Gb_Squares,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
 
-		 "sdi[{ch2}][0]->dli[{ch2}][0];"
-		 "sdi[{ch2}][1]->dli[{ch2}][1];"
+			 "sdi[{ch2}][0]->dli[{ch2}][0];"
+			 "sdi[{ch2}][1]->dli[{ch2}][1];"
 
-		 "sdi[{ch3}][0]->dli[{ch3}][0];"
-		 "sdi[{ch3}][1]->dli[{ch3}][1];"
+			 "sdi[{ch3}][0]->dli[{ch3}][0];"
+			 "sdi[{ch3}][1]->dli[{ch3}][1];"
 
-		 "sdi[{ch4}][0]->dli[{ch4}][0];"
-		 "sdi[{ch4}][1]->dli[{ch4}][1];"
+			 "sdi[{ch4}][0]->dli[{ch4}][0];"
+			 "sdi[{ch4}][1]->dli[{ch4}][1];"
 
-		 "dli[{ch1}][0]->fb[{ch1}][2];"
-		 "dli[{ch2}][0]->fb[{ch2}][2];"
-		 "dli[{ch3}][0]->fb[{ch3}][2];"
-		 "dli[{ch4}][0]->fb[{ch4}][2];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Dual_3Gb_2SI,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Ga_2SI,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 // SDI 1-4 -> Dual-Link 1-4
-		 // -> TSI Mux 1-2 -> Framestore 1-2
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "sdi[{ch2}][0]->dli[{ch2}][0];"
-		 "sdi[{ch2}][1]->dli[{ch2}][1];"
-		 "sdi[{ch3}][0]->dli[{ch3}][0];"
-		 "sdi[{ch3}][1]->dli[{ch3}][1];"
-		 "sdi[{ch4}][0]->dli[{ch4}][0];"
-		 "sdi[{ch4}][1]->dli[{ch4}][1];"
+			 "dli[{ch1}][0]->fb[{ch1}][2];"
+			 "dli[{ch2}][0]->fb[{ch2}][2];"
+			 "dli[{ch3}][0]->fb[{ch3}][2];"
+			 "dli[{ch4}][0]->fb[{ch4}][2];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Dual_3Gb_2SI,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Ga_2SI,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 // SDI 1-4 -> Dual-Link 1-4
+			 // -> TSI Mux 1-2 -> Framestore 1-2
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "sdi[{ch2}][0]->dli[{ch2}][0];"
+			 "sdi[{ch2}][1]->dli[{ch2}][1];"
+			 "sdi[{ch3}][0]->dli[{ch3}][0];"
+			 "sdi[{ch3}][1]->dli[{ch3}][1];"
+			 "sdi[{ch4}][0]->dli[{ch4}][0];"
+			 "sdi[{ch4}][1]->dli[{ch4}][1];"
 
-		 "dli[{ch1}][0]->tsi[{ch1}][0];"
-		 "dli[{ch2}][0]->tsi[{ch1}][1];"
-		 "dli[{ch3}][0]->tsi[{ch2}][0];"
-		 "dli[{ch4}][0]->tsi[{ch2}][1];"
+			 "dli[{ch1}][0]->tsi[{ch1}][0];"
+			 "dli[{ch2}][0]->tsi[{ch1}][1];"
+			 "dli[{ch3}][0]->tsi[{ch2}][0];"
+			 "dli[{ch4}][0]->tsi[{ch2}][1];"
 
-		 "tsi[{ch1}][0]->fb[{ch1}][0];"
-		 "tsi[{ch1}][1]->fb[{ch1}][1];"
-		 "tsi[{ch2}][0]->fb[{ch2}][0];"
-		 "tsi[{ch2}][1]->fb[{ch2}][1];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Gb_2SI,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 // SDI 1-4 -> Dual-Link 1-4
-		 // -> TSI Mux 1-2 -> Framestore 1-2
-		 "sdi[{ch1}][0]->dli[{ch1}][0];"
-		 "sdi[{ch1}][1]->dli[{ch1}][1];"
-		 "sdi[{ch2}][0]->dli[{ch2}][0];"
-		 "sdi[{ch2}][1]->dli[{ch2}][1];"
-		 "sdi[{ch3}][0]->dli[{ch3}][0];"
-		 "sdi[{ch3}][1]->dli[{ch3}][1];"
-		 "sdi[{ch4}][0]->dli[{ch4}][0];"
-		 "sdi[{ch4}][1]->dli[{ch4}][1];"
+			 "tsi[{ch1}][0]->fb[{ch1}][0];"
+			 "tsi[{ch1}][1]->fb[{ch1}][1];"
+			 "tsi[{ch2}][0]->fb[{ch2}][0];"
+			 "tsi[{ch2}][1]->fb[{ch2}][1];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Gb_2SI,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 // SDI 1-4 -> Dual-Link 1-4
+			 // -> TSI Mux 1-2 -> Framestore 1-2
+			 "sdi[{ch1}][0]->dli[{ch1}][0];"
+			 "sdi[{ch1}][1]->dli[{ch1}][1];"
+			 "sdi[{ch2}][0]->dli[{ch2}][0];"
+			 "sdi[{ch2}][1]->dli[{ch2}][1];"
+			 "sdi[{ch3}][0]->dli[{ch3}][0];"
+			 "sdi[{ch3}][1]->dli[{ch3}][1];"
+			 "sdi[{ch4}][0]->dli[{ch4}][0];"
+			 "sdi[{ch4}][1]->dli[{ch4}][1];"
 
-		 "dli[{ch1}][0]->tsi[{ch1}][0];"
-		 "dli[{ch2}][0]->tsi[{ch1}][1];"
-		 "dli[{ch3}][0]->tsi[{ch2}][0];"
-		 "dli[{ch4}][0]->tsi[{ch2}][1];"
+			 "dli[{ch1}][0]->tsi[{ch1}][0];"
+			 "dli[{ch2}][0]->tsi[{ch1}][1];"
+			 "dli[{ch3}][0]->tsi[{ch2}][0];"
+			 "dli[{ch4}][0]->tsi[{ch2}][1];"
 
-		 "tsi[{ch1}][0]->fb[{ch1}][0];"
-		 "tsi[{ch1}][1]->fb[{ch1}][1];"
-		 "tsi[{ch2}][0]->fb[{ch2}][0];"
-		 "tsi[{ch2}][1]->fb[{ch2}][1];",
-	 }},
-	{SDIWireFormat::UHD4K_ST2018_6G_Squares_2SI,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST2018_12G_Squares_2SI,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 1,
-		 1,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_Dual_12G,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_RGB_Dual_12G,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 2,
-		 2,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_Quad_12G,
-	 {
-		 NTV2_MODE_CAPTURE,
-		 4,
-		 4,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
+			 "tsi[{ch1}][0]->fb[{ch1}][0];"
+			 "tsi[{ch1}][1]->fb[{ch1}][1];"
+			 "tsi[{ch2}][0]->fb[{ch2}][0];"
+			 "tsi[{ch2}][1]->fb[{ch2}][1];",
+		 }},
+		{SDIWireFormat::UHD4K_ST2018_6G_Squares_2SI,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST2018_12G_Squares_2SI,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 1,
+			 1,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_Dual_12G,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_RGB_Dual_12G,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 2,
+			 2,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_Quad_12G,
+		 {
+			 NTV2_MODE_CAPTURE,
+			 4,
+			 4,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
 };

+ 452 - 451
plugins/aja/routing/sdi_rgb_display.h

@@ -2,467 +2,468 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<SDIWireFormat, RoutingConfig> kSDIRGBDisplayConfigs = {
-	{
-		SDIWireFormat::SD_ST352,
+static inline const std::map<SDIWireFormat, RoutingConfig>
+	kSDIRGBDisplayConfigs = {
 		{
-			NTV2_MODE_DISPLAY,
-			1,     // num wires
-			1,     // num framestores
-			false, // enable 3G output?
-			false, // enable 6G output?
-			false, // enable 12G output?
-			false, // convert 3Gb -> 3Ga input?
-			false, // convert 3Ga -> 3Gb output?
-			false, // convert RGB 3Ga output?
-			false, // enable 3Gb output?
-			false, // enable 4K Square Division?
-			false, // enable 8K Square Division?
-			false, // enable two-sample-interleave?
-			"",    // RGB Output Route
+			SDIWireFormat::SD_ST352,
+			{
+				NTV2_MODE_DISPLAY,
+				1,     // num wires
+				1,     // num framestores
+				false, // enable 3G output?
+				false, // enable 6G output?
+				false, // enable 12G output?
+				false, // convert 3Gb -> 3Ga input?
+				false, // convert 3Ga -> 3Gb output?
+				false, // convert RGB 3Ga output?
+				false, // enable 3Gb output?
+				false, // enable 4K Square Division?
+				false, // enable 8K Square Division?
+				false, // enable two-sample-interleave?
+				"",    // RGB Output Route
+			},
 		},
-	},
-	{SDIWireFormat::HD_720p_ST292,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}[0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080_ST292,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}[0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080_ST372_Dual,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 1,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Playout
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}[0];"
-		 "dlo[{ch1}][1]->sdi[{ch2}][0];",
-	 }},
-	{SDIWireFormat::HD_720p_ST425_3Ga,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Output
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Ga,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Output
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Gb_DL,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Output
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_720p_ST425_3Gb,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Output
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_3Gb,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 // Output
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_Dual_3Ga,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "",
-	 }},
-	{SDIWireFormat::HD_1080p_ST425_Dual_3Gb,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST292_Quad_1_5_Squares,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 // Playout
-		 "fb[{ch1}][0]->sdi[{ch1}][0];"
-		 "fb[{ch2}][0]->sdi[{ch2}][0];"
-		 "fb[{ch3}][0]->sdi[{ch3}][0];"
-		 "fb[{ch4}][0]->sdi[{ch4}][0];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Ga_Squares,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 // Playout
-		 "fb[{ch1}][0]->sdi[{ch1}][0];"
-		 "fb[{ch2}][0]->sdi[{ch2}][0];"
-		 "fb[{ch3}][0]->sdi[{ch3}][0];"
-		 "fb[{ch4}][0]->sdi[{ch4}][0];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Gb_Squares,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 // Framestores 1-4 -> Dual-Link 1-4 -> SDI 1-4
-		 "fb[{ch1}][2]->dlo[{ch1}][0];"
-		 "fb[{ch2}][2]->dlo[{ch2}][0];"
-		 "fb[{ch3}][2]->dlo[{ch3}][0];"
-		 "fb[{ch4}][2]->dlo[{ch4}][0];"
+		{SDIWireFormat::HD_720p_ST292,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}[0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080_ST292,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}[0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080_ST372_Dual,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 1,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Playout
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}[0];"
+			 "dlo[{ch1}][1]->sdi[{ch2}][0];",
+		 }},
+		{SDIWireFormat::HD_720p_ST425_3Ga,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Output
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Ga,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Output
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Gb_DL,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Output
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_720p_ST425_3Gb,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Output
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_3Gb,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 // Output
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_Dual_3Ga,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "",
+		 }},
+		{SDIWireFormat::HD_1080p_ST425_Dual_3Gb,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST292_Quad_1_5_Squares,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 // Playout
+			 "fb[{ch1}][0]->sdi[{ch1}][0];"
+			 "fb[{ch2}][0]->sdi[{ch2}][0];"
+			 "fb[{ch3}][0]->sdi[{ch3}][0];"
+			 "fb[{ch4}][0]->sdi[{ch4}][0];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Ga_Squares,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 // Playout
+			 "fb[{ch1}][0]->sdi[{ch1}][0];"
+			 "fb[{ch2}][0]->sdi[{ch2}][0];"
+			 "fb[{ch3}][0]->sdi[{ch3}][0];"
+			 "fb[{ch4}][0]->sdi[{ch4}][0];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Gb_Squares,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 // Framestores 1-4 -> Dual-Link 1-4 -> SDI 1-4
+			 "fb[{ch1}][2]->dlo[{ch1}][0];"
+			 "fb[{ch2}][2]->dlo[{ch2}][0];"
+			 "fb[{ch3}][2]->dlo[{ch3}][0];"
+			 "fb[{ch4}][2]->dlo[{ch4}][0];"
 
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];"
 
-		 "dlo[{ch2}][0]->sdi[{ch2}][0];"
-		 "dlo[{ch2}][1]->sdi[{ch2}][1];"
+			 "dlo[{ch2}][0]->sdi[{ch2}][0];"
+			 "dlo[{ch2}][1]->sdi[{ch2}][1];"
 
-		 "dlo[{ch3}][0]->sdi[{ch3}][0];"
-		 "dlo[{ch3}][1]->sdi[{ch3}][1];"
+			 "dlo[{ch3}][0]->sdi[{ch3}][0];"
+			 "dlo[{ch3}][1]->sdi[{ch3}][1];"
 
-		 "dlo[{ch4}][0]->sdi[{ch4}][0];"
-		 "dlo[{ch4}][1]->sdi[{ch4}][1];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Dual_3Gb_2SI,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Ga_2SI,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 // Framestores 1-2 -> TSI Mux 1-2
-		 // -> Dual-Link 1-4 -> SDI 1-4
-		 "fb[{ch1}][2]->tsi[{ch1}][0];"
-		 "fb[{ch1}][3]->tsi[{ch1}][1];"
+			 "dlo[{ch4}][0]->sdi[{ch4}][0];"
+			 "dlo[{ch4}][1]->sdi[{ch4}][1];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Dual_3Gb_2SI,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Ga_2SI,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 // Framestores 1-2 -> TSI Mux 1-2
+			 // -> Dual-Link 1-4 -> SDI 1-4
+			 "fb[{ch1}][2]->tsi[{ch1}][0];"
+			 "fb[{ch1}][3]->tsi[{ch1}][1];"
 
-		 "fb[{ch2}][2]->tsi[{ch2}][0];"
-		 "fb[{ch2}][3]->tsi[{ch2}][1];"
+			 "fb[{ch2}][2]->tsi[{ch2}][0];"
+			 "fb[{ch2}][3]->tsi[{ch2}][1];"
 
-		 "tsi[{ch1}][2]->dlo[{ch1}][0];"
-		 "tsi[{ch1}][3]->dlo[{ch2}][0];"
-		 "tsi[{ch2}][2]->dlo[{ch3}][0];"
-		 "tsi[{ch2}][3]->dlo[{ch4}][0];"
+			 "tsi[{ch1}][2]->dlo[{ch1}][0];"
+			 "tsi[{ch1}][3]->dlo[{ch2}][0];"
+			 "tsi[{ch2}][2]->dlo[{ch3}][0];"
+			 "tsi[{ch2}][3]->dlo[{ch4}][0];"
 
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];"
-		 "dlo[{ch2}][0]->sdi[{ch2}][0];"
-		 "dlo[{ch2}][1]->sdi[{ch2}][1];"
-		 "dlo[{ch3}][0]->sdi[{ch3}][0];"
-		 "dlo[{ch3}][1]->sdi[{ch3}][1];"
-		 "dlo[{ch4}][0]->sdi[{ch4}][0];"
-		 "dlo[{ch4}][1]->sdi[{ch4}][1];",
-	 }},
-	{SDIWireFormat::UHD4K_ST425_Quad_3Gb_2SI,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 // Framestores 1-2 -> TSI Mux 1-2
-		 // -> Dual-Link 1-4 -> SDI 1-4
-		 "fb[{ch1}][2]->tsi[{ch1}][0];"
-		 "fb[{ch1}][3]->tsi[{ch1}][1];"
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];"
+			 "dlo[{ch2}][0]->sdi[{ch2}][0];"
+			 "dlo[{ch2}][1]->sdi[{ch2}][1];"
+			 "dlo[{ch3}][0]->sdi[{ch3}][0];"
+			 "dlo[{ch3}][1]->sdi[{ch3}][1];"
+			 "dlo[{ch4}][0]->sdi[{ch4}][0];"
+			 "dlo[{ch4}][1]->sdi[{ch4}][1];",
+		 }},
+		{SDIWireFormat::UHD4K_ST425_Quad_3Gb_2SI,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 // Framestores 1-2 -> TSI Mux 1-2
+			 // -> Dual-Link 1-4 -> SDI 1-4
+			 "fb[{ch1}][2]->tsi[{ch1}][0];"
+			 "fb[{ch1}][3]->tsi[{ch1}][1];"
 
-		 "fb[{ch2}][2]->tsi[{ch2}][0];"
-		 "fb[{ch2}][3]->tsi[{ch2}][1];"
+			 "fb[{ch2}][2]->tsi[{ch2}][0];"
+			 "fb[{ch2}][3]->tsi[{ch2}][1];"
 
-		 "tsi[{ch1}][2]->dlo[{ch1}][0];"
-		 "tsi[{ch1}][3]->dlo[{ch2}][0];"
-		 "tsi[{ch2}][2]->dlo[{ch3}][0];"
-		 "tsi[{ch2}][3]->dlo[{ch4}][0];"
+			 "tsi[{ch1}][2]->dlo[{ch1}][0];"
+			 "tsi[{ch1}][3]->dlo[{ch2}][0];"
+			 "tsi[{ch2}][2]->dlo[{ch3}][0];"
+			 "tsi[{ch2}][3]->dlo[{ch4}][0];"
 
-		 "dlo[{ch1}][0]->sdi[{ch1}][0];"
-		 "dlo[{ch1}][1]->sdi[{ch1}][1];"
-		 "dlo[{ch2}][0]->sdi[{ch2}][0];"
-		 "dlo[{ch2}][1]->sdi[{ch2}][1];"
-		 "dlo[{ch3}][0]->sdi[{ch3}][0];"
-		 "dlo[{ch3}][1]->sdi[{ch3}][1];"
-		 "dlo[{ch4}][0]->sdi[{ch4}][0];"
-		 "dlo[{ch4}][1]->sdi[{ch4}][1];",
-	 }},
-	{SDIWireFormat::UHD4K_ST2018_6G_Squares_2SI,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD4K_ST2018_12G_Squares_2SI,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 1,
-		 1,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_Dual_12G,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_RGB_Dual_12G,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 2,
-		 2,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
-	{SDIWireFormat::UHD28K_ST2082_Quad_12G,
-	 {
-		 NTV2_MODE_DISPLAY,
-		 4,
-		 4,
-		 false,
-		 false,
-		 true,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 false,
-		 true,
-		 "",
-	 }},
+			 "dlo[{ch1}][0]->sdi[{ch1}][0];"
+			 "dlo[{ch1}][1]->sdi[{ch1}][1];"
+			 "dlo[{ch2}][0]->sdi[{ch2}][0];"
+			 "dlo[{ch2}][1]->sdi[{ch2}][1];"
+			 "dlo[{ch3}][0]->sdi[{ch3}][0];"
+			 "dlo[{ch3}][1]->sdi[{ch3}][1];"
+			 "dlo[{ch4}][0]->sdi[{ch4}][0];"
+			 "dlo[{ch4}][1]->sdi[{ch4}][1];",
+		 }},
+		{SDIWireFormat::UHD4K_ST2018_6G_Squares_2SI,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD4K_ST2018_12G_Squares_2SI,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 1,
+			 1,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_Dual_12G,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_RGB_Dual_12G,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 2,
+			 2,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
+		{SDIWireFormat::UHD28K_ST2082_Quad_12G,
+		 {
+			 NTV2_MODE_DISPLAY,
+			 4,
+			 4,
+			 false,
+			 false,
+			 true,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 false,
+			 true,
+			 "",
+		 }},
 };

+ 1 - 1
plugins/aja/routing/sdi_ycbcr_capture.h

@@ -2,7 +2,7 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<SDIWireFormat, RoutingConfig> kSDIYCbCrCaptureConfigs = {
+static inline const std::map<SDIWireFormat, RoutingConfig> kSDIYCbCrCaptureConfigs = {
 	{
 		SDIWireFormat::SD_ST352,
 		{

+ 1 - 1
plugins/aja/routing/sdi_ycbcr_display.h

@@ -2,7 +2,7 @@
 
 #include "../aja-routing.hpp"
 
-static const std::map<SDIWireFormat, RoutingConfig> kSDIYCbCrDisplayConfigs = {
+static inline const std::map<SDIWireFormat, RoutingConfig> kSDIYCbCrDisplayConfigs = {
 	{
 		SDIWireFormat::SD_ST352,
 		{