| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 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 #include "content/browser/media/capture/image_capture_impl.h" | |
| 6 | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "base/bind_helpers.h" | |
| 10 #include "base/memory/ptr_util.h" | |
| 11 #include "content/browser/browser_main_loop.h" | |
| 12 #include "content/browser/renderer_host/media/media_stream_manager.h" | |
| 13 #include "content/browser/renderer_host/media/video_capture_manager.h" | |
| 14 #include "content/common/media/media_stream_options.h" | |
| 15 #include "content/public/browser/browser_thread.h" | |
| 16 #include "media/base/bind_to_current_loop.h" | |
| 17 #include "media/capture/video/video_capture_device.h" | |
| 18 #include "mojo/public/cpp/bindings/strong_binding.h" | |
| 19 | |
| 20 namespace content { | |
| 21 | |
| 22 namespace { | |
| 23 | |
| 24 void RunGetCapabilitiesCallbackOnUIThread( | |
| 25 const ImageCaptureImpl::GetCapabilitiesCallback& callback, | |
| 26 media::mojom::PhotoCapabilitiesPtr capabilities) { | |
| 27 BrowserThread::PostTask( | |
| 28 BrowserThread::UI, FROM_HERE, | |
| 29 base::Bind(callback, base::Passed(&capabilities))); | |
| 30 } | |
| 31 | |
| 32 void RunFailedGetCapabilitiesCallback( | |
| 33 const ImageCaptureImpl::GetCapabilitiesCallback& cb) { | |
| 34 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 35 media::mojom::PhotoCapabilitiesPtr empty_capabilities = | |
| 36 media::mojom::PhotoCapabilities::New(); | |
| 37 empty_capabilities->iso = media::mojom::Range::New(); | |
| 38 empty_capabilities->width = media::mojom::Range::New(); | |
| 39 empty_capabilities->height = media::mojom::Range::New(); | |
| 40 empty_capabilities->zoom = media::mojom::Range::New(); | |
| 41 empty_capabilities->exposure_compensation = media::mojom::Range::New(); | |
| 42 empty_capabilities->color_temperature = media::mojom::Range::New(); | |
| 43 empty_capabilities->brightness = media::mojom::Range::New(); | |
| 44 empty_capabilities->contrast = media::mojom::Range::New(); | |
| 45 empty_capabilities->saturation = media::mojom::Range::New(); | |
| 46 empty_capabilities->sharpness = media::mojom::Range::New(); | |
| 47 cb.Run(std::move(empty_capabilities)); | |
| 48 } | |
| 49 | |
| 50 void RunSetOptionsCallbackOnUIThread( | |
| 51 const ImageCaptureImpl::SetOptionsCallback& callback, | |
| 52 bool success) { | |
| 53 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 54 base::Bind(callback, success)); | |
| 55 } | |
| 56 | |
| 57 void RunFailedSetOptionsCallback( | |
| 58 const ImageCaptureImpl::SetOptionsCallback& cb) { | |
| 59 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 60 cb.Run(false); | |
| 61 } | |
| 62 | |
| 63 void RunTakePhotoCallbackOnUIThread( | |
| 64 const ImageCaptureImpl::TakePhotoCallback& callback, | |
| 65 media::mojom::BlobPtr blob) { | |
| 66 BrowserThread::PostTask( | |
| 67 BrowserThread::UI, FROM_HERE, | |
| 68 base::Bind(callback, base::Passed(std::move(blob)))); | |
| 69 } | |
| 70 | |
| 71 void RunFailedTakePhotoCallback(const ImageCaptureImpl::TakePhotoCallback& cb) { | |
| 72 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 73 cb.Run(media::mojom::Blob::New()); | |
| 74 } | |
| 75 | |
| 76 void GetCapabilitiesOnIOThread( | |
| 77 const std::string& source_id, | |
| 78 MediaStreamManager* media_stream_manager, | |
| 79 media::ScopedResultCallback<ImageCaptureImpl::GetCapabilitiesCallback> | |
| 80 callback) { | |
| 81 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 82 | |
| 83 const int session_id = | |
| 84 media_stream_manager->VideoDeviceIdToSessionId(source_id); | |
| 85 | |
| 86 if (session_id == StreamDeviceInfo::kNoId) | |
| 87 return; | |
| 88 media_stream_manager->video_capture_manager()->GetPhotoCapabilities( | |
| 89 session_id, std::move(callback)); | |
| 90 } | |
| 91 | |
| 92 void SetOptionsOnIOThread( | |
| 93 const std::string& source_id, | |
| 94 MediaStreamManager* media_stream_manager, | |
| 95 media::mojom::PhotoSettingsPtr settings, | |
| 96 media::ScopedResultCallback<ImageCaptureImpl::SetOptionsCallback> | |
| 97 callback) { | |
| 98 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 99 | |
| 100 const int session_id = | |
| 101 media_stream_manager->VideoDeviceIdToSessionId(source_id); | |
| 102 | |
| 103 if (session_id == StreamDeviceInfo::kNoId) | |
| 104 return; | |
| 105 media_stream_manager->video_capture_manager()->SetPhotoOptions( | |
| 106 session_id, std::move(settings), std::move(callback)); | |
| 107 } | |
| 108 | |
| 109 void TakePhotoOnIOThread( | |
| 110 const std::string& source_id, | |
| 111 MediaStreamManager* media_stream_manager, | |
| 112 media::ScopedResultCallback<ImageCaptureImpl::TakePhotoCallback> callback) { | |
| 113 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 114 | |
| 115 const int session_id = | |
| 116 media_stream_manager->VideoDeviceIdToSessionId(source_id); | |
| 117 | |
| 118 if (session_id == StreamDeviceInfo::kNoId) | |
| 119 return; | |
| 120 media_stream_manager->video_capture_manager()->TakePhoto(session_id, | |
| 121 std::move(callback)); | |
| 122 } | |
| 123 | |
| 124 } // anonymous namespace | |
| 125 | |
| 126 ImageCaptureImpl::ImageCaptureImpl() {} | |
| 127 | |
| 128 ImageCaptureImpl::~ImageCaptureImpl() {} | |
| 129 | |
| 130 // static | |
| 131 void ImageCaptureImpl::Create(media::mojom::ImageCaptureRequest request) { | |
| 132 mojo::MakeStrongBinding(base::MakeUnique<ImageCaptureImpl>(), | |
| 133 std::move(request)); | |
| 134 } | |
| 135 | |
| 136 void ImageCaptureImpl::GetCapabilities( | |
| 137 const std::string& source_id, | |
| 138 const GetCapabilitiesCallback& callback) { | |
| 139 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 140 | |
| 141 media::ScopedResultCallback<GetCapabilitiesCallback> scoped_callback( | |
| 142 base::Bind(&RunGetCapabilitiesCallbackOnUIThread, callback), | |
| 143 media::BindToCurrentLoop(base::Bind(&RunFailedGetCapabilitiesCallback))); | |
| 144 | |
| 145 BrowserThread::PostTask( | |
| 146 BrowserThread::IO, FROM_HERE, | |
| 147 base::Bind(&GetCapabilitiesOnIOThread, source_id, | |
| 148 BrowserMainLoop::GetInstance()->media_stream_manager(), | |
| 149 base::Passed(&scoped_callback))); | |
| 150 } | |
| 151 | |
| 152 void ImageCaptureImpl::SetOptions(const std::string& source_id, | |
| 153 media::mojom::PhotoSettingsPtr settings, | |
| 154 const SetOptionsCallback& callback) { | |
| 155 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 156 | |
| 157 media::ScopedResultCallback<SetOptionsCallback> scoped_callback( | |
| 158 base::Bind(&RunSetOptionsCallbackOnUIThread, callback), | |
| 159 media::BindToCurrentLoop(base::Bind(&RunFailedSetOptionsCallback))); | |
| 160 | |
| 161 BrowserThread::PostTask( | |
| 162 BrowserThread::IO, FROM_HERE, | |
| 163 base::Bind(&SetOptionsOnIOThread, source_id, | |
| 164 BrowserMainLoop::GetInstance()->media_stream_manager(), | |
| 165 base::Passed(&settings), base::Passed(&scoped_callback))); | |
| 166 } | |
| 167 | |
| 168 void ImageCaptureImpl::TakePhoto(const std::string& source_id, | |
| 169 const TakePhotoCallback& callback) { | |
| 170 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 171 | |
| 172 media::ScopedResultCallback<TakePhotoCallback> scoped_callback( | |
| 173 base::Bind(&RunTakePhotoCallbackOnUIThread, callback), | |
| 174 media::BindToCurrentLoop(base::Bind(&RunFailedTakePhotoCallback))); | |
| 175 | |
| 176 BrowserThread::PostTask( | |
| 177 BrowserThread::IO, FROM_HERE, | |
| 178 base::Bind(&TakePhotoOnIOThread, source_id, | |
| 179 BrowserMainLoop::GetInstance()->media_stream_manager(), | |
| 180 base::Passed(&scoped_callback))); | |
| 181 } | |
| 182 | |
| 183 } // namespace content | |
| OLD | NEW |