| 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);
|
| }
|
|
|