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 |