OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/media/capture/image_capture_impl.h" | 5 #include "content/browser/media/capture/image_capture_impl.h" |
6 | 6 |
7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "content/browser/browser_main_loop.h" | 8 #include "content/browser/browser_main_loop.h" |
9 #include "content/browser/renderer_host/media/media_stream_manager.h" | 9 #include "content/browser/renderer_host/media/media_stream_manager.h" |
10 #include "content/browser/renderer_host/media/video_capture_manager.h" | 10 #include "content/browser/renderer_host/media/video_capture_manager.h" |
11 #include "content/common/media/media_stream_options.h" | 11 #include "content/common/media/media_stream_options.h" |
12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
13 #include "media/base/bind_to_current_loop.h" | |
13 #include "media/capture/video/video_capture_device.h" | 14 #include "media/capture/video/video_capture_device.h" |
14 | 15 |
15 namespace content { | 16 namespace content { |
16 | 17 |
17 namespace { | 18 namespace { |
18 | 19 |
19 void RunMojoCallback(const ImageCaptureImpl::TakePhotoCallback& callback, | 20 void RunFailedGetCapabilitiesCallback( |
20 const std::string& mime_type, | 21 const ImageCaptureImpl::GetCapabilitiesCallback& cb) { |
21 mojo::Array<uint8_t> data) { | 22 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
23 blink::mojom::PhotoCapabilitiesPtr empty_capabilities = | |
24 blink::mojom::PhotoCapabilities::New(); | |
25 empty_capabilities->zoom = blink::mojom::Range::New(); | |
26 cb.Run(std::move(empty_capabilities)); | |
27 } | |
28 | |
29 void RunTakePhotoCallbackOnUIThread( | |
30 const ImageCaptureImpl::TakePhotoCallback& callback, | |
31 mojo::String mime_type, | |
32 mojo::Array<uint8_t> data) { | |
33 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | |
miu
2016/05/27 22:36:38
Instead of trampolining, can you just use media::B
mcasas
2016/05/27 23:36:06
media::BindToCurrentLoop() does not know how
to f
| |
34 BrowserThread::PostTask( | |
35 BrowserThread::UI, FROM_HERE, | |
36 base::Bind(&RunTakePhotoCallbackOnUIThread, std::move(callback), | |
37 mime_type, base::Passed(std::move(data)))); | |
38 return; | |
39 } | |
40 | |
41 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
22 callback.Run(mime_type, std::move(data)); | 42 callback.Run(mime_type, std::move(data)); |
23 } | 43 } |
24 | 44 |
25 void RunTakePhotoCallback(const ImageCaptureImpl::TakePhotoCallback& callback, | 45 void RunFailedTakePhotoCallback(const ImageCaptureImpl::TakePhotoCallback& cb) { |
26 const std::string& mime_type, | 46 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
27 std::unique_ptr<std::vector<uint8_t>> data) { | 47 cb.Run("", mojo::Array<uint8_t>()); |
28 DCHECK(data.get()); | |
29 BrowserThread::PostTask( | |
30 BrowserThread::UI, FROM_HERE, | |
31 base::Bind(&RunMojoCallback, callback, mime_type, | |
32 base::Passed(mojo::Array<uint8_t>::From(*data)))); | |
33 } | 48 } |
34 | 49 |
35 void TakePhotoOnIOThread(const mojo::String& source_id, | 50 void TakePhotoOnIOThread( |
36 const ImageCaptureImpl::TakePhotoCallback& callback, | 51 const mojo::String& source_id, |
37 MediaStreamManager* media_stream_manager) { | 52 MediaStreamManager* media_stream_manager, |
53 media::ScopedCallback<ImageCaptureImpl::TakePhotoCallback> callback) { | |
38 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 54 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
39 | 55 |
40 const int session_id = | 56 const int session_id = |
41 media_stream_manager->VideoDeviceIdToSessionId(source_id); | 57 media_stream_manager->VideoDeviceIdToSessionId(source_id); |
42 | 58 |
43 if (session_id == StreamDeviceInfo::kNoId || | 59 if (session_id == StreamDeviceInfo::kNoId) |
44 !media_stream_manager->video_capture_manager()->TakePhoto( | 60 return; |
45 session_id, base::Bind(&RunTakePhotoCallback, callback))) { | 61 media_stream_manager->video_capture_manager()->TakePhoto(session_id, |
46 std::unique_ptr<std::vector<uint8_t>> empty_vector( | 62 std::move(callback)); |
47 new std::vector<uint8_t>()); | |
48 RunTakePhotoCallback(callback, "", std::move(empty_vector)); | |
49 } | |
50 } | 63 } |
51 | 64 |
52 } // anonymous namespace | 65 } // anonymous namespace |
53 | 66 |
54 // static | 67 // static |
55 void ImageCaptureImpl::Create( | 68 void ImageCaptureImpl::Create( |
56 mojo::InterfaceRequest<blink::mojom::ImageCapture> request) { | 69 mojo::InterfaceRequest<blink::mojom::ImageCapture> request) { |
57 // |binding_| will take ownership of ImageCaptureImpl. | 70 // |binding_| will take ownership of ImageCaptureImpl. |
58 new ImageCaptureImpl(std::move(request)); | 71 new ImageCaptureImpl(std::move(request)); |
59 } | 72 } |
60 | 73 |
61 ImageCaptureImpl::~ImageCaptureImpl() {} | 74 ImageCaptureImpl::~ImageCaptureImpl() {} |
62 | 75 |
63 void ImageCaptureImpl::GetCapabilities( | 76 void ImageCaptureImpl::GetCapabilities( |
64 const mojo::String& source_id, | 77 const mojo::String& source_id, |
65 const GetCapabilitiesCallback& callback) { | 78 const GetCapabilitiesCallback& callback) { |
66 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 79 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
67 | 80 |
68 blink::mojom::PhotoCapabilitiesPtr empty_capabilities = | 81 media::ScopedCallback<GetCapabilitiesCallback> scoped_callback( |
69 blink::mojom::PhotoCapabilities::New(); | 82 callback, |
70 empty_capabilities->zoom = blink::mojom::Range::New(); | 83 media::BindToCurrentLoop(base::Bind(&RunFailedGetCapabilitiesCallback))); |
71 callback.Run(std::move(empty_capabilities)); | |
72 } | 84 } |
73 | 85 |
74 | |
75 void ImageCaptureImpl::TakePhoto(const mojo::String& source_id, | 86 void ImageCaptureImpl::TakePhoto(const mojo::String& source_id, |
76 const TakePhotoCallback& callback) { | 87 const TakePhotoCallback& callback) { |
77 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 88 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
89 | |
90 media::ScopedCallback<TakePhotoCallback> scoped_callback( | |
91 base::Bind(&RunTakePhotoCallbackOnUIThread, callback), | |
92 media::BindToCurrentLoop(base::Bind(&RunFailedTakePhotoCallback))); | |
93 | |
78 // media_stream_manager() can only be called on UI thread. | 94 // media_stream_manager() can only be called on UI thread. |
79 BrowserThread::PostTask( | 95 BrowserThread::PostTask( |
80 BrowserThread::IO, FROM_HERE, | 96 BrowserThread::IO, FROM_HERE, |
81 base::Bind(&TakePhotoOnIOThread, source_id, callback, | 97 base::Bind(&TakePhotoOnIOThread, source_id, |
82 BrowserMainLoop::GetInstance()->media_stream_manager())); | 98 BrowserMainLoop::GetInstance()->media_stream_manager(), |
99 base::Passed(&scoped_callback))); | |
83 } | 100 } |
84 | 101 |
85 ImageCaptureImpl::ImageCaptureImpl( | 102 ImageCaptureImpl::ImageCaptureImpl( |
86 mojo::InterfaceRequest<blink::mojom::ImageCapture> request) | 103 mojo::InterfaceRequest<blink::mojom::ImageCapture> request) |
87 : binding_(this, std::move(request)) {} | 104 : binding_(this, std::move(request)) {} |
88 | 105 |
89 } // namespace content | 106 } // namespace content |
OLD | NEW |