OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "media/capture/video/android/video_capture_device_android.h" | 5 #include "media/capture/video/android/video_capture_device_android.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 base::AutoLock lock(lock_); | 64 base::AutoLock lock(lock_); |
65 if (state_ != kIdle) | 65 if (state_ != kIdle) |
66 return; | 66 return; |
67 client_ = std::move(client); | 67 client_ = std::move(client); |
68 got_first_frame_ = false; | 68 got_first_frame_ = false; |
69 } | 69 } |
70 | 70 |
71 JNIEnv* env = AttachCurrentThread(); | 71 JNIEnv* env = AttachCurrentThread(); |
72 | 72 |
73 jboolean ret = Java_VideoCapture_allocate( | 73 jboolean ret = Java_VideoCapture_allocate( |
74 env, j_capture_.obj(), params.requested_format.frame_size.width(), | 74 env, j_capture_, params.requested_format.frame_size.width(), |
75 params.requested_format.frame_size.height(), | 75 params.requested_format.frame_size.height(), |
76 params.requested_format.frame_rate); | 76 params.requested_format.frame_rate); |
77 if (!ret) { | 77 if (!ret) { |
78 SetErrorState(FROM_HERE, "failed to allocate"); | 78 SetErrorState(FROM_HERE, "failed to allocate"); |
79 return; | 79 return; |
80 } | 80 } |
81 | 81 |
82 capture_format_.frame_size.SetSize( | 82 capture_format_.frame_size.SetSize( |
83 Java_VideoCapture_queryWidth(env, j_capture_.obj()), | 83 Java_VideoCapture_queryWidth(env, j_capture_), |
84 Java_VideoCapture_queryHeight(env, j_capture_.obj())); | 84 Java_VideoCapture_queryHeight(env, j_capture_)); |
85 capture_format_.frame_rate = | 85 capture_format_.frame_rate = |
86 Java_VideoCapture_queryFrameRate(env, j_capture_.obj()); | 86 Java_VideoCapture_queryFrameRate(env, j_capture_); |
87 capture_format_.pixel_format = GetColorspace(); | 87 capture_format_.pixel_format = GetColorspace(); |
88 DCHECK_NE(capture_format_.pixel_format, media::PIXEL_FORMAT_UNKNOWN); | 88 DCHECK_NE(capture_format_.pixel_format, media::PIXEL_FORMAT_UNKNOWN); |
89 CHECK(capture_format_.frame_size.GetArea() > 0); | 89 CHECK(capture_format_.frame_size.GetArea() > 0); |
90 CHECK(!(capture_format_.frame_size.width() % 2)); | 90 CHECK(!(capture_format_.frame_size.width() % 2)); |
91 CHECK(!(capture_format_.frame_size.height() % 2)); | 91 CHECK(!(capture_format_.frame_size.height() % 2)); |
92 | 92 |
93 if (capture_format_.frame_rate > 0) { | 93 if (capture_format_.frame_rate > 0) { |
94 frame_interval_ = base::TimeDelta::FromMicroseconds( | 94 frame_interval_ = base::TimeDelta::FromMicroseconds( |
95 (base::Time::kMicrosecondsPerSecond + capture_format_.frame_rate - 1) / | 95 (base::Time::kMicrosecondsPerSecond + capture_format_.frame_rate - 1) / |
96 capture_format_.frame_rate); | 96 capture_format_.frame_rate); |
97 } | 97 } |
98 | 98 |
99 DVLOG(1) << __FUNCTION__ << " requested (" | 99 DVLOG(1) << __FUNCTION__ << " requested (" |
100 << capture_format_.frame_size.ToString() << ")@ " | 100 << capture_format_.frame_size.ToString() << ")@ " |
101 << capture_format_.frame_rate << "fps"; | 101 << capture_format_.frame_rate << "fps"; |
102 | 102 |
103 ret = Java_VideoCapture_startCapture(env, j_capture_.obj()); | 103 ret = Java_VideoCapture_startCapture(env, j_capture_); |
104 if (!ret) { | 104 if (!ret) { |
105 SetErrorState(FROM_HERE, "failed to start capture"); | 105 SetErrorState(FROM_HERE, "failed to start capture"); |
106 return; | 106 return; |
107 } | 107 } |
108 | 108 |
109 { | 109 { |
110 base::AutoLock lock(lock_); | 110 base::AutoLock lock(lock_); |
111 state_ = kConfigured; | 111 state_ = kConfigured; |
112 } | 112 } |
113 } | 113 } |
114 | 114 |
115 void VideoCaptureDeviceAndroid::StopAndDeAllocate() { | 115 void VideoCaptureDeviceAndroid::StopAndDeAllocate() { |
116 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 116 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
117 { | 117 { |
118 base::AutoLock lock(lock_); | 118 base::AutoLock lock(lock_); |
119 if (state_ != kConfigured && state_ != kError) | 119 if (state_ != kConfigured && state_ != kError) |
120 return; | 120 return; |
121 } | 121 } |
122 | 122 |
123 JNIEnv* env = AttachCurrentThread(); | 123 JNIEnv* env = AttachCurrentThread(); |
124 | 124 |
125 const jboolean ret = Java_VideoCapture_stopCapture(env, j_capture_.obj()); | 125 const jboolean ret = Java_VideoCapture_stopCapture(env, j_capture_); |
126 if (!ret) { | 126 if (!ret) { |
127 SetErrorState(FROM_HERE, "failed to stop capture"); | 127 SetErrorState(FROM_HERE, "failed to stop capture"); |
128 return; | 128 return; |
129 } | 129 } |
130 | 130 |
131 { | 131 { |
132 base::AutoLock lock(lock_); | 132 base::AutoLock lock(lock_); |
133 state_ = kIdle; | 133 state_ = kIdle; |
134 client_.reset(); | 134 client_.reset(); |
135 } | 135 } |
136 | 136 |
137 Java_VideoCapture_deallocate(env, j_capture_.obj()); | 137 Java_VideoCapture_deallocate(env, j_capture_); |
138 } | 138 } |
139 | 139 |
140 void VideoCaptureDeviceAndroid::TakePhoto(TakePhotoCallback callback) { | 140 void VideoCaptureDeviceAndroid::TakePhoto(TakePhotoCallback callback) { |
141 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 141 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
142 { | 142 { |
143 base::AutoLock lock(lock_); | 143 base::AutoLock lock(lock_); |
144 if (state_ != kConfigured) | 144 if (state_ != kConfigured) |
145 return; | 145 return; |
146 if (!got_first_frame_) { // We have to wait until we get the first frame. | 146 if (!got_first_frame_) { // We have to wait until we get the first frame. |
147 photo_requests_queue_.push_back( | 147 photo_requests_queue_.push_back( |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 base::android::JavaByteArrayToByteVector(env, data.obj(), &blob->data); | 341 base::android::JavaByteArrayToByteVector(env, data.obj(), &blob->data); |
342 blob->mime_type = blob->data.empty() ? "" : "image/jpeg"; | 342 blob->mime_type = blob->data.empty() ? "" : "image/jpeg"; |
343 cb->Run(std::move(blob)); | 343 cb->Run(std::move(blob)); |
344 | 344 |
345 photo_callbacks_.erase(reference_it); | 345 photo_callbacks_.erase(reference_it); |
346 } | 346 } |
347 | 347 |
348 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { | 348 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { |
349 JNIEnv* env = AttachCurrentThread(); | 349 JNIEnv* env = AttachCurrentThread(); |
350 const int current_capture_colorspace = | 350 const int current_capture_colorspace = |
351 Java_VideoCapture_getColorspace(env, j_capture_.obj()); | 351 Java_VideoCapture_getColorspace(env, j_capture_); |
352 switch (current_capture_colorspace) { | 352 switch (current_capture_colorspace) { |
353 case ANDROID_IMAGE_FORMAT_YV12: | 353 case ANDROID_IMAGE_FORMAT_YV12: |
354 return media::PIXEL_FORMAT_YV12; | 354 return media::PIXEL_FORMAT_YV12; |
355 case ANDROID_IMAGE_FORMAT_YUV_420_888: | 355 case ANDROID_IMAGE_FORMAT_YUV_420_888: |
356 return media::PIXEL_FORMAT_I420; | 356 return media::PIXEL_FORMAT_I420; |
357 case ANDROID_IMAGE_FORMAT_NV21: | 357 case ANDROID_IMAGE_FORMAT_NV21: |
358 return media::PIXEL_FORMAT_NV21; | 358 return media::PIXEL_FORMAT_NV21; |
359 case ANDROID_IMAGE_FORMAT_UNKNOWN: | 359 case ANDROID_IMAGE_FORMAT_UNKNOWN: |
360 default: | 360 default: |
361 return media::PIXEL_FORMAT_UNKNOWN; | 361 return media::PIXEL_FORMAT_UNKNOWN; |
(...skipping 20 matching lines...) Expand all Loading... |
382 DCHECK_EQ(kConfigured, state_); | 382 DCHECK_EQ(kConfigured, state_); |
383 DCHECK(got_first_frame_); | 383 DCHECK(got_first_frame_); |
384 } | 384 } |
385 #endif | 385 #endif |
386 JNIEnv* env = AttachCurrentThread(); | 386 JNIEnv* env = AttachCurrentThread(); |
387 | 387 |
388 // Make copy on the heap so we can pass the pointer through JNI. | 388 // Make copy on the heap so we can pass the pointer through JNI. |
389 std::unique_ptr<TakePhotoCallback> heap_callback( | 389 std::unique_ptr<TakePhotoCallback> heap_callback( |
390 new TakePhotoCallback(std::move(callback))); | 390 new TakePhotoCallback(std::move(callback))); |
391 const intptr_t callback_id = reinterpret_cast<intptr_t>(heap_callback.get()); | 391 const intptr_t callback_id = reinterpret_cast<intptr_t>(heap_callback.get()); |
392 if (!Java_VideoCapture_takePhoto(env, j_capture_.obj(), callback_id)) | 392 if (!Java_VideoCapture_takePhoto(env, j_capture_, callback_id)) |
393 return; | 393 return; |
394 | 394 |
395 { | 395 { |
396 base::AutoLock lock(photo_callbacks_lock_); | 396 base::AutoLock lock(photo_callbacks_lock_); |
397 photo_callbacks_.push_back(std::move(heap_callback)); | 397 photo_callbacks_.push_back(std::move(heap_callback)); |
398 } | 398 } |
399 } | 399 } |
400 | 400 |
401 void VideoCaptureDeviceAndroid::DoGetPhotoCapabilities( | 401 void VideoCaptureDeviceAndroid::DoGetPhotoCapabilities( |
402 GetPhotoCapabilitiesCallback callback) { | 402 GetPhotoCapabilitiesCallback callback) { |
403 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 403 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
404 #if DCHECK_IS_ON() | 404 #if DCHECK_IS_ON() |
405 { | 405 { |
406 base::AutoLock lock(lock_); | 406 base::AutoLock lock(lock_); |
407 DCHECK_EQ(kConfigured, state_); | 407 DCHECK_EQ(kConfigured, state_); |
408 DCHECK(got_first_frame_); | 408 DCHECK(got_first_frame_); |
409 } | 409 } |
410 #endif | 410 #endif |
411 JNIEnv* env = AttachCurrentThread(); | 411 JNIEnv* env = AttachCurrentThread(); |
412 | 412 |
413 PhotoCapabilities caps( | 413 PhotoCapabilities caps( |
414 Java_VideoCapture_getPhotoCapabilities(env, j_capture_.obj())); | 414 Java_VideoCapture_getPhotoCapabilities(env, j_capture_)); |
415 | 415 |
416 // TODO(mcasas): Manual member copying sucks, consider adding typemapping from | 416 // TODO(mcasas): Manual member copying sucks, consider adding typemapping from |
417 // PhotoCapabilities to mojom::PhotoCapabilitiesPtr, https://crbug.com/622002. | 417 // PhotoCapabilities to mojom::PhotoCapabilitiesPtr, https://crbug.com/622002. |
418 mojom::PhotoCapabilitiesPtr photo_capabilities = | 418 mojom::PhotoCapabilitiesPtr photo_capabilities = |
419 mojom::PhotoCapabilities::New(); | 419 mojom::PhotoCapabilities::New(); |
420 photo_capabilities->iso = mojom::Range::New(); | 420 photo_capabilities->iso = mojom::Range::New(); |
421 photo_capabilities->iso->current = caps.getCurrentIso(); | 421 photo_capabilities->iso->current = caps.getCurrentIso(); |
422 photo_capabilities->iso->max = caps.getMaxIso(); | 422 photo_capabilities->iso->max = caps.getMaxIso(); |
423 photo_capabilities->iso->min = caps.getMinIso(); | 423 photo_capabilities->iso->min = caps.getMinIso(); |
424 photo_capabilities->height = mojom::Range::New(); | 424 photo_capabilities->height = mojom::Range::New(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 case mojom::FocusMode::CONTINUOUS: | 480 case mojom::FocusMode::CONTINUOUS: |
481 focus_mode = PhotoCapabilities::AndroidFocusMode::CONTINUOUS; | 481 focus_mode = PhotoCapabilities::AndroidFocusMode::CONTINUOUS; |
482 break; | 482 break; |
483 case mojom::FocusMode::UNAVAILABLE: | 483 case mojom::FocusMode::UNAVAILABLE: |
484 focus_mode = PhotoCapabilities::AndroidFocusMode::UNAVAILABLE; | 484 focus_mode = PhotoCapabilities::AndroidFocusMode::UNAVAILABLE; |
485 break; | 485 break; |
486 } | 486 } |
487 } | 487 } |
488 | 488 |
489 Java_VideoCapture_setPhotoOptions( | 489 Java_VideoCapture_setPhotoOptions( |
490 env, j_capture_.obj(), zoom, static_cast<int>(focus_mode), width, height); | 490 env, j_capture_, zoom, static_cast<int>(focus_mode), width, height); |
491 | 491 |
492 callback.Run(true); | 492 callback.Run(true); |
493 } | 493 } |
494 | 494 |
495 } // namespace media | 495 } // namespace media |
OLD | NEW |