Index: media/capture/video/mac/video_capture_device_mac.mm |
diff --git a/media/capture/video/mac/video_capture_device_mac.mm b/media/capture/video/mac/video_capture_device_mac.mm |
index f032280d68e9a150dc54e94220a5323d7de32b38..6ae6b8c1d8c8ef7a6ed3e71551f2842c00b25af0 100644 |
--- a/media/capture/video/mac/video_capture_device_mac.mm |
+++ b/media/capture/video/mac/video_capture_device_mac.mm |
@@ -389,6 +389,17 @@ void VideoCaptureDeviceMac::StopAndDeAllocate() { |
state_ = kIdle; |
} |
+void VideoCaptureDeviceMac::TakePhoto(TakePhotoCallback callback) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DCHECK(state_ == kCapturing) << state_; |
+ |
+ if (photo_callback_) // Only one picture can be in flight at a time. |
+ return; |
+ |
+ photo_callback_.reset(new TakePhotoCallback(std::move(callback))); |
+ [capture_device_ takePhoto]; |
+} |
+ |
bool VideoCaptureDeviceMac::Init( |
VideoCaptureDevice::Name::CaptureApiType capture_api_type) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -413,8 +424,6 @@ void VideoCaptureDeviceMac::ReceiveFrame(const uint8_t* video_frame, |
int aspect_numerator, |
int aspect_denominator, |
base::TimeDelta timestamp) { |
- // This method is safe to call from a device capture thread, i.e. any thread |
- // controlled by AVFoundation. |
if (capture_format_.frame_size != frame_format.frame_size) { |
ReceiveError(FROM_HERE, |
"Captured resolution " + frame_format.frame_size.ToString() + |
@@ -426,6 +435,26 @@ void VideoCaptureDeviceMac::ReceiveFrame(const uint8_t* video_frame, |
0, base::TimeTicks::Now(), timestamp); |
} |
+void VideoCaptureDeviceMac::OnPhotoTaken(const uint8_t* image_data, |
+ size_t image_length, |
+ const std::string& mime_type) { |
+ DCHECK(photo_callback_); |
+ if (!image_data || !image_length) { |
+ OnPhotoError(); |
+ return; |
+ } |
+ |
+ photo_callback_->Run(mojo::String::From(mime_type), |
+ mojo::Array<uint8_t>(std::vector<uint8_t>( |
+ image_data, image_data + image_length))); |
+ photo_callback_.reset(); |
+} |
+ |
+void VideoCaptureDeviceMac::OnPhotoError() { |
+ DLOG(ERROR) << __FUNCTION__ << " error taking picture"; |
+ photo_callback_.reset(); |
+} |
+ |
void VideoCaptureDeviceMac::ReceiveError( |
const tracked_objects::Location& from_here, |
const std::string& reason) { |