summaryrefslogtreecommitdiffstats
path: root/media/video
diff options
context:
space:
mode:
authormcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-18 16:08:18 +0000
committermcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-18 16:08:18 +0000
commit345f4417c5604b9b62c19b5035237c40b851bff0 (patch)
tree8c22cf370e499e39e84ce61c3352ab915b91a613 /media/video
parentfbc1edc8d1613285fd8eed51fba3acd69eb6cba9 (diff)
downloadchromium_src-345f4417c5604b9b62c19b5035237c40b851bff0.zip
chromium_src-345f4417c5604b9b62c19b5035237c40b851bff0.tar.gz
chromium_src-345f4417c5604b9b62c19b5035237c40b851bff0.tar.bz2
Move NV21 colorspace treatment from VideoCapture java to C++
- VideoCapture.java: Removed NV21 explicit treatment. Added getColorspace() method. - Added VideoCaptureDeviceAndroid::GetColorspace(), translates between Android and C++ colorspaces. - Added support for NV21 conversion and rotations in Android to VideoCaptureController. - Unrelated to the rest, removed unused unused GetIntField in VideoCaptureDeviceAndroid anonymous namespace. Tested by forcing NV21 in VideoCapture.java [1] [1] https://code.google.com/p/chromium/codesearch#chromium/src/media/base/android/java/src/org/chromium/media/VideoCapture.java&q=deviceimageformathack&sq=package:chromium&l=55 BUG=288567 Review URL: https://chromiumcodereview.appspot.com/23903032 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223886 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/video')
-rw-r--r--media/video/capture/android/imageformat_list.h22
-rw-r--r--media/video/capture/android/video_capture_device_android.cc37
-rw-r--r--media/video/capture/android/video_capture_device_android.h8
3 files changed, 53 insertions, 14 deletions
diff --git a/media/video/capture/android/imageformat_list.h b/media/video/capture/android/imageformat_list.h
new file mode 100644
index 0000000..57c5ba1
--- /dev/null
+++ b/media/video/capture/android/imageformat_list.h
@@ -0,0 +1,22 @@
+// 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_JPEG, 256)
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_NV16, 16)
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_NV21, 17)
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_RGB_565, 4)
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_YUY2, 20)
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_YV12, 842094169)
+
+DEFINE_ANDROID_IMAGEFORMAT(ANDROID_IMAGEFORMAT_UNKNOWN, 0)
diff --git a/media/video/capture/android/video_capture_device_android.cc b/media/video/capture/android/video_capture_device_android.cc
index 3574760..141a5d0 100644
--- a/media/video/capture/android/video_capture_device_android.cc
+++ b/media/video/capture/android/video_capture_device_android.cc
@@ -21,19 +21,6 @@ using base::android::MethodID;
using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
-namespace {
-
-int GetIntField(JNIEnv* env,
- const JavaRef<jclass>& clazz,
- const JavaRef<jobject>& instance,
- const char* field_name) {
- jfieldID field = GetFieldID(env, clazz, field_name, "I");
- jint int_value = env->GetIntField(instance.obj(), field);
- return int_value;
-}
-
-} // namespace
-
namespace media {
// static
@@ -152,7 +139,8 @@ void VideoCaptureDeviceAndroid::Allocate(
Java_VideoCapture_queryHeight(env, j_capture_.obj());
current_settings_.frame_rate =
Java_VideoCapture_queryFrameRate(env, j_capture_.obj());
- current_settings_.color = PIXEL_FORMAT_YV12;
+ current_settings_.color = GetColorspace();
+ DCHECK_NE(current_settings_.color, media::PIXEL_FORMAT_UNKNOWN);
CHECK(current_settings_.width > 0 && !(current_settings_.width % 2));
CHECK(current_settings_.height > 0 && !(current_settings_.height % 2));
@@ -276,6 +264,27 @@ void VideoCaptureDeviceAndroid::OnFrameAvailable(
env->ReleaseByteArrayElements(data, buffer, JNI_ABORT);
}
+VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() {
+ JNIEnv* env = AttachCurrentThread();
+ int current_capture_colorspace =
+ Java_VideoCapture_getColorspace(env, j_capture_.obj());
+ switch (current_capture_colorspace){
+ case ANDROID_IMAGEFORMAT_YV12:
+ return media::PIXEL_FORMAT_YV12;
+ case ANDROID_IMAGEFORMAT_NV21:
+ return media::PIXEL_FORMAT_NV21;
+ case ANDROID_IMAGEFORMAT_YUY2:
+ return media::PIXEL_FORMAT_YUY2;
+ case ANDROID_IMAGEFORMAT_NV16:
+ case ANDROID_IMAGEFORMAT_JPEG:
+ case ANDROID_IMAGEFORMAT_RGB_565:
+ case ANDROID_IMAGEFORMAT_UNKNOWN:
+ // NOTE(mcasas): NV16, JPEG, RGB565 not supported in VideoPixelFormat.
+ default:
+ return media::PIXEL_FORMAT_UNKNOWN;
+ }
+}
+
void VideoCaptureDeviceAndroid::SetErrorState(const std::string& reason) {
LOG(ERROR) << "VideoCaptureDeviceAndroid::SetErrorState: " << reason;
{
diff --git a/media/video/capture/android/video_capture_device_android.h b/media/video/capture/android/video_capture_device_android.h
index 845d278..de6955d 100644
--- a/media/video/capture/android/video_capture_device_android.h
+++ b/media/video/capture/android/video_capture_device_android.h
@@ -54,8 +54,16 @@ class MEDIA_EXPORT VideoCaptureDeviceAndroid : public VideoCaptureDevice1 {
kError // Hit error. User needs to recover by destroying the object.
};
+ // Automatically generated enum to interface with Java world.
+ enum AndroidImageFormat {
+#define DEFINE_ANDROID_IMAGEFORMAT(name, value) name = value,
+#include "media/video/capture/android/imageformat_list.h"
+#undef DEFINE_ANDROID_IMAGEFORMAT
+ };
+
explicit VideoCaptureDeviceAndroid(const Name& device_name);
bool Init();
+ VideoPixelFormat GetColorspace();
void SetErrorState(const std::string& reason);
// Prevent racing on accessing |state_| and |observer_| since both could be