Index: webrtc/modules/video_capture/android/video_capture_android.cc |
diff --git a/webrtc/modules/video_capture/android/video_capture_android.cc b/webrtc/modules/video_capture/android/video_capture_android.cc |
deleted file mode 100644 |
index 272cec42f9fe02330bf27f8f27adda5b04764cc5..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/video_capture/android/video_capture_android.cc |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-/* |
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include "webrtc/modules/video_capture/android/video_capture_android.h" |
- |
-#include "webrtc/base/common.h" |
-#include "webrtc/modules/utility/interface/helpers_android.h" |
-#include "webrtc/modules/video_capture/android/device_info_android.h" |
-#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
-#include "webrtc/system_wrappers/interface/logcat_trace_context.h" |
-#include "webrtc/system_wrappers/interface/logging.h" |
-#include "webrtc/system_wrappers/interface/ref_count.h" |
-#include "webrtc/system_wrappers/interface/trace.h" |
- |
-static JavaVM* g_jvm = NULL; |
-static jclass g_java_capturer_class = NULL; // VideoCaptureAndroid.class. |
-static jobject g_context = NULL; // Owned android.content.Context. |
- |
-namespace webrtc { |
- |
-// Called by Java to get the global application context. |
-jobject JNICALL GetContext(JNIEnv* env, jclass) { |
- assert(g_context); |
- return g_context; |
-} |
- |
-// Called by Java when the camera has a new frame to deliver. |
-void JNICALL ProvideCameraFrame( |
- JNIEnv* env, |
- jobject, |
- jbyteArray javaCameraFrame, |
- jint length, |
- jint rotation, |
- jlong timeStamp, |
- jlong context) { |
- webrtc::videocapturemodule::VideoCaptureAndroid* captureModule = |
- reinterpret_cast<webrtc::videocapturemodule::VideoCaptureAndroid*>( |
- context); |
- jbyte* cameraFrame = env->GetByteArrayElements(javaCameraFrame, NULL); |
- captureModule->OnIncomingFrame( |
- reinterpret_cast<uint8_t*>(cameraFrame), length, rotation, 0); |
- env->ReleaseByteArrayElements(javaCameraFrame, cameraFrame, JNI_ABORT); |
-} |
- |
-int32_t SetCaptureAndroidVM(JavaVM* javaVM, jobject context) { |
- if (javaVM) { |
- assert(!g_jvm); |
- g_jvm = javaVM; |
- AttachThreadScoped ats(g_jvm); |
- g_context = ats.env()->NewGlobalRef(context); |
- |
- videocapturemodule::DeviceInfoAndroid::Initialize(ats.env()); |
- |
- jclass j_capture_class = |
- ats.env()->FindClass("org/webrtc/videoengine/VideoCaptureAndroid"); |
- assert(j_capture_class); |
- g_java_capturer_class = |
- reinterpret_cast<jclass>(ats.env()->NewGlobalRef(j_capture_class)); |
- assert(g_java_capturer_class); |
- |
- JNINativeMethod native_methods[] = { |
- {"GetContext", |
- "()Landroid/content/Context;", |
- reinterpret_cast<void*>(&GetContext)}, |
- {"ProvideCameraFrame", |
- "([BIIJJ)V", |
- reinterpret_cast<void*>(&ProvideCameraFrame)}}; |
- if (ats.env()->RegisterNatives(g_java_capturer_class, |
- native_methods, 2) != 0) |
- assert(false); |
- } else { |
- if (g_jvm) { |
- AttachThreadScoped ats(g_jvm); |
- ats.env()->UnregisterNatives(g_java_capturer_class); |
- ats.env()->DeleteGlobalRef(g_java_capturer_class); |
- g_java_capturer_class = NULL; |
- ats.env()->DeleteGlobalRef(g_context); |
- g_context = NULL; |
- videocapturemodule::DeviceInfoAndroid::DeInitialize(); |
- g_jvm = NULL; |
- } |
- } |
- |
- return 0; |
-} |
- |
-namespace videocapturemodule { |
- |
-VideoCaptureModule* VideoCaptureImpl::Create( |
- const int32_t id, |
- const char* deviceUniqueIdUTF8) { |
- RefCountImpl<videocapturemodule::VideoCaptureAndroid>* implementation = |
- new RefCountImpl<videocapturemodule::VideoCaptureAndroid>(id); |
- if (implementation->Init(id, deviceUniqueIdUTF8) != 0) { |
- delete implementation; |
- implementation = NULL; |
- } |
- return implementation; |
-} |
- |
-int32_t VideoCaptureAndroid::OnIncomingFrame(uint8_t* videoFrame, |
- size_t videoFrameLength, |
- int32_t degrees, |
- int64_t captureTime) { |
- if (!_captureStarted) |
- return 0; |
- VideoRotation current_rotation = |
- (degrees <= 45 || degrees > 315) ? kVideoRotation_0 : |
- (degrees > 45 && degrees <= 135) ? kVideoRotation_90 : |
- (degrees > 135 && degrees <= 225) ? kVideoRotation_180 : |
- (degrees > 225 && degrees <= 315) ? kVideoRotation_270 : |
- kVideoRotation_0; // Impossible. |
- if (_rotation != current_rotation) { |
- LOG(LS_INFO) << "New camera rotation: " << degrees; |
- _rotation = current_rotation; |
- int32_t status = VideoCaptureImpl::SetCaptureRotation(_rotation); |
- if (status != 0) |
- return status; |
- } |
- return IncomingFrame( |
- videoFrame, videoFrameLength, _captureCapability, captureTime); |
-} |
- |
-VideoCaptureAndroid::VideoCaptureAndroid(const int32_t id) |
- : VideoCaptureImpl(id), |
- _deviceInfo(id), |
- _jCapturer(NULL), |
- _captureStarted(false) { |
-} |
- |
-int32_t VideoCaptureAndroid::Init(const int32_t id, |
- const char* deviceUniqueIdUTF8) { |
- const int nameLength = strlen(deviceUniqueIdUTF8); |
- if (nameLength >= kVideoCaptureUniqueNameLength) |
- return -1; |
- |
- // Store the device name |
- LOG(LS_INFO) << "VideoCaptureAndroid::Init: " << deviceUniqueIdUTF8; |
- size_t camera_id = 0; |
- if (!_deviceInfo.FindCameraIndex(deviceUniqueIdUTF8, &camera_id)) |
- return -1; |
- _deviceUniqueId = new char[nameLength + 1]; |
- memcpy(_deviceUniqueId, deviceUniqueIdUTF8, nameLength + 1); |
- |
- AttachThreadScoped ats(g_jvm); |
- JNIEnv* env = ats.env(); |
- jmethodID ctor = env->GetMethodID(g_java_capturer_class, "<init>", "(IJ)V"); |
- assert(ctor); |
- jlong j_this = reinterpret_cast<intptr_t>(this); |
- _jCapturer = env->NewGlobalRef( |
- env->NewObject(g_java_capturer_class, ctor, camera_id, j_this)); |
- assert(_jCapturer); |
- _rotation = kVideoRotation_0; |
- return 0; |
-} |
- |
-VideoCaptureAndroid::~VideoCaptureAndroid() { |
- // Ensure Java camera is released even if our caller didn't explicitly Stop. |
- if (_captureStarted) |
- StopCapture(); |
- AttachThreadScoped ats(g_jvm); |
- ats.env()->DeleteGlobalRef(_jCapturer); |
-} |
- |
-int32_t VideoCaptureAndroid::StartCapture( |
- const VideoCaptureCapability& capability) { |
- CriticalSectionScoped cs(&_apiCs); |
- AttachThreadScoped ats(g_jvm); |
- JNIEnv* env = ats.env(); |
- |
- if (_deviceInfo.GetBestMatchedCapability( |
- _deviceUniqueId, capability, _captureCapability) < 0) { |
- WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, -1, |
- "%s: GetBestMatchedCapability failed: %dx%d", |
- __FUNCTION__, capability.width, capability.height); |
- return -1; |
- } |
- |
- _captureDelay = _captureCapability.expectedCaptureDelay; |
- |
- jmethodID j_start = |
- env->GetMethodID(g_java_capturer_class, "startCapture", "(IIII)Z"); |
- assert(j_start); |
- int min_mfps = 0; |
- int max_mfps = 0; |
- _deviceInfo.GetMFpsRange(_deviceUniqueId, _captureCapability.maxFPS, |
- &min_mfps, &max_mfps); |
- bool started = env->CallBooleanMethod(_jCapturer, j_start, |
- _captureCapability.width, |
- _captureCapability.height, |
- min_mfps, max_mfps); |
- if (started) { |
- _requestedCapability = capability; |
- _captureStarted = true; |
- } |
- return started ? 0 : -1; |
-} |
- |
-int32_t VideoCaptureAndroid::StopCapture() { |
- _apiCs.Enter(); |
- AttachThreadScoped ats(g_jvm); |
- JNIEnv* env = ats.env(); |
- |
- memset(&_requestedCapability, 0, sizeof(_requestedCapability)); |
- memset(&_captureCapability, 0, sizeof(_captureCapability)); |
- _captureStarted = false; |
- // Exit critical section to avoid blocking camera thread inside |
- // onIncomingFrame() call. |
- _apiCs.Leave(); |
- |
- jmethodID j_stop = |
- env->GetMethodID(g_java_capturer_class, "stopCapture", "()Z"); |
- return env->CallBooleanMethod(_jCapturer, j_stop) ? 0 : -1; |
-} |
- |
-bool VideoCaptureAndroid::CaptureStarted() { |
- CriticalSectionScoped cs(&_apiCs); |
- return _captureStarted; |
-} |
- |
-int32_t VideoCaptureAndroid::CaptureSettings( |
- VideoCaptureCapability& settings) { |
- CriticalSectionScoped cs(&_apiCs); |
- settings = _requestedCapability; |
- return 0; |
-} |
- |
-int32_t VideoCaptureAndroid::SetCaptureRotation(VideoRotation rotation) { |
- int32_t status = VideoCaptureImpl::SetCaptureRotation(rotation); |
- if (status != 0) |
- return status; |
- |
- AttachThreadScoped ats(g_jvm); |
- JNIEnv* env = ats.env(); |
- |
- jmethodID j_spr = |
- env->GetMethodID(g_java_capturer_class, "setPreviewRotation", "(I)V"); |
- assert(j_spr); |
- int rotation_degrees; |
- if (RotationInDegrees(rotation, &rotation_degrees) != 0) { |
- assert(false); |
- } |
- env->CallVoidMethod(_jCapturer, j_spr, rotation_degrees); |
- return 0; |
-} |
- |
-} // namespace videocapturemodule |
-} // namespace webrtc |