1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/video/capture/android/video_capture_device_factory_android.h"
7 #include "base/android/jni_string.h"
8 #include "base/android/scoped_java_ref.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/stringprintf.h"
11 #include "jni/VideoCaptureFactory_jni.h"
12 #include "media/video/capture/android/video_capture_device_android.h"
14 using base::android::AttachCurrentThread
;
15 using base::android::ScopedJavaLocalRef
;
20 bool VideoCaptureDeviceFactoryAndroid::RegisterVideoCaptureDeviceFactory(
22 return RegisterNativesImpl(env
);
26 ScopedJavaLocalRef
<jobject
>
27 VideoCaptureDeviceFactoryAndroid::createVideoCaptureAndroid(
29 jlong nativeVideoCaptureDeviceAndroid
) {
30 return (Java_VideoCaptureFactory_createVideoCapture(
31 AttachCurrentThread(),
32 base::android::GetApplicationContext(),
34 nativeVideoCaptureDeviceAndroid
));
37 scoped_ptr
<VideoCaptureDevice
> VideoCaptureDeviceFactoryAndroid::Create(
38 const VideoCaptureDevice::Name
& device_name
) {
39 DCHECK(thread_checker_
.CalledOnValidThread());
41 if (!base::StringToInt(device_name
.id(), &id
))
42 return scoped_ptr
<VideoCaptureDevice
>();
44 scoped_ptr
<VideoCaptureDeviceAndroid
> video_capture_device(
45 new VideoCaptureDeviceAndroid(device_name
));
47 if (video_capture_device
->Init())
48 return video_capture_device
.Pass();
50 DLOG(ERROR
) << "Error creating Video Capture Device.";
51 return scoped_ptr
<VideoCaptureDevice
>();
54 void VideoCaptureDeviceFactoryAndroid::GetDeviceNames(
55 VideoCaptureDevice::Names
* device_names
) {
56 DCHECK(thread_checker_
.CalledOnValidThread());
57 device_names
->clear();
59 JNIEnv
* env
= AttachCurrentThread();
61 const jobject context
= base::android::GetApplicationContext();
62 const int num_cameras
= Java_VideoCaptureFactory_getNumberOfCameras(env
,
64 DVLOG(1) << "VideoCaptureDevice::GetDeviceNames: num_cameras=" << num_cameras
;
68 for (int camera_id
= num_cameras
- 1; camera_id
>= 0; --camera_id
) {
69 base::android::ScopedJavaLocalRef
<jstring
> device_name
=
70 Java_VideoCaptureFactory_getDeviceName(env
, camera_id
, context
);
71 if (device_name
.obj() == NULL
)
74 VideoCaptureDevice::Name
name(
75 base::android::ConvertJavaStringToUTF8(device_name
),
76 base::IntToString(camera_id
));
77 device_names
->push_back(name
);
79 DVLOG(1) << "VideoCaptureDeviceFactoryAndroid::GetDeviceNames: camera "
80 << "device_name=" << name
.name() << ", unique_id=" << name
.id();
84 void VideoCaptureDeviceFactoryAndroid::GetDeviceSupportedFormats(
85 const VideoCaptureDevice::Name
& device
,
86 VideoCaptureFormats
* capture_formats
) {
87 DCHECK(thread_checker_
.CalledOnValidThread());
89 if (!base::StringToInt(device
.id(), &id
))
91 JNIEnv
* env
= AttachCurrentThread();
92 base::android::ScopedJavaLocalRef
<jobjectArray
> collected_formats
=
93 Java_VideoCaptureFactory_getDeviceSupportedFormats(env
,
94 base::android::GetApplicationContext(), id
);
95 if (collected_formats
.is_null())
98 jsize num_formats
= env
->GetArrayLength(collected_formats
.obj());
99 for (int i
= 0; i
< num_formats
; ++i
) {
100 base::android::ScopedJavaLocalRef
<jobject
> format(
101 env
, env
->GetObjectArrayElement(collected_formats
.obj(), i
));
103 VideoPixelFormat pixel_format
= media::PIXEL_FORMAT_UNKNOWN
;
104 switch (media::Java_VideoCaptureFactory_getCaptureFormatPixelFormat(
105 env
, format
.obj())) {
106 case VideoCaptureDeviceAndroid::ANDROID_IMAGE_FORMAT_YV12
:
107 pixel_format
= media::PIXEL_FORMAT_YV12
;
109 case VideoCaptureDeviceAndroid::ANDROID_IMAGE_FORMAT_NV21
:
110 pixel_format
= media::PIXEL_FORMAT_NV21
;
115 VideoCaptureFormat
capture_format(
116 gfx::Size(media::Java_VideoCaptureFactory_getCaptureFormatWidth(env
,
118 media::Java_VideoCaptureFactory_getCaptureFormatHeight(env
,
120 media::Java_VideoCaptureFactory_getCaptureFormatFramerate(env
,
123 capture_formats
->push_back(capture_format
);
124 DVLOG(1) << device
.name() << " " << capture_format
.ToString();
129 VideoCaptureDeviceFactory
*
130 VideoCaptureDeviceFactory::CreateVideoCaptureDeviceFactory(
131 scoped_refptr
<base::SingleThreadTaskRunner
> ui_task_runner
) {
132 return new VideoCaptureDeviceFactoryAndroid();