| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 return JavaToStdString(jni(), j_json_caps); | 169 return JavaToStdString(jni(), j_json_caps); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void AndroidVideoCapturerJni::OnCapturerStarted(bool success) { | 172 void AndroidVideoCapturerJni::OnCapturerStarted(bool success) { |
| 173 LOG(LS_INFO) << "AndroidVideoCapturerJni capture started: " << success; | 173 LOG(LS_INFO) << "AndroidVideoCapturerJni capture started: " << success; |
| 174 AsyncCapturerInvoke("OnCapturerStarted", | 174 AsyncCapturerInvoke("OnCapturerStarted", |
| 175 &webrtc::AndroidVideoCapturer::OnCapturerStarted, | 175 &webrtc::AndroidVideoCapturer::OnCapturerStarted, |
| 176 success); | 176 success); |
| 177 } | 177 } |
| 178 | 178 |
| 179 void AndroidVideoCapturerJni::OnIncomingFrame(void* video_frame, | 179 void AndroidVideoCapturerJni::OnIncomingFrame(const uint8_t* video_frame, |
| 180 int length, | 180 int length, |
| 181 int width, | 181 int width, |
| 182 int height, | 182 int height, |
| 183 int rotation, | 183 int rotation, |
| 184 int64 time_stamp) { | 184 int64 time_stamp) { |
| 185 const uint8_t* y_plane = static_cast<uint8_t*>(video_frame); | 185 const uint8_t* y_plane = video_frame; |
| 186 // Android guarantees that the stride is a multiple of 16. | 186 // Android guarantees that the stride is a multiple of 16. |
| 187 // http://developer.android.com/reference/android/hardware/Camera.Parameters.h
tml#setPreviewFormat%28int%29 | 187 // http://developer.android.com/reference/android/hardware/Camera.Parameters.h
tml#setPreviewFormat%28int%29 |
| 188 int y_stride; | 188 int y_stride; |
| 189 int uv_stride; | 189 int uv_stride; |
| 190 webrtc::Calc16ByteAlignedStride(width, &y_stride, &uv_stride); | 190 webrtc::Calc16ByteAlignedStride(width, &y_stride, &uv_stride); |
| 191 const uint8_t* v_plane = y_plane + y_stride * height; | 191 const uint8_t* v_plane = y_plane + y_stride * height; |
| 192 const uint8_t* u_plane = | 192 const uint8_t* u_plane = |
| 193 v_plane + uv_stride * webrtc::AlignInt(height, 2) / 2; | 193 v_plane + uv_stride * webrtc::AlignInt(height, 2) / 2; |
| 194 | 194 |
| 195 // Wrap the Java buffer, and call ReturnBuffer() in the wrapped | 195 // Wrap the Java buffer, and call ReturnBuffer() in the wrapped |
| (...skipping 12 matching lines...) Expand all Loading... |
| 208 int height, | 208 int height, |
| 209 int fps) { | 209 int fps) { |
| 210 AsyncCapturerInvoke("OnOutputFormatRequest", | 210 AsyncCapturerInvoke("OnOutputFormatRequest", |
| 211 &webrtc::AndroidVideoCapturer::OnOutputFormatRequest, | 211 &webrtc::AndroidVideoCapturer::OnOutputFormatRequest, |
| 212 width, height, fps); | 212 width, height, fps); |
| 213 } | 213 } |
| 214 | 214 |
| 215 JNIEnv* AndroidVideoCapturerJni::jni() { return AttachCurrentThreadIfNeeded(); } | 215 JNIEnv* AndroidVideoCapturerJni::jni() { return AttachCurrentThreadIfNeeded(); } |
| 216 | 216 |
| 217 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeOnFrameCaptured) | 217 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeOnFrameCaptured) |
| 218 (JNIEnv* jni, jclass, jlong j_capturer, jbyteArray j_frame, jint length, | 218 (JNIEnv* jni, jclass, jlong j_capturer, jobject j_byte_buffer, |
| 219 jint width, jint height, jint rotation, jlong ts) { | 219 jint width, jint height, jint rotation, jlong ts) { |
| 220 jboolean is_copy = true; | 220 const uint8_t* bytes = |
| 221 jbyte* bytes = jni->GetByteArrayElements(j_frame, &is_copy); | 221 static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_byte_buffer)); |
| 222 // If this is a copy of the original frame, it means that the memory | 222 const int length = jni->GetDirectBufferCapacity(j_byte_buffer); |
| 223 // is not direct memory and thus VideoCapturerAndroid does not guarantee | 223 RTC_CHECK(bytes != nullptr && length != -1) << "ByteBuffer is not direct"; |
| 224 // that the memory is valid when we have released |j_frame|. | |
| 225 // TODO(magjed): Move ReleaseByteArrayElements() into ReturnBuffer() and | |
| 226 // remove this check. | |
| 227 RTC_CHECK(!is_copy) | |
| 228 << "NativeObserver_nativeOnFrameCaptured: frame is a copy"; | |
| 229 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer) | 224 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer) |
| 230 ->OnIncomingFrame(bytes, length, width, height, rotation, ts); | 225 ->OnIncomingFrame(bytes, length, width, height, rotation, ts); |
| 231 jni->ReleaseByteArrayElements(j_frame, bytes, JNI_ABORT); | |
| 232 } | 226 } |
| 233 | 227 |
| 234 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeCapturerStarted) | 228 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeCapturerStarted) |
| 235 (JNIEnv* jni, jclass, jlong j_capturer, jboolean j_success) { | 229 (JNIEnv* jni, jclass, jlong j_capturer, jboolean j_success) { |
| 236 LOG(LS_INFO) << "NativeObserver_nativeCapturerStarted"; | 230 LOG(LS_INFO) << "NativeObserver_nativeCapturerStarted"; |
| 237 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnCapturerStarted( | 231 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnCapturerStarted( |
| 238 j_success); | 232 j_success); |
| 239 } | 233 } |
| 240 | 234 |
| 241 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeOnOutputFormatRequest) | 235 JOW(void, VideoCapturerAndroid_00024NativeObserver_nativeOnOutputFormatRequest) |
| 242 (JNIEnv* jni, jclass, jlong j_capturer, jint j_width, jint j_height, | 236 (JNIEnv* jni, jclass, jlong j_capturer, jint j_width, jint j_height, |
| 243 jint j_fps) { | 237 jint j_fps) { |
| 244 LOG(LS_INFO) << "NativeObserver_nativeOnOutputFormatRequest"; | 238 LOG(LS_INFO) << "NativeObserver_nativeOnOutputFormatRequest"; |
| 245 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnOutputFormatRequest( | 239 reinterpret_cast<AndroidVideoCapturerJni*>(j_capturer)->OnOutputFormatRequest( |
| 246 j_width, j_height, j_fps); | 240 j_width, j_height, j_fps); |
| 247 } | 241 } |
| 248 | 242 |
| 249 } // namespace webrtc_jni | 243 } // namespace webrtc_jni |
| OLD | NEW |