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 |