|
|
@@ -338,6 +338,8 @@ bool properties_update_config(OBSAVCapture *capture, obs_properties_t *propertie
|
|
|
BOOL hasFoundColorSpace = capture.isFastPath;
|
|
|
BOOL hasFoundVideoRange = capture.isFastPath;
|
|
|
|
|
|
+ CFPropertyListRef priorColorPrimary = @"";
|
|
|
+
|
|
|
if (device) {
|
|
|
// Iterate over all formats reported by the device and gather them for property lists
|
|
|
for (AVCaptureDeviceFormat *format in device.formats) {
|
|
|
@@ -419,29 +421,38 @@ bool properties_update_config(OBSAVCapture *capture, obs_properties_t *propertie
|
|
|
}
|
|
|
|
|
|
// Only iterate over available framerates if input format, color space, and resolution are matching
|
|
|
- if (hasFoundInputFormat && hasFoundColorSpace && hasFoundResolution && !hasFoundFramerate) {
|
|
|
- for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges.reverseObjectEnumerator) {
|
|
|
- FourCharCode formatSubType = CMFormatDescriptionGetMediaSubType(format.formatDescription);
|
|
|
- int device_format = [OBSAVCapture formatFromSubtype:formatSubType];
|
|
|
-
|
|
|
- if (input_format == device_format) {
|
|
|
- struct media_frames_per_second min_fps = {
|
|
|
- .numerator = (uint32_t) clamp_Uint(range.maxFrameDuration.timescale, 0, UINT32_MAX),
|
|
|
- .denominator = (uint32_t) clamp_Uint(range.maxFrameDuration.value, 0, UINT32_MAX)};
|
|
|
- struct media_frames_per_second max_fps = {
|
|
|
- .numerator = (uint32_t) clamp_Uint(range.minFrameDuration.timescale, 0, UINT32_MAX),
|
|
|
- .denominator = (uint32_t) clamp_Uint(range.minFrameDuration.value, 0, UINT32_MAX)};
|
|
|
-
|
|
|
- if (![frameRates containsObject:range]) {
|
|
|
- obs_property_frame_rate_fps_range_add(prop_framerate, min_fps, max_fps);
|
|
|
- [frameRates addObject:range];
|
|
|
- }
|
|
|
-
|
|
|
- if (!hasFoundFramerate && CMTimeCompare(range.maxFrameDuration, time) >= 0 &&
|
|
|
- CMTimeCompare(range.minFrameDuration, time) <= 0) {
|
|
|
- hasFoundFramerate = YES;
|
|
|
+ if (hasFoundInputFormat && hasFoundColorSpace && hasFoundResolution) {
|
|
|
+ CFPropertyListRef colorPrimary = CMFormatDescriptionGetExtension(
|
|
|
+ format.formatDescription, kCMFormatDescriptionExtension_ColorPrimaries);
|
|
|
+
|
|
|
+ CFComparisonResult isColorPrimaryMatch = CFStringCompare(colorPrimary, priorColorPrimary, 0);
|
|
|
+
|
|
|
+ if (isColorPrimaryMatch != kCFCompareEqualTo || !hasFoundFramerate) {
|
|
|
+ for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges.reverseObjectEnumerator) {
|
|
|
+ FourCharCode formatSubType = CMFormatDescriptionGetMediaSubType(format.formatDescription);
|
|
|
+ int device_format = [OBSAVCapture formatFromSubtype:formatSubType];
|
|
|
+
|
|
|
+ if (input_format == device_format) {
|
|
|
+ struct media_frames_per_second min_fps = {
|
|
|
+ .numerator = (uint32_t) clamp_Uint(range.maxFrameDuration.timescale, 0, UINT32_MAX),
|
|
|
+ .denominator = (uint32_t) clamp_Uint(range.maxFrameDuration.value, 0, UINT32_MAX)};
|
|
|
+ struct media_frames_per_second max_fps = {
|
|
|
+ .numerator = (uint32_t) clamp_Uint(range.minFrameDuration.timescale, 0, UINT32_MAX),
|
|
|
+ .denominator = (uint32_t) clamp_Uint(range.minFrameDuration.value, 0, UINT32_MAX)};
|
|
|
+
|
|
|
+ if (![frameRates containsObject:range]) {
|
|
|
+ obs_property_frame_rate_fps_range_add(prop_framerate, min_fps, max_fps);
|
|
|
+ [frameRates addObject:range];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hasFoundFramerate && CMTimeCompare(range.maxFrameDuration, time) >= 0 &&
|
|
|
+ CMTimeCompare(range.minFrameDuration, time) <= 0) {
|
|
|
+ hasFoundFramerate = YES;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ priorColorPrimary = colorPrimary;
|
|
|
}
|
|
|
}
|
|
|
}
|