Index: media/capture/video/android/video_capture_device_android.cc |
diff --git a/media/capture/video/android/video_capture_device_android.cc b/media/capture/video/android/video_capture_device_android.cc |
index d920a21b7c7acd39800418bc2a8c8e48ab946b3e..ec2f84883d96f860868eee39fe884e2322ee473f 100644 |
--- a/media/capture/video/android/video_capture_device_android.cc |
+++ b/media/capture/video/android/video_capture_device_android.cc |
@@ -13,6 +13,7 @@ |
#include "base/strings/string_number_conversions.h" |
#include "jni/VideoCapture_jni.h" |
#include "media/capture/video/android/video_capture_device_factory_android.h" |
+#include "mojo/public/cpp/bindings/string.h" |
using base::android::AttachCurrentThread; |
using base::android::CheckException; |
@@ -41,16 +42,6 @@ VideoCaptureDeviceAndroid::VideoCaptureDeviceAndroid(const Name& device_name) |
VideoCaptureDeviceAndroid::~VideoCaptureDeviceAndroid() { |
StopAndDeAllocate(); |
- // If there are still |photo_callbacks_|, resolve them with empty datas. |
- { |
- base::AutoLock lock(photo_callbacks_lock_); |
- std::for_each(photo_callbacks_.begin(), photo_callbacks_.end(), |
- [](const std::unique_ptr<TakePhotoCallback>& callback) { |
- std::unique_ptr<std::vector<uint8_t>> empty_data( |
- new std::vector<uint8_t>()); |
- callback->Run("", std::move(empty_data)); |
- }); |
- } |
} |
bool VideoCaptureDeviceAndroid::Init() { |
@@ -145,26 +136,27 @@ void VideoCaptureDeviceAndroid::StopAndDeAllocate() { |
Java_VideoCapture_deallocate(env, j_capture_.obj()); |
} |
-bool VideoCaptureDeviceAndroid::TakePhoto(const TakePhotoCallback& callback) { |
+void VideoCaptureDeviceAndroid::TakePhoto( |
+ ScopedResultCallback<TakePhotoCallback> callback) { |
{ |
base::AutoLock lock(lock_); |
if (state_ != kCapturing) |
- return false; |
+ return; |
} |
JNIEnv* env = AttachCurrentThread(); |
// Make copy on the heap so we can pass the pointer through JNI. |
- std::unique_ptr<TakePhotoCallback> cb(new TakePhotoCallback(callback)); |
- const intptr_t callback_id = reinterpret_cast<intptr_t>(cb.get()); |
+ std::unique_ptr<ScopedResultCallback<TakePhotoCallback>> heap_callback( |
+ new ScopedResultCallback<TakePhotoCallback>(std::move(callback))); |
+ const intptr_t callback_id = reinterpret_cast<intptr_t>(heap_callback.get()); |
if (!Java_VideoCapture_takePhoto(env, j_capture_.obj(), callback_id)) |
- return false; |
+ return; |
{ |
base::AutoLock lock(photo_callbacks_lock_); |
- photo_callbacks_.push_back(std::move(cb)); |
+ photo_callbacks_.push_back(std::move(heap_callback)); |
} |
- return true; |
} |
void VideoCaptureDeviceAndroid::OnFrameAvailable( |
@@ -224,23 +216,23 @@ void VideoCaptureDeviceAndroid::OnPhotoTaken( |
base::AutoLock lock(photo_callbacks_lock_); |
- TakePhotoCallback* const cb = |
- reinterpret_cast<TakePhotoCallback*>(callback_id); |
+ ScopedResultCallback<TakePhotoCallback>* const cb = |
+ reinterpret_cast<ScopedResultCallback<TakePhotoCallback>*>(callback_id); |
// Search for the pointer |cb| in the list of |photo_callbacks_|. |
- const auto reference_it = |
- std::find_if(photo_callbacks_.begin(), photo_callbacks_.end(), |
- [cb](const std::unique_ptr<TakePhotoCallback>& callback) { |
- return callback.get() == cb; |
- }); |
+ const auto reference_it = std::find_if( |
+ photo_callbacks_.begin(), photo_callbacks_.end(), |
+ [cb](const std::unique_ptr<ScopedResultCallback<TakePhotoCallback>>& |
+ callback) { return callback.get() == cb; }); |
if (reference_it == photo_callbacks_.end()) { |
NOTREACHED() << "|callback_id| not found."; |
return; |
} |
- std::unique_ptr<std::vector<uint8_t>> native_data(new std::vector<uint8_t>()); |
- base::android::JavaByteArrayToByteVector(env, data.obj(), native_data.get()); |
+ std::vector<uint8_t> native_data; |
+ base::android::JavaByteArrayToByteVector(env, data.obj(), &native_data); |
- cb->Run(native_data->size() ? "image/jpeg" : "", std::move(native_data)); |
+ cb->Run(mojo::String::From(native_data.empty() ? "" : "image/jpeg"), |
+ mojo::Array<uint8_t>::From(native_data)); |
photo_callbacks_.erase(reference_it); |
} |