diff --git a/cmake/defaults/CYCOMMON.cmake b/cmake/defaults/CYCOMMON.cmake index 472db3ac2..948ec855d 100644 --- a/cmake/defaults/CYCOMMON.cmake +++ b/cmake/defaults/CYCOMMON.cmake @@ -1,9 +1,9 @@ # Common build dependencies for all CY20XX platforms aja https://github.com/aja-video/libajantv2 SET(RV_DEPS_AJA_VERSION - "17.1.0" + "17.6.0.hotfix1" ) SET(RV_DEPS_AJA_DOWNLOAD_HASH - "b9d189f77e18dbdff7c39a339b1a5dd4" + "dba447ddd1b0ee84cee8441c0adba06a" ) # atomic_ops https://github.com/ivmai/libatomic_ops diff --git a/cmake/dependencies/aja.cmake b/cmake/dependencies/aja.cmake index e45d1cb46..b47ebb63a 100644 --- a/cmake/dependencies/aja.cmake +++ b/cmake/dependencies/aja.cmake @@ -17,7 +17,9 @@ SET(_download_hash "${RV_DEPS_AJA_DOWNLOAD_HASH}" ) -IF(RV_TARGET_WINDOWS) +IF(RV_TARGET_WINDOWS + AND CMAKE_BUILD_TYPE MATCHES "^Debug$" +) RV_MAKE_STANDARD_LIB_NAME(ajantv2_vs143_MT "" "SHARED" "d") ELSE() RV_MAKE_STANDARD_LIB_NAME(ajantv2 "" "SHARED" "d") @@ -30,28 +32,6 @@ SET(_aja_include_dir ${_include_dir}/libajantv2 ) -IF(RHEL_VERBOSE) - SET(_mbedtls_lib_dir - ${_build_dir}/ajantv2/mbedtls-install/lib64 - ) -ELSE() - SET(_mbedtls_lib_dir - ${_build_dir}/ajantv2/mbedtls-install/lib - ) -ENDIF() - -SET(_mbedtls_lib - ${_mbedtls_lib_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}mbedtls${CMAKE_STATIC_LIBRARY_SUFFIX} -) -SET(_mbedx509_lib - ${_mbedtls_lib_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}mbedx509${CMAKE_STATIC_LIBRARY_SUFFIX} -) -SET(_mbedcrypto_lib - ${_mbedtls_lib_dir}/${CMAKE_STATIC_LIBRARY_PREFIX}mbedcrypto${CMAKE_STATIC_LIBRARY_SUFFIX} -) - -LIST(APPEND _byproducts ${_mbedtls_lib} ${_mbedx509_lib} ${_mbedcrypto_lib}) - # There is an issue with the recent AJA SDK : the OS specific header files are no longer copied to _aja_ntv2_include_dir Adding custom paths here to work around # this issue IF(RV_TARGET_LINUX) @@ -75,6 +55,8 @@ LIST( "-DAJANTV2_DISABLE_TOOLS=ON" "-DAJANTV2_DISABLE_TESTS=ON" "-DAJANTV2_BUILD_SHARED=ON" + "-DAJANTV2_DISABLE_PLUGIN_LOAD=ON" + "-DAJANTV2_DISABLE_DRIVER=ON" "-DNTV2_VERSION_BUILD=0" ) @@ -97,7 +79,7 @@ EXTERNALPROJECT_ADD( INSTALL_DIR ${_install_dir} CONFIGURE_COMMAND ${CMAKE_COMMAND} ${_configure_options} BUILD_COMMAND ${_cmake_build_command} - INSTALL_COMMAND ${_cmake_install_command} && ${CMAKE_COMMAND} -E copy_directory ${_mbedtls_lib_dir} ${_lib_dir} + INSTALL_COMMAND ${_cmake_install_command} BUILD_IN_SOURCE FALSE BUILD_ALWAYS FALSE BUILD_BYPRODUCTS ${_byproducts} @@ -126,11 +108,6 @@ RV_ADD_IMPORTED_LIBRARY( ADD_TO_DEPS_LIST ) -TARGET_LINK_LIBRARIES( - aja::ntv2 - INTERFACE ${_mbedtls_lib} ${_mbedx509_lib} ${_mbedcrypto_lib} -) - IF(RV_TARGET_DARWIN) LIST(APPEND _aja_compile_options "-DAJAMac=1") LIST(APPEND _aja_compile_options "-DAJA_MAC=1") diff --git a/src/plugins/output/AJADevices/AJADevices/KonaVideoDevice.h b/src/plugins/output/AJADevices/AJADevices/KonaVideoDevice.h index 51db53ad0..ab80d49bf 100644 --- a/src/plugins/output/AJADevices/AJADevices/KonaVideoDevice.h +++ b/src/plugins/output/AJADevices/AJADevices/KonaVideoDevice.h @@ -69,9 +69,12 @@ namespace AJADevices ThreeG = 1 << 3, LegalRangeY = 1 << 4, FullRangeY = 1 << 5, + TwelveG = 1 << 6, RGB_3G = RGB444 | P2P | ThreeG, RGB_DualLink = RGB444 | P2P | DualLink, + YUV_12G = P2P | TwelveG, + RGB_12G = RGB444 | P2P | TwelveG, }; struct KonaDataFormat @@ -418,6 +421,8 @@ namespace AJADevices void routeQuadRGB(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); void routeStereoRGB(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); void routeMonoRGB(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); + void route12GSingleLinkYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); + void route12GSingleLinkRGB(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); void routeQuadYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); void routeStereoYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); void routeMonoYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d); @@ -448,7 +453,7 @@ namespace AJADevices size_t m_deviceNumVideoOutputs{0}; size_t m_deviceNumVideoChannels{}; bool m_deviceHasDualLink{false}; - bool m_deviceHas3G{false}; + bool m_deviceHas12G{false}; ULWord m_deviceHDMIVersion{0}; bool m_deviceHasHDMIStereo{false}; bool m_deviceHas4KDownConverter{false}; @@ -467,6 +472,7 @@ namespace AJADevices bool m_3G{false}; bool m_3GB{false}; bool m_dualLink{false}; + bool m_12G{false}; bool m_yuvInternalFormat{false}; bool m_allowSegmentedTransfer{false}; bool m_simpleRouting{false}; diff --git a/src/plugins/output/AJADevices/KonaVideoDevice.cpp b/src/plugins/output/AJADevices/KonaVideoDevice.cpp index 348c194ab..27a6b9313 100644 --- a/src/plugins/output/AJADevices/KonaVideoDevice.cpp +++ b/src/plugins/output/AJADevices/KonaVideoDevice.cpp @@ -270,6 +270,13 @@ namespace AJADevices {"10 Bit Dual Link RGB", NTV2_FBF_10BIT_RGB, VideoDevice::RGB10X2, RGB_DualLink}, {"12 Bit Dual Link RGB", NTV2_FBF_48BIT_RGB, VideoDevice::RGB16, RGB_DualLink}, + // 6G/12G Single-link YCbCr formats + {"10 Bit 12G Single-link YCrCb 4:2:2 (SDI Out 3)", NTV2_FBF_10BIT_RGB, VideoDevice::RGB10X2, YUV_12G}, + + // 12G Single-link RGB formats + {"10 Bit 12G Single-link RGB (SDI Out 3)", NTV2_FBF_10BIT_RGB, VideoDevice::RGB10X2, RGB_12G}, + {"12 Bit 12G Single-link RGB (SDI Out 3)", NTV2_FBF_48BIT_RGB, VideoDevice::RGB16, RGB_12G}, + // Stereo // {"Stereo Dual 10 Bit YCrCb 4:2:2 (8 bit internal)", // NTV2_FBF_24BIT_RGB, VideoDevice::RGB8, P2P}, @@ -580,7 +587,9 @@ namespace AJADevices m_deviceNumVideoOutputs = NTV2DeviceGetNumVideoOutputs(m_deviceID); m_deviceNumVideoChannels = NTV2DeviceGetNumVideoChannels(m_deviceID); m_deviceHasDualLink = NTV2DeviceCanDoDualLink(m_deviceID); - m_deviceHas3G = NTV2DeviceCanDo3GOut(m_deviceID, 0); + m_deviceHas12G = m_card->features().CanDoWidget( + NTV2WidgetType_SDIOut12G, 2); // Kona 5 only supports 12G SDI single-link on port 3 with the retail firmware, to be + // refactored later when the ports to use will be configurable m_deviceHDMIVersion = NTV2DeviceGetHDMIVersion(m_deviceID); m_deviceHasHDMIStereo = NTV2DeviceCanDoHDMIOutStereo(m_deviceID); m_deviceHasCSC = NTV2DeviceCanDoWidget(m_deviceID, NTV2_WgtCSC1); @@ -608,11 +617,14 @@ namespace AJADevices bool stereoFormat = p->desc.find("Stereo") != string::npos; bool dualLink = p->flags & DualLink; bool rgb = p->flags & RGB444; + bool twelveG = p->flags & TwelveG; if (stereoFormat && !stereo) continue; if (dualLink && !m_deviceHasDualLink) continue; + if (twelveG && !m_deviceHas12G) + continue; if (!rgb && !m_deviceHasCSC) continue; m_konaDataFormats.push_back(*p); @@ -1041,6 +1053,7 @@ namespace AJADevices m_3G = (d.flags & ThreeG) || NTV2_IS_3G_FORMAT(f.value); m_3GB = (m_3GA ? false : ((d.flags & ThreeG) || IsVideoFormatB(f.value)) && !IsVideoFormatA(f.value)); m_dualLink = d.flags & DualLink; + m_12G = d.flags & TwelveG; m_channels = channelsFromFormat(d.value); m_quad = NTV2_IS_QUAD_FRAME_FORMAT(f.value); m_quadQuad = NTV2_IS_QUAD_QUAD_FORMAT(f.value); @@ -1056,6 +1069,7 @@ namespace AJADevices cout << "INFO: KONA enable 3GA = " << (int)m_3GA << endl; cout << "INFO: KONA enable 3G = " << (int)m_3G << endl; cout << "INFO: KONA enable 3GB = " << (int)m_3GB << endl; + cout << "INFO: KONA enable 12G = " << (int)m_12G << endl; } NTV2VideoLimiting limiting = rgb ? NTV2_VIDEOLIMITING_LEGALSDI : NTV2_VIDEOLIMITING_LEGALBROADCAST; @@ -1187,7 +1201,7 @@ namespace AJADevices if (numFrameStores >= 2) m_card->EnableChannel(NTV2_CHANNEL2); - if (tsiEnabled()) + if (tsiEnabled() || m_12G) { if (numFrameStores >= 3) m_card->DisableChannel(NTV2_CHANNEL3); @@ -1209,16 +1223,26 @@ namespace AJADevices AJA_CHECK(m_card->SetVideoFormat(f.value)); - AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL1, d.value)); - AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL2, d.value)); - - if (m_quad || m_quadQuad) + if (m_12G) { - AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL3, d.value)); - AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL4, d.value)); + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL1, d.value)); + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL2, d.value)); } + else + { + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL1, d.value)); + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL2, d.value)); - if (m_quad || m_quadQuad) + if (m_quad || m_quadQuad) + { + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL3, d.value)); + AJA_CHECK(m_card->SetFrameBufferFormat(NTV2_CHANNEL4, d.value)); + } + } + + if (m_12G) + m_channelVector.resize(1); + else if (m_quad || m_quadQuad) m_channelVector.resize(4); else if (m_stereo) m_channelVector.resize(2); @@ -1256,13 +1280,16 @@ namespace AJADevices } } - m_card->SetSDITransmitEnable(NTV2_CHANNEL1, true); - m_card->SetSDITransmitEnable(NTV2_CHANNEL2, true); - - if (m_quad || m_quadQuad) + if (!m_12G) { - m_card->SetSDITransmitEnable(NTV2_CHANNEL3, true); - m_card->SetSDITransmitEnable(NTV2_CHANNEL4, true); + m_card->SetSDITransmitEnable(NTV2_CHANNEL1, true); + m_card->SetSDITransmitEnable(NTV2_CHANNEL2, true); + + if (m_quad || m_quadQuad) + { + m_card->SetSDITransmitEnable(NTV2_CHANNEL3, true); + m_card->SetSDITransmitEnable(NTV2_CHANNEL4, true); + } } const bool needRGBLevelAConversion = (rgb & m_3GA); @@ -1315,9 +1342,16 @@ namespace AJADevices m_card->SetTsiFrameEnable(false, NTV2_CHANNEL4); m_card->SetTsiFrameEnable(false, NTV2_CHANNEL5); + m_card->SetSDIOut6GEnable(NTV2_CHANNEL3, false); + m_card->SetSDIOut12GEnable(NTV2_CHANNEL3, false); + if (rgb) { - if (m_quad || m_quadQuad) + if (m_12G) + { + route12GSingleLinkRGB(standard, f, d); + } + else if (m_quad || m_quadQuad) { routeQuadRGB(standard, f, d); } @@ -1330,6 +1364,10 @@ namespace AJADevices routeMonoRGB(standard, f, d); } } + else if (m_12G) + { + route12GSingleLinkYUV(standard, f, d); + } else if (m_quad || m_quadQuad) { routeQuadYUV(standard, f, d); @@ -1361,7 +1399,7 @@ namespace AJADevices AJA_CHECK(m_card->SetColorSpaceMatrixSelect(m, NTV2_CHANNEL1)); AJA_CHECK(m_card->SetColorSpaceMatrixSelect(m, NTV2_CHANNEL2)); - if (m_quad || m_quadQuad) + if (m_quad || m_quadQuad || m_12G) { AJA_CHECK(m_card->SetColorSpaceMatrixSelect(m, NTV2_CHANNEL3)); AJA_CHECK(m_card->SetColorSpaceMatrixSelect(m, NTV2_CHANNEL4)); @@ -1380,7 +1418,7 @@ namespace AJADevices AJA_CHECK(m_card->SetColorSpaceRGBBlackRange(range, NTV2_CHANNEL1)); AJA_CHECK(m_card->SetColorSpaceRGBBlackRange(range, NTV2_CHANNEL2)); - if (m_quad || m_quadQuad) + if (m_quad || m_quadQuad || m_12G) { AJA_CHECK(m_card->SetColorSpaceRGBBlackRange(range, NTV2_CHANNEL3)); AJA_CHECK(m_card->SetColorSpaceRGBBlackRange(range, NTV2_CHANNEL4)); @@ -1880,6 +1918,119 @@ namespace AJADevices } } + void KonaVideoDevice::route12GSingleLinkYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d) + { + // + // Single-link YCbCr output on Kona 5 port 3 with the retail firmware. + // + // + // FB 1 + FB 2 -> TSI Mux 1 + TSI Mux 2 -> CSC 1 + CSC 2 + CSC 3 + CSC 4 -> SDI Out 1 + SDI Out 2 + SDI Out 3 + SDI Out 4 + // + + if (m_infoFeedback) + std::cout << "INFO: KONA 6G/12G single-link YCbCr format\n"; + + ULWord vpidA; + CNTV2VPID::SetVPIDData(vpidA, f.value, d.value, false, false, VPIDChannel_3); + + m_card->SetSDITransmitEnable(NTV2_CHANNEL3, true); + + m_card->SetSDIOutputStandard(NTV2_CHANNEL3, standard); + m_card->SetMode(NTV2_CHANNEL1, NTV2_MODE_DISPLAY); + m_card->SetMode(NTV2_CHANNEL2, NTV2_MODE_DISPLAY); + + m_card->SubscribeOutputVerticalEvent(NTV2_CHANNEL1); + + m_card->SetSDIOutVPID(vpidA, 0, NTV2_CHANNEL3); + + // FB 1 + FB 2 -> TSI Mux 1 + TSI Mux 2 + m_card->Connect(NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1RGB); + m_card->Connect(NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2RGB); + m_card->Connect(NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2RGB); + m_card->Connect(NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2RGB); + + // TSI Mux 1 + TSI Mux 2 -> CSC 1 + CSC 2 + CSC 3 + CSC 4 + m_card->Connect(NTV2_XptCSC1VidInput, NTV2_Xpt425Mux1ARGB); + m_card->Connect(NTV2_XptCSC2VidInput, NTV2_Xpt425Mux1BRGB); + m_card->Connect(NTV2_XptCSC3VidInput, NTV2_Xpt425Mux2ARGB); + m_card->Connect(NTV2_XptCSC4VidInput, NTV2_Xpt425Mux2BRGB); + + // CSC 1 + CSC 2 + CSC 3 + CSC 4 -> SDI Out 1 + SDI Out 2 + SDI Out 3 + SDI Out 4 + if (NTV2_IS_4K_HFR_VIDEO_FORMAT(f.value)) + { + m_card->Connect(NTV2_XptSDIOut1Input, NTV2_XptCSC1VidYUV); + m_card->Connect(NTV2_XptSDIOut2Input, NTV2_XptCSC2VidYUV); + m_card->Connect(NTV2_XptSDIOut3Input, NTV2_XptCSC3VidYUV); + m_card->Connect(NTV2_XptSDIOut4Input, NTV2_XptCSC4VidYUV); + + m_card->SetSDIOut12GEnable(NTV2_CHANNEL3, true); + } + else + { + m_card->Connect(NTV2_XptSDIOut3Input, NTV2_XptCSC1VidYUV); + m_card->Connect(NTV2_XptSDIOut3InputDS2, NTV2_XptCSC2VidYUV); + m_card->Connect(NTV2_XptSDIOut4Input, NTV2_XptCSC3VidYUV); + m_card->Connect(NTV2_XptSDIOut4InputDS2, NTV2_XptCSC4VidYUV); + + m_card->SetSDIOut6GEnable(NTV2_CHANNEL3, true); + } + + m_card->SetTsiFrameEnable(true, NTV2_CHANNEL1); + } + + void KonaVideoDevice::route12GSingleLinkRGB(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d) + { + // + // Single-link RGB output on Kona 5 port 3 with the retail firmware. + // + // + // FB 1 + FB 2 -> TSI Mux 1 + TSI Mux 2 -> DL Out 1 + DL Out 2 + DL Out 3 + DL Out 4 -> SDI Out 1 + SDI Out 2 + SDI Out 3 + + // SDI Out 4 + // + + if (m_infoFeedback) + std::cout << "INFO: KONA 12G single-link RGB format\n"; + + ULWord vpidA; + CNTV2VPID::SetVPIDData(vpidA, f.value, d.value, false, false, VPIDChannel_3); + + m_card->SetSDITransmitEnable(NTV2_CHANNEL3, true); + + m_card->SetSDIOutputStandard(NTV2_CHANNEL3, standard); + m_card->SetMode(NTV2_CHANNEL1, NTV2_MODE_DISPLAY); + m_card->SetMode(NTV2_CHANNEL2, NTV2_MODE_DISPLAY); + + m_card->SubscribeOutputVerticalEvent(NTV2_CHANNEL1); + + m_card->SetSDIOutVPID(vpidA, 0, NTV2_CHANNEL3); + + // FB 1 + FB 2 -> TSI Mux 1 + TSI Mux 2 + m_card->Connect(NTV2_Xpt425Mux1AInput, NTV2_XptFrameBuffer1RGB); + m_card->Connect(NTV2_Xpt425Mux1BInput, NTV2_XptFrameBuffer1_DS2RGB); + m_card->Connect(NTV2_Xpt425Mux2AInput, NTV2_XptFrameBuffer2RGB); + m_card->Connect(NTV2_Xpt425Mux2BInput, NTV2_XptFrameBuffer2_DS2RGB); + + // TSI Mux 1 + TSI Mux 2 -> DL Out 1 + DL Out 2 + DL Out 3 + DL Out 4 + m_card->Connect(NTV2_XptDualLinkOut1Input, NTV2_Xpt425Mux1ARGB); + m_card->Connect(NTV2_XptDualLinkOut2Input, NTV2_Xpt425Mux1BRGB); + m_card->Connect(NTV2_XptDualLinkOut3Input, NTV2_Xpt425Mux2ARGB); + m_card->Connect(NTV2_XptDualLinkOut4Input, NTV2_Xpt425Mux2BRGB); + + // DL Out 1 + DL Out 2 + DL Out 3 + DL Out 4 -> SDI Out 1 + SDI Out 2 + SDI Out 3 + SDI Out + m_card->Connect(NTV2_XptSDIOut1Input, NTV2_XptDuallinkOut1); + m_card->Connect(NTV2_XptSDIOut1InputDS2, NTV2_XptDuallinkOut1DS2); + m_card->Connect(NTV2_XptSDIOut2Input, NTV2_XptDuallinkOut2); + m_card->Connect(NTV2_XptSDIOut2InputDS2, NTV2_XptDuallinkOut2DS2); + m_card->Connect(NTV2_XptSDIOut3Input, NTV2_XptDuallinkOut3); + m_card->Connect(NTV2_XptSDIOut3InputDS2, NTV2_XptDuallinkOut3DS2); + m_card->Connect(NTV2_XptSDIOut4Input, NTV2_XptDuallinkOut4); + m_card->Connect(NTV2_XptSDIOut4InputDS2, NTV2_XptDuallinkOut4DS2); + + m_card->SetSDIOut12GEnable(NTV2_CHANNEL3, true); + + m_card->SetTsiFrameEnable(true, NTV2_CHANNEL1); + } + void KonaVideoDevice::routeQuadYUV(NTV2Standard standard, const KonaVideoFormat& f, const KonaDataFormat& d) { if (m_infoFeedback) @@ -2399,6 +2550,9 @@ namespace AJADevices m_card->SetSDIOutRGBLevelAConversion(NTV2_CHANNEL4, false); m_card->SetSDIOutRGBLevelAConversion(NTV2_CHANNEL5, false); + m_card->SetSDIOut6GEnable(NTV2_CHANNEL3, false); + m_card->SetSDIOut12GEnable(NTV2_CHANNEL3, false); + m_card->ClearRouting(); }