| Index: talk/app/webrtc/java/jni/androidvideocapturer_jni.cc
|
| diff --git a/talk/app/webrtc/java/jni/androidvideocapturer_jni.cc b/talk/app/webrtc/java/jni/androidvideocapturer_jni.cc
|
| index eae87bd8ce2894b1a7598701550eaf208f67c3e1..74a9372d866e1d8042f478bedc46aeacf4f50814 100644
|
| --- a/talk/app/webrtc/java/jni/androidvideocapturer_jni.cc
|
| +++ b/talk/app/webrtc/java/jni/androidvideocapturer_jni.cc
|
| @@ -176,13 +176,13 @@
|
| success);
|
| }
|
|
|
| -void AndroidVideoCapturerJni::OnIncomingFrame(const uint8_t* video_frame,
|
| +void AndroidVideoCapturerJni::OnIncomingFrame(void* video_frame,
|
| int length,
|
| int width,
|
| int height,
|
| int rotation,
|
| int64 time_stamp) {
|
| - const uint8_t* y_plane = video_frame;
|
| + const uint8_t* y_plane = static_cast<uint8_t*>(video_frame);
|
| // Android guarantees that the stride is a multiple of 16.
|
| // http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewFormat%28int%29
|
| int y_stride;
|
| @@ -215,14 +215,20 @@
|
| JNIEnv* AndroidVideoCapturerJni::jni() { return AttachCurrentThreadIfNeeded(); }
|
|
|
| JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeOnFrameCaptured)
|
| - (JNIEnv* jni, jclass, jlong j_capturer, jobject j_byte_buffer,
|
| + (JNIEnv* jni, jclass, jlong j_capturer, jbyteArray j_frame, jint length,
|
| jint width, jint height, jint rotation, jlong ts) {
|
| - const uint8_t* bytes =
|
| - static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_byte_buffer));
|
| - const int length = jni->GetDirectBufferCapacity(j_byte_buffer);
|
| - RTC_CHECK(bytes != nullptr && length != -1) << "ByteBuffer is not direct";
|
| + jboolean is_copy = true;
|
| + jbyte* bytes = jni->GetByteArrayElements(j_frame, &is_copy);
|
| + // If this is a copy of the original frame, it means that the memory
|
| + // is not direct memory and thus VideoCapturerAndroid does not guarantee
|
| + // that the memory is valid when we have released |j_frame|.
|
| + // TODO(magjed): Move ReleaseByteArrayElements() into ReturnBuffer() and
|
| + // remove this check.
|
| + RTC_CHECK(!is_copy)
|
| + << "NativeObserver_nativeOnFrameCaptured: frame is a copy";
|
| reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)
|
| ->OnIncomingFrame(bytes, length, width, height, rotation, ts);
|
| + jni->ReleaseByteArrayElements(j_frame, bytes, JNI_ABORT);
|
| }
|
|
|
| JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeCapturerStarted)
|
|
|