14 #ifndef NS_RETURNS_INNER_POINTER
15 #define NS_RETURNS_INNER_POINTER
17 #import <AVFoundation/AVFoundation.h>
22 "title" :
"VuoScreenCapture",
24 "AVFoundation.framework",
25 "CoreMedia.framework",
65 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
67 CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
69 __block CVOpenGLTextureRef texture;
71 CVOpenGLTextureCacheCreateTextureFromImage(NULL, _sci->textureCache, pixelBuffer, NULL, &texture);
75 CVOpenGLTextureGetName(texture),
77 CVPixelBufferGetWidth(pixelBuffer),
78 CVPixelBufferGetHeight(pixelBuffer),
82 _sci->capturedImageTrigger(image);
83 CVOpenGLTextureRelease(texture);
87 CVOpenGLTextureCacheFlush(_sci->textureCache, 0);
100 dispatch_sync(dispatch_get_main_queue(), ^{
102 [sci->session stopRunning];
106 [sci->session release];
107 [sci->delegate release];
122 if ( (rectangle.center.x-rectangle.size.x/2.) >= screen.width
123 || (rectangle.center.y-rectangle.size.y/2.) >= screen.height)
131 sci->
queue = dispatch_queue_create(
"org.vuo.VuoScreenCapture", NULL);
134 dispatch_sync(dispatch_get_main_queue(), ^{
140 sci->
session.sessionPreset = AVCaptureSessionPresetPhoto;
143 AVCaptureScreenInput *input = [[AVCaptureScreenInput alloc] initWithDisplayID:screen.id];
144 input.minFrameDuration = CMTimeMake(1, 120);
146 double width = rectangle.size.x;
148 width = screen.width;
150 double height = rectangle.size.y;
152 height = screen.height;
154 input.cropRect = CGRectMake(
155 (
int)(rectangle.center.x - rectangle.size.x/2.),
156 (
int)(screen.height - (rectangle.center.y - rectangle.size.y/2.) - height),
160 [sci->session addInput:input];
165 AVCaptureVideoDataOutput *output = [AVCaptureVideoDataOutput new];
166 [output setAlwaysDiscardsLateVideoFrames:YES];
167 [output setSampleBufferDelegate:sci->delegate queue:sci->queue];
168 [sci->session addOutput:output];
175 __block CVReturn ret;
177 ret = CVOpenGLTextureCacheCreate(NULL, NULL, cgl_ctx, pf, NULL, &
sci->
textureCache);
179 CGLReleasePixelFormat(pf);
181 if (ret != kCVReturnSuccess)
183 VUserLog(
"Error: Couldn't create texture cache: %d", ret);
191 dispatch_sync(dispatch_get_main_queue(), ^{
193 [sci->session startRunning];