Преглед изворни кода

aja: Add v210 pixel format support.

Allow selecting v210 in AJA capture plugin.

Enable auto-detection of SDI v210 pixel format.
Paul Hindt пре 1 година
родитељ
комит
4d5e0e89ad

+ 6 - 5
plugins/aja/aja-common.cpp

@@ -201,12 +201,11 @@ void populate_video_format_list(NTV2DeviceID deviceID, obs_property_t *list,
 	}
 }
 
-void populate_pixel_format_list(NTV2DeviceID deviceID, obs_property_t *list)
+void populate_pixel_format_list(NTV2DeviceID deviceID,
+				const std::vector<NTV2PixelFormat> &fmts,
+				obs_property_t *list)
 {
-	const NTV2PixelFormat supported_pix_fmts[] = {kDefaultAJAPixelFormat,
-						      NTV2_FBF_24BIT_BGR};
-
-	for (auto &&pf : supported_pix_fmts) {
+	for (auto &&pf : fmts) {
 		if (NTV2DeviceCanDoFrameBufferFormat(deviceID, pf)) {
 			obs_property_list_add_int(
 				list,
@@ -300,6 +299,8 @@ video_format AJAPixelFormatToOBSVideoFormat(NTV2PixelFormat pf)
 		obs_video_format = VIDEO_FORMAT_BGRA;
 		break;
 	case NTV2_FBF_10BIT_YCBCR:
+		obs_video_format = VIDEO_FORMAT_V210;
+		break;
 	case NTV2_FBF_10BIT_RGB:
 	case NTV2_FBF_8BIT_YCBCR_YUY2:
 	case NTV2_FBF_10BIT_DPX:

+ 1 - 0
plugins/aja/aja-common.hpp

@@ -44,6 +44,7 @@ populate_video_format_list(NTV2DeviceID deviceID, obs_property_t *list,
 			   NTV2VideoFormat genlockFormat = NTV2_FORMAT_UNKNOWN,
 			   bool want4KHFR = false, bool matchFPS = false);
 extern void populate_pixel_format_list(NTV2DeviceID deviceID,
+				       const std::vector<NTV2PixelFormat> &fmts,
 				       obs_property_t *list);
 extern void populate_sdi_transport_list(obs_property_t *list,
 					NTV2DeviceID deviceID,

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

@@ -936,7 +936,9 @@ bool aja_output_device_changed(void *data, obs_properties_t *props,
 				   false, MATCH_OBS_FRAMERATE);
 
 	obs_property_list_clear(pix_fmt_list);
-	populate_pixel_format_list(deviceID, pix_fmt_list);
+	populate_pixel_format_list(deviceID,
+				   {kDefaultAJAPixelFormat, NTV2_FBF_24BIT_BGR},
+				   pix_fmt_list);
 
 	IOSelection io_select = static_cast<IOSelection>(
 		obs_data_get_int(settings, kUIPropOutput.id));

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

@@ -614,7 +614,10 @@ bool AJASource::ReadWireFormats(NTV2DeviceID device_id, IOSelection io_select,
 		if (vpids.size() > 0) {
 			auto vpid = *vpids.begin();
 			if (vpid.Sampling() == VPIDSampling_YUV_422) {
-				pf = NTV2_FBF_8BIT_YCBCR;
+				if (vpid.BitDepth() == VPIDBitDepth_8)
+					pf = NTV2_FBF_8BIT_YCBCR;
+				else if (vpid.BitDepth() == VPIDBitDepth_10)
+					pf = NTV2_FBF_10BIT_YCBCR;
 				blog(LOG_INFO,
 				     "AJASource::ReadWireFormats - Detected pixel format %s",
 				     NTV2FrameBufferFormatToString(pf, true)
@@ -745,7 +748,10 @@ bool aja_source_device_changed(void *data, obs_properties_t *props,
 	obs_property_list_clear(pix_fmt_list);
 	obs_property_list_add_int(pix_fmt_list, obs_module_text("Auto"),
 				  kAutoDetect);
-	populate_pixel_format_list(deviceID, pix_fmt_list);
+	populate_pixel_format_list(deviceID,
+				   {kDefaultAJAPixelFormat,
+				    NTV2_FBF_10BIT_YCBCR, NTV2_FBF_24BIT_BGR},
+				   pix_fmt_list);
 
 	IOSelection io_select = static_cast<IOSelection>(
 		obs_data_get_int(settings, kUIPropInput.id));

+ 31 - 4
plugins/aja/aja-vpid-data.cpp

@@ -6,7 +6,9 @@ VPIDData::VPIDData()
 	  mStandardA{VPIDStandard_Unknown},
 	  mStandardB{VPIDStandard_Unknown},
 	  mSamplingA{VPIDSampling_XYZ_444},
-	  mSamplingB{VPIDSampling_XYZ_444}
+	  mSamplingB{VPIDSampling_XYZ_444},
+	  mBitDepthA{VPIDBitDepth_8},
+	  mBitDepthB{VPIDBitDepth_8}
 {
 }
 
@@ -16,7 +18,9 @@ VPIDData::VPIDData(ULWord vpidA, ULWord vpidB)
 	  mStandardA{VPIDStandard_Unknown},
 	  mStandardB{VPIDStandard_Unknown},
 	  mSamplingA{VPIDSampling_XYZ_444},
-	  mSamplingB{VPIDSampling_XYZ_444}
+	  mSamplingB{VPIDSampling_XYZ_444},
+	  mBitDepthA{VPIDBitDepth_8},
+	  mBitDepthB{VPIDBitDepth_8}
 {
 	Parse();
 }
@@ -27,7 +31,9 @@ VPIDData::VPIDData(const VPIDData &other)
 	  mStandardA{VPIDStandard_Unknown},
 	  mStandardB{VPIDStandard_Unknown},
 	  mSamplingA{VPIDSampling_XYZ_444},
-	  mSamplingB{VPIDSampling_XYZ_444}
+	  mSamplingB{VPIDSampling_XYZ_444},
+	  mBitDepthA{VPIDBitDepth_8},
+	  mBitDepthB{VPIDBitDepth_8}
 {
 	Parse();
 }
@@ -37,7 +43,9 @@ VPIDData::VPIDData(VPIDData &&other)
 	  mStandardA{VPIDStandard_Unknown},
 	  mStandardB{VPIDStandard_Unknown},
 	  mSamplingA{VPIDSampling_XYZ_444},
-	  mSamplingB{VPIDSampling_XYZ_444}
+	  mSamplingB{VPIDSampling_XYZ_444},
+	  mBitDepthA{VPIDBitDepth_8},
+	  mBitDepthB{VPIDBitDepth_8}
 {
 	Parse();
 }
@@ -46,6 +54,12 @@ VPIDData &VPIDData::operator=(const VPIDData &other)
 {
 	mVpidA = other.mVpidA;
 	mVpidB = other.mVpidB;
+	mStandardA = other.mStandardA;
+	mStandardB = other.mStandardB;
+	mSamplingA = other.mSamplingA;
+	mSamplingB = other.mSamplingB;
+	mBitDepthA = other.mBitDepthA;
+	mBitDepthB = other.mBitDepthB;
 	return *this;
 }
 
@@ -53,6 +67,12 @@ VPIDData &VPIDData::operator=(VPIDData &&other)
 {
 	mVpidA = other.mVpidA;
 	mVpidB = other.mVpidB;
+	mStandardA = other.mStandardA;
+	mStandardB = other.mStandardB;
+	mSamplingA = other.mSamplingA;
+	mSamplingB = other.mSamplingB;
+	mBitDepthA = other.mBitDepthA;
+	mBitDepthB = other.mBitDepthB;
 	return *this;
 }
 
@@ -82,11 +102,13 @@ void VPIDData::Parse()
 	parserA.SetVPID(mVpidA);
 	mStandardA = parserA.GetStandard();
 	mSamplingA = parserA.GetSampling();
+	mBitDepthA = parserA.GetBitDepth();
 
 	CNTV2VPID parserB;
 	parserB.SetVPID(mVpidB);
 	mStandardB = parserB.GetStandard();
 	mSamplingB = parserB.GetSampling();
+	mBitDepthB = parserB.GetBitDepth();
 }
 
 bool VPIDData::IsRGB() const
@@ -111,3 +133,8 @@ VPIDSampling VPIDData::Sampling() const
 {
 	return mSamplingA;
 }
+
+VPIDBitDepth VPIDData::BitDepth() const
+{
+	return mBitDepthA;
+}

+ 3 - 0
plugins/aja/aja-vpid-data.hpp

@@ -30,6 +30,7 @@ public:
 
 	VPIDStandard Standard() const;
 	VPIDSampling Sampling() const;
+	VPIDBitDepth BitDepth() const;
 
 private:
 	ULWord mVpidA;
@@ -38,6 +39,8 @@ private:
 	VPIDSampling mSamplingA;
 	VPIDStandard mStandardB;
 	VPIDSampling mSamplingB;
+	VPIDBitDepth mBitDepthA;
+	VPIDBitDepth mBitDepthB;
 };
 
 using VPIDDataList = std::vector<VPIDData>;