Index: content/browser/media/capture/image_capture_impl.cc |
diff --git a/content/browser/media/capture/image_capture_impl.cc b/content/browser/media/capture/image_capture_impl.cc |
index 7a22bc9f7f59f72a340475d53aea6245003a6f5b..ee238a5d2b7dfbcf9e008d9fff4ed3e5fcdb2c0c 100644 |
--- a/content/browser/media/capture/image_capture_impl.cc |
+++ b/content/browser/media/capture/image_capture_impl.cc |
@@ -10,43 +10,56 @@ |
#include "content/browser/renderer_host/media/video_capture_manager.h" |
#include "content/common/media/media_stream_options.h" |
#include "content/public/browser/browser_thread.h" |
+#include "media/base/bind_to_current_loop.h" |
#include "media/capture/video/video_capture_device.h" |
namespace content { |
namespace { |
-void RunMojoCallback(const ImageCaptureImpl::TakePhotoCallback& callback, |
- const std::string& mime_type, |
- mojo::Array<uint8_t> data) { |
+void RunFailedGetCapabilitiesCallback( |
+ const ImageCaptureImpl::GetCapabilitiesCallback& cb) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ blink::mojom::PhotoCapabilitiesPtr empty_capabilities = |
+ blink::mojom::PhotoCapabilities::New(); |
+ empty_capabilities->zoom = blink::mojom::Range::New(); |
+ cb.Run(std::move(empty_capabilities)); |
+} |
+ |
+void RunTakePhotoCallbackOnUIThread( |
+ const ImageCaptureImpl::TakePhotoCallback& callback, |
+ mojo::String mime_type, |
+ mojo::Array<uint8_t> data) { |
+ 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
|
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&RunTakePhotoCallbackOnUIThread, std::move(callback), |
+ mime_type, base::Passed(std::move(data)))); |
+ return; |
+ } |
+ |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
callback.Run(mime_type, std::move(data)); |
} |
-void RunTakePhotoCallback(const ImageCaptureImpl::TakePhotoCallback& callback, |
- const std::string& mime_type, |
- std::unique_ptr<std::vector<uint8_t>> data) { |
- DCHECK(data.get()); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&RunMojoCallback, callback, mime_type, |
- base::Passed(mojo::Array<uint8_t>::From(*data)))); |
+void RunFailedTakePhotoCallback(const ImageCaptureImpl::TakePhotoCallback& cb) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ cb.Run("", mojo::Array<uint8_t>()); |
} |
-void TakePhotoOnIOThread(const mojo::String& source_id, |
- const ImageCaptureImpl::TakePhotoCallback& callback, |
- MediaStreamManager* media_stream_manager) { |
+void TakePhotoOnIOThread( |
+ const mojo::String& source_id, |
+ MediaStreamManager* media_stream_manager, |
+ media::ScopedCallback<ImageCaptureImpl::TakePhotoCallback> callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
const int session_id = |
media_stream_manager->VideoDeviceIdToSessionId(source_id); |
- if (session_id == StreamDeviceInfo::kNoId || |
- !media_stream_manager->video_capture_manager()->TakePhoto( |
- session_id, base::Bind(&RunTakePhotoCallback, callback))) { |
- std::unique_ptr<std::vector<uint8_t>> empty_vector( |
- new std::vector<uint8_t>()); |
- RunTakePhotoCallback(callback, "", std::move(empty_vector)); |
- } |
+ if (session_id == StreamDeviceInfo::kNoId) |
+ return; |
+ media_stream_manager->video_capture_manager()->TakePhoto(session_id, |
+ std::move(callback)); |
} |
} // anonymous namespace |
@@ -65,21 +78,25 @@ void ImageCaptureImpl::GetCapabilities( |
const GetCapabilitiesCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- blink::mojom::PhotoCapabilitiesPtr empty_capabilities = |
- blink::mojom::PhotoCapabilities::New(); |
- empty_capabilities->zoom = blink::mojom::Range::New(); |
- callback.Run(std::move(empty_capabilities)); |
+ media::ScopedCallback<GetCapabilitiesCallback> scoped_callback( |
+ callback, |
+ media::BindToCurrentLoop(base::Bind(&RunFailedGetCapabilitiesCallback))); |
} |
- |
void ImageCaptureImpl::TakePhoto(const mojo::String& source_id, |
const TakePhotoCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ media::ScopedCallback<TakePhotoCallback> scoped_callback( |
+ base::Bind(&RunTakePhotoCallbackOnUIThread, callback), |
+ media::BindToCurrentLoop(base::Bind(&RunFailedTakePhotoCallback))); |
+ |
// media_stream_manager() can only be called on UI thread. |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
- base::Bind(&TakePhotoOnIOThread, source_id, callback, |
- BrowserMainLoop::GetInstance()->media_stream_manager())); |
+ base::Bind(&TakePhotoOnIOThread, source_id, |
+ BrowserMainLoop::GetInstance()->media_stream_manager(), |
+ base::Passed(&scoped_callback))); |
} |
ImageCaptureImpl::ImageCaptureImpl( |