| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "media/video/capture/mac/video_capture_device_mac.h" | 5 #include "media/video/capture/mac/video_capture_device_mac.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop/message_loop_proxy.h" |
| 10 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 11 #import "media/video/capture/mac/avfoundation_glue.h" | 12 #import "media/video/capture/mac/avfoundation_glue.h" |
| 12 #import "media/video/capture/mac/platform_video_capturing_mac.h" | 13 #import "media/video/capture/mac/platform_video_capturing_mac.h" |
| 13 #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h" | 14 #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h" |
| 14 #import "media/video/capture/mac/video_capture_device_qtkit_mac.h" | 15 #import "media/video/capture/mac/video_capture_device_qtkit_mac.h" |
| 15 | 16 |
| 16 namespace media { | 17 namespace media { |
| 17 | 18 |
| 18 const int kMinFrameRate = 1; | 19 const int kMinFrameRate = 1; |
| 19 const int kMaxFrameRate = 30; | 20 const int kMaxFrameRate = 30; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 delete capture_device; | 111 delete capture_device; |
| 111 capture_device = NULL; | 112 capture_device = NULL; |
| 112 } | 113 } |
| 113 return capture_device; | 114 return capture_device; |
| 114 } | 115 } |
| 115 | 116 |
| 116 VideoCaptureDeviceMac::VideoCaptureDeviceMac(const Name& device_name) | 117 VideoCaptureDeviceMac::VideoCaptureDeviceMac(const Name& device_name) |
| 117 : device_name_(device_name), | 118 : device_name_(device_name), |
| 118 sent_frame_info_(false), | 119 sent_frame_info_(false), |
| 119 tried_to_square_pixels_(false), | 120 tried_to_square_pixels_(false), |
| 120 loop_proxy_(base::MessageLoopProxy::current()), | 121 task_runner_(base::MessageLoopProxy::current()), |
| 121 state_(kNotInitialized), | 122 state_(kNotInitialized), |
| 122 weak_factory_(this), | 123 weak_factory_(this), |
| 123 weak_this_(weak_factory_.GetWeakPtr()), | 124 weak_this_(weak_factory_.GetWeakPtr()), |
| 124 capture_device_(nil) { | 125 capture_device_(nil) { |
| 125 } | 126 } |
| 126 | 127 |
| 127 VideoCaptureDeviceMac::~VideoCaptureDeviceMac() { | 128 VideoCaptureDeviceMac::~VideoCaptureDeviceMac() { |
| 128 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current()); | 129 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 129 [capture_device_ release]; | 130 [capture_device_ release]; |
| 130 } | 131 } |
| 131 | 132 |
| 132 void VideoCaptureDeviceMac::AllocateAndStart( | 133 void VideoCaptureDeviceMac::AllocateAndStart( |
| 133 const VideoCaptureParams& params, | 134 const VideoCaptureParams& params, |
| 134 scoped_ptr<VideoCaptureDevice::Client> client) { | 135 scoped_ptr<VideoCaptureDevice::Client> client) { |
| 135 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current()); | 136 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 136 if (state_ != kIdle) { | 137 if (state_ != kIdle) { |
| 137 return; | 138 return; |
| 138 } | 139 } |
| 139 int width = params.requested_format.frame_size.width(); | 140 int width = params.requested_format.frame_size.width(); |
| 140 int height = params.requested_format.frame_size.height(); | 141 int height = params.requested_format.frame_size.height(); |
| 141 int frame_rate = params.requested_format.frame_rate; | 142 int frame_rate = params.requested_format.frame_rate; |
| 142 | 143 |
| 143 // The OS API can scale captured frame to any size requested, which would lead | 144 // The OS API can scale captured frame to any size requested, which would lead |
| 144 // to undesired aspect ratio change. Try to open the camera with a natively | 145 // to undesired aspect ratio change. Try to open the camera with a natively |
| 145 // supported format and let the client crop/pad the captured frames. | 146 // supported format and let the client crop/pad the captured frames. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 182 |
| 182 if (![capture_device_ startCapture]) { | 183 if (![capture_device_ startCapture]) { |
| 183 SetErrorState("Could not start capture device."); | 184 SetErrorState("Could not start capture device."); |
| 184 return; | 185 return; |
| 185 } | 186 } |
| 186 | 187 |
| 187 state_ = kCapturing; | 188 state_ = kCapturing; |
| 188 } | 189 } |
| 189 | 190 |
| 190 void VideoCaptureDeviceMac::StopAndDeAllocate() { | 191 void VideoCaptureDeviceMac::StopAndDeAllocate() { |
| 191 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current()); | 192 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 192 DCHECK(state_ == kCapturing || state_ == kError) << state_; | 193 DCHECK(state_ == kCapturing || state_ == kError) << state_; |
| 193 [capture_device_ stopCapture]; | 194 [capture_device_ stopCapture]; |
| 194 | 195 |
| 195 [capture_device_ setCaptureDevice:nil]; | 196 [capture_device_ setCaptureDevice:nil]; |
| 196 [capture_device_ setFrameReceiver:nil]; | 197 [capture_device_ setFrameReceiver:nil]; |
| 197 client_.reset(); | 198 client_.reset(); |
| 198 state_ = kIdle; | 199 state_ = kIdle; |
| 199 tried_to_square_pixels_ = false; | 200 tried_to_square_pixels_ = false; |
| 200 } | 201 } |
| 201 | 202 |
| 202 bool VideoCaptureDeviceMac::Init() { | 203 bool VideoCaptureDeviceMac::Init() { |
| 203 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current()); | 204 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 204 DCHECK_EQ(state_, kNotInitialized); | 205 DCHECK_EQ(state_, kNotInitialized); |
| 205 | 206 |
| 206 // TODO(mcasas): The following check might not be necessary; if the device has | 207 // TODO(mcasas): The following check might not be necessary; if the device has |
| 207 // disappeared after enumeration and before coming here, opening would just | 208 // disappeared after enumeration and before coming here, opening would just |
| 208 // fail but not necessarily produce a crash. | 209 // fail but not necessarily produce a crash. |
| 209 Names device_names; | 210 Names device_names; |
| 210 GetDeviceNames(&device_names); | 211 GetDeviceNames(&device_names); |
| 211 Names::iterator it = device_names.begin(); | 212 Names::iterator it = device_names.begin(); |
| 212 for (; it != device_names.end(); ++it) { | 213 for (; it != device_names.end(); ++it) { |
| 213 if (it->id() == device_name_.id()) | 214 if (it->id() == device_name_.id()) |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 frame_format.frame_size.height()); | 306 frame_format.frame_size.height()); |
| 306 | 307 |
| 307 client_->OnIncomingCapturedFrame(video_frame, | 308 client_->OnIncomingCapturedFrame(video_frame, |
| 308 video_frame_length, | 309 video_frame_length, |
| 309 base::Time::Now(), | 310 base::Time::Now(), |
| 310 0, | 311 0, |
| 311 capture_format_); | 312 capture_format_); |
| 312 } | 313 } |
| 313 | 314 |
| 314 void VideoCaptureDeviceMac::ReceiveError(const std::string& reason) { | 315 void VideoCaptureDeviceMac::ReceiveError(const std::string& reason) { |
| 315 loop_proxy_->PostTask(FROM_HERE, | 316 task_runner_->PostTask(FROM_HERE, |
| 316 base::Bind(&VideoCaptureDeviceMac::SetErrorState, weak_this_, | 317 base::Bind(&VideoCaptureDeviceMac::SetErrorState, weak_this_, |
| 317 reason)); | 318 reason)); |
| 318 } | 319 } |
| 319 | 320 |
| 320 void VideoCaptureDeviceMac::SetErrorState(const std::string& reason) { | 321 void VideoCaptureDeviceMac::SetErrorState(const std::string& reason) { |
| 321 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current()); | 322 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 322 DLOG(ERROR) << reason; | 323 DLOG(ERROR) << reason; |
| 323 state_ = kError; | 324 state_ = kError; |
| 324 client_->OnError(); | 325 client_->OnError(); |
| 325 } | 326 } |
| 326 | 327 |
| 327 bool VideoCaptureDeviceMac::UpdateCaptureResolution() { | 328 bool VideoCaptureDeviceMac::UpdateCaptureResolution() { |
| 328 if (![capture_device_ setCaptureHeight:capture_format_.frame_size.height() | 329 if (![capture_device_ setCaptureHeight:capture_format_.frame_size.height() |
| 329 width:capture_format_.frame_size.width() | 330 width:capture_format_.frame_size.width() |
| 330 frameRate:capture_format_.frame_rate]) { | 331 frameRate:capture_format_.frame_rate]) { |
| 331 ReceiveError("Could not configure capture device."); | 332 ReceiveError("Could not configure capture device."); |
| 332 return false; | 333 return false; |
| 333 } | 334 } |
| 334 return true; | 335 return true; |
| 335 } | 336 } |
| 336 | 337 |
| 337 } // namespace media | 338 } // namespace media |
| OLD | NEW |