summaryrefslogtreecommitdiffstats
path: root/src/detection/camera/camera_apple.m
blob: aa5c1cf91aef980db1dc6bbad5cd127adf80ce49 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "camera.h"
#include "common/io.h"

#import <AVFoundation/AVCaptureDevice.h>

// warning: 'AVCaptureDeviceTypeExternalUnknown' is deprecated
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

#ifdef MAC_OS_VERSION_14_0
// To make fastfetch compiled on newer macOS versions runs on older ones
AVF_EXPORT FF_A_WEAK_IMPORT AVCaptureDeviceType const AVCaptureDeviceTypeExternal;
#endif

const char* ffDetectCamera(FFlist* result)
{
    #ifdef MAC_OS_X_VERSION_10_15
    FF_SUPPRESS_IO(); // #822

    AVCaptureDeviceType deviceType = NULL;

    #ifdef MAC_OS_VERSION_14_0
    // Strangely `@available(macOS 14.0, *)` doesn't work here (#1594)
    if (@available(macOS 14.0, *))
    {
        if (&AVCaptureDeviceTypeExternal)
            deviceType = AVCaptureDeviceTypeExternal;
    }
    #endif
    if (deviceType == NULL)
        deviceType = AVCaptureDeviceTypeExternalUnknown;

    AVCaptureDeviceDiscoverySession* session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera, deviceType]
                                                                                mediaType:AVMediaTypeVideo
                                                                                position:AVCaptureDevicePositionUnspecified];
    if (!session)
        return "Failed to create AVCaptureDeviceDiscoverySession";

    for (AVCaptureDevice* device in session.devices)
    {
        FFCameraResult* camera = FF_LIST_ADD(FFCameraResult, *result);
        ffStrbufInitS(&camera->name, device.localizedName.UTF8String);
        ffStrbufInitS(&camera->vendor, device.manufacturer.UTF8String);
        ffStrbufInitS(&camera->id, device.uniqueID.UTF8String);
        switch (device.activeColorSpace)
        {
            case AVCaptureColorSpace_sRGB: ffStrbufInitStatic(&camera->colorspace, "sRGB"); break;
            case AVCaptureColorSpace_P3_D65: ffStrbufInitStatic(&camera->colorspace, "P3-D65"); break;
            case 2 /*AVCaptureColorSpace_HLG_BT2020*/: ffStrbufInitStatic(&camera->colorspace, "BT2020-HLG"); break;
            case 3 /*AVCaptureColorSpace_AppleLog*/: ffStrbufInitStatic(&camera->colorspace, "AppleLog"); break;
            case 4 /*AVCaptureColorSpace_AppleLog2*/: ffStrbufInitStatic(&camera->colorspace, "AppleLog2"); break;
        }

        CMVideoDimensions size = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription);
        camera->width = size.width < 0 ? 0 : (uint32_t) size.width;
        camera->height = size.height < 0 ? 0 : (uint32_t) size.height;
    }
    return NULL;
    #else
    return "No support for old MacOS version";
    #endif
}