Commit 86e26b25 authored by emircan's avatar emircan Committed by Commit bot

I extended the current CaptureAPIType exposure on chrome://media-internals...

I extended the current CaptureAPIType exposure on chrome://media-internals page to work on ANDROID with the enum types defined below.

    enum CaptureApiType {
      API1,
      API2_LEGACY,
      API2_FULL,
      API2_LIMITED,
      TANGO,
      API_TYPE_UNKNOWN
    };

Enums are sourced from media/video/capture/video_capture_device.h file and auto-generated on the Android Java side by using java_cpp_enum scripts. They correspond to the same int values, and this is how it is communicated to cpp side on media/video/capture/android/video_capture_device_factory_android.cc.

                        +------------+
                        |VideoCapture|
                        +--+-------+-+
                           |       |
          +----------------+-+   +-+-----------------+
          |VideoCaptureCamera|   |VideoCaptureCamera2|
          +---+------------+-+   +-------------------+
              |            |
+-------------+-----+  ----+-------------+
|VideoCaptureAndroid|  |VideoCaptureTango|
+-------------------+  +-----------------+

On Java side, camera class structure is as above. CaptureApiType is defined by static getCaptureApiType() methods in each child.

Note that media/video/capture/android/imageformat_list.h is deleted as it is currently not used. Instead, enums defined on media/video/capture/android/video_capture_device_factory_android.h were autogenerated on Java side using java_cpp_enum scripts.

BUG=458743

TEST=Built with gyp and deployed:
- on Nexus 7, shows API2_LEGACY
- on Nexus 5, shows API2_LIMITED for front camera and API2_FULL for back camera
I added Android tests to MediaInternalsVideoCaptureDeviceTest.* and tested on Nexus 7.
Looked for the adding unittests on video_capture_device_unittest but ANDROID tests are currently disabled with a TODO specified[0]. I will investigate further, but let me know if you have suggestions.

[0] https://code.google.com/p/chromium/codesearch#chromium/src/media/video/capture/video_capture_device_unittest.cc&l=42

Review URL: https://codereview.chromium.org/1014943005

Cr-Commit-Position: refs/heads/master@{#322066}
parent a5c808a0
......@@ -487,10 +487,10 @@ void MediaInternals::UpdateVideoCaptureDeviceCapabilities(
device_dict->SetString(
"name", video_capture_device_info.name.GetNameAndModel());
device_dict->Set("formats", format_list);
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_ANDROID)
device_dict->SetString(
"captureApi",
video_capture_device_info.name.GetCaptureApiTypeString());
"captureApi", video_capture_device_info.name.GetCaptureApiTypeString());
#endif
video_capture_capabilities_cached_data_.Append(device_dict);
}
......
......@@ -109,7 +109,8 @@ class MediaInternalsVideoCaptureDeviceTest : public testing::Test,
MediaInternals::UpdateCallback update_cb_;
};
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_ANDROID)
TEST_F(MediaInternalsVideoCaptureDeviceTest,
AllCaptureApiTypesHaveProperStringRepresentation) {
typedef media::VideoCaptureDevice::Name VideoCaptureDeviceName;
......@@ -128,6 +129,12 @@ TEST_F(MediaInternalsVideoCaptureDeviceTest,
m[VideoCaptureDeviceName::AVFOUNDATION] = "AV Foundation";
m[VideoCaptureDeviceName::QTKIT] = "QTKit";
m[VideoCaptureDeviceName::DECKLINK] = "DeckLink";
#elif defined(OS_ANDROID)
m[VideoCaptureDeviceName::API1] = "Camera API1";
m[VideoCaptureDeviceName::API2_LEGACY] = "Camera API2 Legacy";
m[VideoCaptureDeviceName::API2_FULL] = "Camera API2 Full";
m[VideoCaptureDeviceName::API2_LIMITED] = "Camera API2 Limited";
m[VideoCaptureDeviceName::TANGO] = "Tango API";
#endif
EXPECT_EQ(media::VideoCaptureDevice::Name::API_TYPE_UNKNOWN, m.size());
for (CaptureApiTypeStringMap::iterator it = m.begin(); it != m.end(); ++it) {
......@@ -179,6 +186,9 @@ TEST_F(MediaInternalsVideoCaptureDeviceTest,
media::VideoCaptureDevice::Name(
"dummy", "/dev/dummy",
media::VideoCaptureDevice::Name::V4L2_SINGLE_PLANE),
#elif defined(OS_ANDROID)
media::VideoCaptureDevice::Name("dummy", "dummy",
media::VideoCaptureDevice::Name::API2_LEGACY),
#else
media::VideoCaptureDevice::Name("dummy", "dummy"),
#endif
......@@ -207,6 +217,8 @@ TEST_F(MediaInternalsVideoCaptureDeviceTest,
ExpectString("captureApi", "Direct Show");
#elif defined(OS_MACOSX)
ExpectString("captureApi", "QTKit");
#elif defined(OS_ANDROID)
ExpectString("captureApi", "Camera API2 Legacy");
#endif
}
......
......@@ -99,9 +99,11 @@ generate_jni("video_capture_jni_headers") {
java_cpp_enum("media_java_enums_srcjar") {
sources = [
"//media/video/capture/android/video_capture_device_android.h",
"//media/video/capture/video_capture_device.h",
]
outputs = [
"org/chromium/media/AndroidImageFormat.java",
"org/chromium/media/CaptureApiType.java",
]
}
......
......@@ -51,9 +51,17 @@ public class VideoCaptureAndroid extends VideoCaptureCamera {
return android.hardware.Camera.getNumberOfCameras();
}
static int getCaptureApiType(int id) {
if (VideoCaptureCamera.getCameraInfo(id) == null) {
return CaptureApiType.API_TYPE_UNKNOWN;
}
return CaptureApiType.API1;
}
static String getName(int id) {
android.hardware.Camera.CameraInfo cameraInfo = VideoCaptureCamera.getCameraInfo(id);
if (cameraInfo == null) return null;
return "camera " + id + ", facing " + (cameraInfo.facing
== android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT ? "front" : "back");
}
......
......@@ -303,6 +303,27 @@ public class VideoCaptureCamera2 extends VideoCapture {
}
}
static int getCaptureApiType(int id, Context appContext) {
final CameraCharacteristics cameraCharacteristics =
getCameraCharacteristics(appContext, id);
if (cameraCharacteristics == null) {
return CaptureApiType.API_TYPE_UNKNOWN;
}
final int supportedHWLevel = cameraCharacteristics.get(
CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
switch (supportedHWLevel) {
case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:
return CaptureApiType.API2_LEGACY;
case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
return CaptureApiType.API2_FULL;
case CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
return CaptureApiType.API2_LIMITED;
default:
return CaptureApiType.API2_LEGACY;
}
}
static String getName(int id, Context appContext) {
final CameraCharacteristics cameraCharacteristics =
getCameraCharacteristics(appContext, id);
......
......@@ -116,6 +116,18 @@ class VideoCaptureFactory {
return ChromiumCameraInfo.getNumberOfCameras(appContext);
}
@CalledByNative
static int getCaptureApiType(int id, Context appContext) {
if (isLReleaseOrLater()) {
return VideoCaptureCamera2.getCaptureApiType(id, appContext);
} else if (ChromiumCameraInfo.isSpecialCamera(id)) {
return VideoCaptureTango.getCaptureApiType(
ChromiumCameraInfo.toSpecialCameraId(id));
} else {
return VideoCaptureAndroid.getCaptureApiType(id);
}
}
@CalledByNative
static String getDeviceName(int id, Context appContext) {
if (isLReleaseOrLater() && !VideoCaptureCamera2.isLegacyDevice(appContext, id)) {
......
......@@ -67,6 +67,13 @@ public class VideoCaptureTango extends VideoCaptureCamera {
return CAM_PARAMS.length;
}
static int getCaptureApiType(int index) {
if (index >= CAM_PARAMS.length) {
return CaptureApiType.API1;
}
return CaptureApiType.TANGO;
}
static String getName(int index) {
if (index >= CAM_PARAMS.length) return "";
return CAM_PARAMS[index].mName;
......
......@@ -1822,6 +1822,7 @@
'type': 'none',
'dependencies': [
'../base/base.gyp:base',
'media_android_captureapitype',
'media_android_imageformat',
],
'export_dependent_settings': [
......@@ -1832,6 +1833,15 @@
},
'includes': ['../build/java.gypi'],
},
{
# GN: //media/base/android:media_android_captureapitype
'target_name': 'media_android_captureapitype',
'type': 'none',
'variables': {
'source_file': 'video/capture/video_capture_device.h',
},
'includes': [ '../build/android/java_cpp_enum.gypi' ],
},
{
# GN: //media/base/android:media_android_imageformat
'target_name': 'media_android_imageformat',
......
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file intentionally does not have header guards, it's included
// inside a macro to generate enum and a java class for the values.
#ifndef DEFINE_ANDROID_IMAGEFORMAT
#error "DEFINE_ANDROID_IMAGEFORMAT should be defined."
#endif
// Android graphics ImageFormat mapping, see reference in:
// http://developer.android.com/reference/android/graphics/ImageFormat.html
DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_NV21, 17)
DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_YV12, 842094169)
DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_UNKNOWN, 0)
......@@ -71,9 +71,14 @@ void VideoCaptureDeviceFactoryAndroid::GetDeviceNames(
if (device_name.obj() == NULL)
continue;
const int capture_api_type =
Java_VideoCaptureFactory_getCaptureApiType(env, camera_id, context);
VideoCaptureDevice::Name name(
base::android::ConvertJavaStringToUTF8(device_name),
base::IntToString(camera_id));
base::IntToString(camera_id),
static_cast<VideoCaptureDevice::Name::CaptureApiType>(
capture_api_type));
device_names->push_back(name);
DVLOG(1) << "VideoCaptureDeviceFactoryAndroid::GetDeviceNames: camera "
......
......@@ -37,6 +37,8 @@ void FakeVideoCaptureDeviceFactory::GetDeviceNames(
, VideoCaptureDevice::Name::AVFOUNDATION
#elif defined(OS_WIN)
, VideoCaptureDevice::Name::DIRECT_SHOW
#elif defined(OS_ANDROID)
, VideoCaptureDevice::Name::API2_LEGACY
#endif
);
device_names->push_back(name);
......
......@@ -58,6 +58,13 @@ VideoCaptureDevice::Name::Name(const std::string& name,
capture_api_class_(api_type),
transport_type_(transport_type),
is_blacklisted_(false) {}
#elif defined(ANDROID)
VideoCaptureDevice::Name::Name(const std::string& name,
const std::string& id,
const CaptureApiType api_type)
: device_name_(name),
unique_id_(id),
capture_api_class_(api_type) {}
#endif
VideoCaptureDevice::Name::~Name() {}
......@@ -102,6 +109,25 @@ const char* VideoCaptureDevice::Name::GetCaptureApiTypeString() const {
return "Unknown API";
}
}
#elif defined(OS_ANDROID)
const char* VideoCaptureDevice::Name::GetCaptureApiTypeString() const {
switch(capture_api_type()) {
case API1:
return "Camera API1";
case API2_LEGACY:
return "Camera API2 Legacy";
case API2_FULL:
return "Camera API2 Full";
case API2_LIMITED:
return "Camera API2 Limited";
case TANGO:
return "Tango API";
case API_TYPE_UNKNOWN:
default:
NOTREACHED() << "Unknown Video Capture API type!";
return "Unknown API";
}
}
#endif
VideoCaptureDevice::~VideoCaptureDevice() {}
......
......@@ -69,10 +69,25 @@ class MEDIA_EXPORT VideoCaptureDevice {
USB_OR_BUILT_IN,
OTHER_TRANSPORT
};
#elif defined (OS_ANDROID)
// Android targets Capture Api type: it can only be set on construction.
// Automatically generated enum to interface with Java world.
//
// A Java counterpart will be generated for this enum.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.media
enum CaptureApiType {
API1,
API2_LEGACY,
API2_FULL,
API2_LIMITED,
TANGO,
API_TYPE_UNKNOWN
};
#endif
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
Name(const std::string& name,
const std::string& id,
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_ANDROID)
Name(const std::string& name, const std::string& id,
const CaptureApiType api_type);
#endif
#if defined(OS_MACOSX)
......@@ -108,7 +123,8 @@ class MEDIA_EXPORT VideoCaptureDevice {
return unique_id_ < other.id();
}
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_ANDROID)
CaptureApiType capture_api_type() const {
return capture_api_class_.capture_api_type();
}
......@@ -123,7 +139,7 @@ class MEDIA_EXPORT VideoCaptureDevice {
void set_capabilities_id(const std::string& id) {
capabilities_id_ = id;
}
#endif
#endif // if defined(OS_WIN)
#if defined(OS_MACOSX)
TransportType transport_type() const {
return transport_type_;
......@@ -134,12 +150,13 @@ class MEDIA_EXPORT VideoCaptureDevice {
void set_is_blacklisted(bool is_blacklisted) {
is_blacklisted_ = is_blacklisted;
}
#endif // if defined(OS_WIN)
#endif // if defined(OS_MACOSX)
private:
std::string device_name_;
std::string unique_id_;
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
defined(OS_ANDROID)
// This class wraps the CaptureApiType to give it a by default value if not
// initialized.
class CaptureApiClass {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment