Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: media/video/capture/mac/video_capture_device_mac_qtkit.mm

Issue 8177008: Adding VideoCaptureDevice for Mac. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Unittest changes to run on Mac OS X. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "media/video/capture/mac/video_capture_device_mac_qtkit.h"
6
7 #import <QTKit/QTKit.h>
8
9 #include "base/logging.h"
10 #include "media/video/capture/mac/video_capture_device_mac.h"
11 #include "media/video/capture/video_capture_device.h"
12
13 @implementation VideoCaptureDeviceMacQTKit
14
15 - (void)dealloc {
dmac 2011/10/14 23:31:35 please move dealloc down under init
mflodman_chromium_OOO 2011/10/16 21:58:38 Done.
16 [captureSession_ release];
17 [captureDeviceInput_ release];
18 [super dealloc];
19 }
20
21 #pragma mark Class methods
22
23 + (NSArray *)deviceNames {
24 return [QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeVideo];
25 }
26
27 #pragma mark Public methods
28
29 - (id)initWithFrameReceiver:(media::VideoCaptureDeviceMac *)frameReceiver {
30 frameReceiver_ = frameReceiver;
31 return [super init];
32 }
33
34 - (BOOL)setCaptureDevice:(NSString *)deviceId {
35 if (deviceId) {
36 // Set the capture device.
37 if (captureDeviceInput_) {
38 DLOG(ERROR) << "Video capture device already set.";
39 return NO;
40 }
41
42 NSArray *captureDevices =
43 [QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeVideo];
44 NSArray *captureDevicesNames =
45 [captureDevices valueForKey:@"uniqueID"];
46 NSUInteger index = [captureDevicesNames indexOfObject:deviceId];
47 if (index == NSNotFound) {
48 DLOG(ERROR) << "Video capture device not found.";
49 return NO;
50 }
51 QTCaptureDevice *device = [captureDevices objectAtIndex:index];
52 NSError *error;
53 if (![device open:&error]) {
54 DLOG(ERROR) << "Could not open video capture device.";
55 return NO;
56 }
57 captureDeviceInput_ = [[QTCaptureDeviceInput alloc] initWithDevice:device];
58 captureSession_ = [[QTCaptureSession alloc] init];
59
60 QTCaptureDecompressedVideoOutput *captureDecompressedOutput =
61 [[[QTCaptureDecompressedVideoOutput alloc] init] autorelease];
62 [captureDecompressedOutput setDelegate:self];
63 if (![captureSession_ addOutput:captureDecompressedOutput error:&error]) {
64 DLOG(ERROR) << "Could not connect video capture output.";
65 return NO;
66 }
67 return YES;
68 } else {
69 // Remove the previously set capture device.
70 if (!captureDeviceInput_) {
71 DLOG(ERROR) << "No video capture device set.";
72 return YES;
73 }
74 if ([[captureSession_ inputs] count] > 0) {
75 // The device is still running.
76 [self stopCapture];
77 }
78 [captureSession_ release];
79 captureSession_ = nil;
80 [captureDeviceInput_ release];
81 captureDeviceInput_ = nil;
82 return YES;
83 }
84 }
85
86 - (BOOL)setCaptureHeight:(int)height width:(int)width frameRate:(int)frameRate {
87 if (!captureDeviceInput_) {
88 DLOG(ERROR) << "No video capture device set.";
89 return NO;
90 }
91 if ([[captureSession_ outputs] count] != 1) {
92 DLOG(ERROR) << "Video capture capabilities already set.";
93 return NO;
94 }
95
96 frameWidth_ = width;
97 frameHeight_ = height;
98 frameRate_ = frameRate;
99
100 // Set up desired output properties.
101 NSDictionary *captureDictionary =
102 [NSDictionary dictionaryWithObjectsAndKeys:
103 [NSNumber numberWithDouble:frameWidth_],
104 (id)kCVPixelBufferWidthKey,
105 [NSNumber numberWithDouble:frameHeight_],
106 (id)kCVPixelBufferHeightKey,
107 [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA],
108 (id)kCVPixelBufferPixelFormatTypeKey,
109 nil];
110 [[[captureSession_ outputs] objectAtIndex:0]
111 setPixelBufferAttributes:captureDictionary];
112 return YES;
113 }
114
115 - (BOOL)startCapture {
116 if ([[captureSession_ outputs] count] == 0) {
117 // Capture properties not set.
118 DLOG(ERROR) << "Video capture device not initialized.";
119 return NO;
120 }
121 if ([[captureSession_ inputs] count] == 0) {
122 NSError *error;
123 if (![captureSession_ addInput:captureDeviceInput_ error:&error]) {
124 DLOG(ERROR) << "Could not connect video capture device.";
dmac 2011/10/14 23:31:35 worth logging the error as well? [[error localized
mflodman_chromium_OOO 2011/10/16 21:58:38 Done, here and two other places.
125 return NO;
126 }
127 [captureSession_ startRunning];
128 }
129 return YES;
130 }
131
132 - (void)stopCapture {
133 if ([[captureSession_ inputs] count] == 1) {
134 [captureSession_ removeInput:captureDeviceInput_];
135 [captureSession_ stopRunning];
136 }
137 }
138
139 // |captureOutput| is called by the capture device to deliver a new frame.
140 - (void)captureOutput:(QTCaptureOutput *)captureOutput
141 didOutputVideoFrame:(CVImageBufferRef)videoFrame
142 withSampleBuffer:(QTSampleBuffer *)sampleBuffer
143 fromConnection:(QTCaptureConnection *)connection {
144
dmac 2011/10/14 23:31:35 get rid of blank line
mflodman_chromium_OOO 2011/10/16 21:58:38 Done.
145 if(!frameReceiver_) {
146 return;
147 }
148
149 // Lock the frame and calculate frame size.
150 const int LOCK_FLAGS = 0;
dmac 2011/10/14 23:31:35 we tend to use kLockFlags for constants
mflodman_chromium_OOO 2011/10/16 21:58:38 Done.
151 if (CVPixelBufferLockBaseAddress(videoFrame, LOCK_FLAGS)
152 == kCVReturnSuccess) {
153 void *baseAddress = CVPixelBufferGetBaseAddress(videoFrame);
154 size_t bytesPerRow = CVPixelBufferGetBytesPerRow(videoFrame);
155 int frameHeight = CVPixelBufferGetHeight(videoFrame);
156 int frameSize = bytesPerRow * frameHeight;
157 media::VideoCaptureDevice::Capability captureCapability;
158 captureCapability.width = frameWidth_;
159 captureCapability.height = frameHeight_;
160 captureCapability.frame_rate = frameRate_;
161 captureCapability.color = media::VideoCaptureDevice::kARGB;
162
163 // Deliver the captured video frame.
164 frameReceiver_->ReceiveFrame((UInt8 *)baseAddress, frameSize,
dmac 2011/10/14 23:31:35 static_cast<UInt8*>
mflodman_chromium_OOO 2011/10/16 21:58:38 Done.
165 captureCapability);
166
167 CVPixelBufferUnlockBaseAddress(videoFrame, LOCK_FLAGS);
168 }
169 }
170
171 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698