-
Notifications
You must be signed in to change notification settings - Fork 0
/
capture_darwin.c
44 lines (40 loc) · 1.55 KB
/
capture_darwin.c
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
#include "capture_darwin.h"
void q_release(dispatch_queue_t q) {
dispatch_release(q);
}
CFDictionaryRef dict_create(double throttle, int8_t queue_length, int cursor, int letterbox) {
CFNumberRef throttle_ref = CFNumberCreate(NULL, kCFNumberFloat64Type, &throttle);
CFNumberRef q_len_ref = CFNumberCreate(NULL, kCFNumberSInt8Type, &queue_length);
CFStringRef keys[4] = {
kCGDisplayStreamShowCursor,
kCGDisplayStreamPreserveAspectRatio,
kCGDisplayStreamMinimumFrameTime,
kCGDisplayStreamQueueDepth,
};
void* vals[4] = {
(void*)(cursor == 1?kCFBooleanTrue:kCFBooleanFalse),
(void*)(letterbox == 1?kCFBooleanTrue:kCFBooleanFalse),
(void*)throttle_ref,
(void*)q_len_ref,
};
CFRelease(throttle_ref);
CFRelease(q_len_ref);
return (void*)CFDictionaryCreate(NULL,
(const void**)&keys,
(const void**)&vals,
4,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
}
void dict_release(CFDictionaryRef p) {
CFRelease(p);
}
CGDisplayStreamRef DisplayStreamCreateWithDispatchQueue(void *cap, CGDirectDisplayID display, uint outputWidth, uint outputHeight, CFDictionaryRef properties, dispatch_queue_t queue) {
return CGDisplayStreamCreateWithDispatchQueue(display, outputWidth, outputHeight, '420f', properties, queue, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef) {
if (kCGDisplayStreamFrameStatusStopped == status) {
CaptureStop(cap);
} else if (kCGDisplayStreamFrameStatusFrameComplete == status) {
CaptureComplete(cap, frameSurface);
}
});
}