| Index: media/base/android/media_codec_bridge.cc
|
| diff --git a/media/base/android/media_codec_bridge.cc b/media/base/android/media_codec_bridge.cc
|
| index 37949f48d0237bca29abb5292b70e36fd8f5ff5c..2587fc494d0d062fa8ddeb656e8433ae19338c2a 100644
|
| --- a/media/base/android/media_codec_bridge.cc
|
| +++ b/media/base/android/media_codec_bridge.cc
|
| @@ -17,36 +17,11 @@
|
| #include "base/stringprintf.h"
|
|
|
| #include "jni/MediaCodecBridge_jni.h"
|
| -#include "jni/MediaFormat_jni.h"
|
|
|
| using base::android::AttachCurrentThread;
|
| using base::android::ConvertUTF8ToJavaString;
|
| using base::android::ScopedJavaLocalRef;
|
|
|
| -namespace {
|
| -
|
| -class MediaCodecNativeRegisterer {
|
| - public:
|
| - MediaCodecNativeRegisterer() {
|
| - JNIEnv* env = AttachCurrentThread();
|
| - jni_initialized_ =
|
| - media::RegisterNativesImpl(env) &&
|
| - JNI_MediaFormat::RegisterNativesImpl(env);
|
| - }
|
| -
|
| - bool IsRegistered() {
|
| - return jni_initialized_;
|
| - }
|
| -
|
| - private:
|
| - bool jni_initialized_;
|
| -};
|
| -
|
| -static base::LazyInstance<MediaCodecNativeRegisterer> g_native_registerer =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -} // namespace
|
| -
|
| namespace media {
|
|
|
| enum { kBufferFlagEndOfStream = 4 };
|
| @@ -92,7 +67,6 @@ bool MediaCodecBridge::IsAvailable() {
|
| MediaCodecBridge::MediaCodecBridge(const char* mime) {
|
| JNIEnv* env = AttachCurrentThread();
|
| CHECK(env);
|
| - CHECK(g_native_registerer.Pointer()->IsRegistered());
|
| DCHECK(mime);
|
|
|
| ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, mime);
|
| @@ -124,19 +98,8 @@ void MediaCodecBridge::Stop() {
|
| void MediaCodecBridge::GetOutputFormat(int* width, int* height) {
|
| JNIEnv* env = AttachCurrentThread();
|
|
|
| - ScopedJavaLocalRef<jobject> j_format(
|
| - Java_MediaCodecBridge_getOutputFormat(env, j_media_codec_.obj()));
|
| - if (!j_format.is_null()) {
|
| - ScopedJavaLocalRef<jstring> j_key_width =
|
| - ConvertUTF8ToJavaString(env, "width");
|
| - *width = JNI_MediaFormat::Java_MediaFormat_getInteger(
|
| - env, j_format.obj(), j_key_width.obj());
|
| -
|
| - ScopedJavaLocalRef<jstring> j_key_height =
|
| - ConvertUTF8ToJavaString(env, "height");
|
| - *height = JNI_MediaFormat::Java_MediaFormat_getInteger(
|
| - env, j_format.obj(), j_key_height.obj());
|
| - }
|
| + *width = Java_MediaCodecBridge_getOutputWidth(env, j_media_codec_.obj());
|
| + *height = Java_MediaCodecBridge_getOutputHeight(env, j_media_codec_.obj());
|
| }
|
|
|
| size_t MediaCodecBridge::QueueInputBuffer(
|
| @@ -213,8 +176,8 @@ void MediaCodecBridge::GetOutputBuffers() {
|
| Java_MediaCodecBridge_getOutputBuffers(env, j_media_codec_.obj());
|
| }
|
|
|
| -AudioCodecBridge::AudioCodecBridge(const AudioCodec codec)
|
| - : MediaCodecBridge(AudioCodecToMimeType(codec)) {
|
| +AudioCodecBridge::AudioCodecBridge(const char* mime)
|
| + : MediaCodecBridge(mime) {
|
| }
|
|
|
| bool AudioCodecBridge::Start(
|
| @@ -226,7 +189,7 @@ bool AudioCodecBridge::Start(
|
| ScopedJavaLocalRef<jstring> j_mime =
|
| ConvertUTF8ToJavaString(env, AudioCodecToMimeType(codec));
|
| ScopedJavaLocalRef<jobject> j_format(
|
| - JNI_MediaFormat::Java_MediaFormat_createAudioFormat(
|
| + Java_MediaCodecBridge_createAudioFormat(
|
| env, j_mime.obj(), sample_rate, channel_count));
|
| DCHECK(!j_format.is_null());
|
|
|
| @@ -266,16 +229,14 @@ bool AudioCodecBridge::Start(
|
| // The first header is identification header.
|
| jobject identification_header = env->NewDirectByteBuffer(
|
| const_cast<uint8*>(current_pos), header_length[0]);
|
| - ScopedJavaLocalRef<jstring> j_csd_0 = ConvertUTF8ToJavaString(env, "csd-0");
|
| - JNI_MediaFormat::Java_MediaFormat_setByteBuffer(
|
| - env, j_format.obj(), j_csd_0.obj(), identification_header);
|
| + Java_MediaCodecBridge_setCodecSpecificData(
|
| + env, j_format.obj(), 0, identification_header);
|
| // The last header is codec header.
|
| jobject codec_header = env->NewDirectByteBuffer(
|
| const_cast<uint8*>(extra_data + total_length),
|
| extra_data_size - total_length);
|
| - ScopedJavaLocalRef<jstring> j_csd_1 = ConvertUTF8ToJavaString(env, "csd-1");
|
| - JNI_MediaFormat::Java_MediaFormat_setByteBuffer(
|
| - env, j_format.obj(), j_csd_1.obj(), codec_header);
|
| + Java_MediaCodecBridge_setCodecSpecificData(
|
| + env, j_format.obj(), 1, codec_header);
|
| env->DeleteLocalRef(codec_header);
|
| env->DeleteLocalRef(identification_header);
|
| }
|
| @@ -300,8 +261,8 @@ void AudioCodecBridge::PlayOutputBuffer(int index, size_t size) {
|
| env, media_codec(), byte_array.obj());
|
| }
|
|
|
| -VideoCodecBridge::VideoCodecBridge(const VideoCodec codec)
|
| - : MediaCodecBridge(VideoCodecToMimeType(codec)) {
|
| +VideoCodecBridge::VideoCodecBridge(const char* mime)
|
| + : MediaCodecBridge(mime) {
|
| }
|
|
|
| bool VideoCodecBridge::Start(
|
| @@ -312,7 +273,7 @@ bool VideoCodecBridge::Start(
|
| ScopedJavaLocalRef<jstring> j_mime =
|
| ConvertUTF8ToJavaString(env, VideoCodecToMimeType(codec));
|
| ScopedJavaLocalRef<jobject> j_format(
|
| - JNI_MediaFormat::Java_MediaFormat_createVideoFormat(
|
| + Java_MediaCodecBridge_createVideoFormat(
|
| env, j_mime.obj(), size.width(), size.height()));
|
| DCHECK(!j_format.is_null());
|
| Java_MediaCodecBridge_configureVideo(
|
| @@ -321,5 +282,19 @@ bool VideoCodecBridge::Start(
|
| return true;
|
| }
|
|
|
| +AudioCodecBridge* AudioCodecBridge::Create(const AudioCodec codec) {
|
| + const char* mime = AudioCodecToMimeType(codec);
|
| + return mime ? new AudioCodecBridge(mime) : NULL;
|
| +}
|
| +
|
| +VideoCodecBridge* VideoCodecBridge::Create(const VideoCodec codec) {
|
| + const char* mime = VideoCodecToMimeType(codec);
|
| + return mime ? new VideoCodecBridge(mime) : NULL;
|
| +}
|
| +
|
| +bool MediaCodecBridge::RegisterMediaCodecBridge(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
| +
|
| } // namespace media
|
|
|
|
|