OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h" | 5 #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h" |
6 | 6 |
7 #import <CoreVideo/CoreVideo.h> | 7 #import <CoreVideo/CoreVideo.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/mac/foundation_util.h" | 10 #include "base/mac/foundation_util.h" |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
168 // VideoCaptureDeviceMac::ReceiveFrame() is calling here, depending on the | 168 // VideoCaptureDeviceMac::ReceiveFrame() is calling here, depending on the |
169 // running state. VCDM::ReceiveFrame() calls here to change aspect ratio. | 169 // running state. VCDM::ReceiveFrame() calls here to change aspect ratio. |
170 DCHECK((![captureSession_ isRunning] && | 170 DCHECK((![captureSession_ isRunning] && |
171 main_thread_checker_.CalledOnValidThread()) || | 171 main_thread_checker_.CalledOnValidThread()) || |
172 callback_thread_checker_.CalledOnValidThread()); | 172 callback_thread_checker_.CalledOnValidThread()); |
173 | 173 |
174 frameWidth_ = width; | 174 frameWidth_ = width; |
175 frameHeight_ = height; | 175 frameHeight_ = height; |
176 frameRate_ = frameRate; | 176 frameRate_ = frameRate; |
177 | 177 |
178 // Identify the sessionPreset that corresponds to the desired resolution. | 178 // The capture output has to be configured, despite Mac documentation |
179 NSString* sessionPreset; | 179 // detailing that setting the sessionPreset is enough. The reason for this |
bemasc
2014/04/28 19:18:03
Nit: "would be enough", to be clear that we don't
mcasas
2014/04/29 06:56:32
Done.
| |
180 if (width == 1280 && height == 720 && [captureSession_ canSetSessionPreset: | 180 // mismatch is probably because most of the AVFoundation docs are written for |
181 AVFoundationGlue::AVCaptureSessionPreset1280x720()]) { | 181 // iOS and not for MacOsX. AVVideoScalingModeKey() refers to letterboxing |
182 sessionPreset = AVFoundationGlue::AVCaptureSessionPreset1280x720(); | 182 // yes/no and preserve aspect ratio yes/no when scaling. Currently we set |
183 } else if (width == 640 && height == 480 && [captureSession_ | 183 // cropping and preservation. |
184 canSetSessionPreset: | |
185 AVFoundationGlue::AVCaptureSessionPreset640x480()]) { | |
186 sessionPreset = AVFoundationGlue::AVCaptureSessionPreset640x480(); | |
187 } else if (width == 320 && height == 240 && [captureSession_ | |
188 canSetSessionPreset: | |
189 AVFoundationGlue::AVCaptureSessionPreset320x240()]) { | |
190 sessionPreset = AVFoundationGlue::AVCaptureSessionPreset320x240(); | |
191 } else { | |
192 DLOG(ERROR) << "Unsupported resolution (" << width << "x" << height << ")"; | |
193 return NO; | |
194 } | |
195 [captureSession_ setSessionPreset:sessionPreset]; | |
196 | |
197 // Check that our capture Device can be used with the current preset. | |
198 if (![captureDevice_ supportsAVCaptureSessionPreset: | |
199 [captureSession_ sessionPreset]]){ | |
200 DLOG(ERROR) << "Video capture device does not support current preset"; | |
201 return NO; | |
202 } | |
203 | |
204 // Despite all Mac documentation detailing that setting the sessionPreset is | |
205 // enough, that is not the case for, at least, the MacBook Air built-in | |
206 // FaceTime HD Camera, and the capture output has to be configured as well. | |
207 // The reason for this mismatch is probably because most of the AVFoundation | |
208 // docs are written for iOS and not for MacOsX. | |
209 // AVVideoScalingModeKey() refers to letterboxing yes/no and preserve aspect | |
210 // ratio yes/no when scaling. Currently we set cropping and preservation. | |
211 NSDictionary* videoSettingsDictionary = @{ | 184 NSDictionary* videoSettingsDictionary = @{ |
212 (id)kCVPixelBufferWidthKey : @(width), | 185 (id)kCVPixelBufferWidthKey : @(width), |
213 (id)kCVPixelBufferHeightKey : @(height), | 186 (id)kCVPixelBufferHeightKey : @(height), |
214 (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_422YpCbCr8), | 187 (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_422YpCbCr8), |
215 AVFoundationGlue::AVVideoScalingModeKey() : | 188 AVFoundationGlue::AVVideoScalingModeKey() : |
216 AVFoundationGlue::AVVideoScalingModeResizeAspectFill() | 189 AVFoundationGlue::AVVideoScalingModeResizeAspectFill() |
217 }; | 190 }; |
218 [captureVideoDataOutput_ setVideoSettings:videoSettingsDictionary]; | 191 [captureVideoDataOutput_ setVideoSettings:videoSettingsDictionary]; |
219 | 192 |
220 CrAVCaptureConnection* captureConnection = [captureVideoDataOutput_ | 193 CrAVCaptureConnection* captureConnection = [captureVideoDataOutput_ |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 [NSString stringWithFormat:@"%@: %@", | 274 [NSString stringWithFormat:@"%@: %@", |
302 [error localizedDescription], | 275 [error localizedDescription], |
303 [error localizedFailureReason]]; | 276 [error localizedFailureReason]]; |
304 | 277 |
305 base::AutoLock lock(lock_); | 278 base::AutoLock lock(lock_); |
306 if (frameReceiver_) | 279 if (frameReceiver_) |
307 frameReceiver_->ReceiveError([str_error UTF8String]); | 280 frameReceiver_->ReceiveError([str_error UTF8String]); |
308 } | 281 } |
309 | 282 |
310 @end | 283 @end |
OLD | NEW |