diff options
author | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-18 16:08:18 +0000 |
---|---|---|
committer | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-18 16:08:18 +0000 |
commit | 345f4417c5604b9b62c19b5035237c40b851bff0 (patch) | |
tree | 8c22cf370e499e39e84ce61c3352ab915b91a613 /media/video | |
parent | fbc1edc8d1613285fd8eed51fba3acd69eb6cba9 (diff) | |
download | chromium_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')
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 |