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 bb5ddccfd7e5a239961ba4761ee8903da0a84e56..cc73f700cfe8e271b42c3979446f7020eb6eec02 100644 |
--- a/media/base/android/media_codec_bridge.cc |
+++ b/media/base/android/media_codec_bridge.cc |
@@ -5,6 +5,7 @@ |
#include "media/base/android/media_codec_bridge.h" |
#include <jni.h> |
+#include <string> |
#include "base/android/build_info.h" |
#include "base/android/jni_android.h" |
@@ -27,7 +28,7 @@ namespace media { |
enum { kBufferFlagEndOfStream = 4 }; |
-static const char* AudioCodecToMimeType(const AudioCodec codec) { |
+static const std::string AudioCodecToMimeType(const AudioCodec codec) { |
switch (codec) { |
case kCodecMP3: |
return "audio/mpeg"; |
@@ -36,18 +37,18 @@ static const char* AudioCodecToMimeType(const AudioCodec codec) { |
case kCodecAAC: |
return "audio/mp4a-latm"; |
default: |
- return NULL; |
+ return ""; |
ddorwin
2013/08/28 02:28:50
std::string()
xhwang
2013/08/28 18:19:15
Done.
|
} |
} |
-static const char* VideoCodecToMimeType(const VideoCodec codec) { |
+static const std::string VideoCodecToMimeType(const VideoCodec codec) { |
switch (codec) { |
case kCodecH264: |
return "video/avc"; |
case kCodecVP8: |
return "video/x-vnd.on2.vp8"; |
default: |
- return NULL; |
+ return ""; |
} |
} |
@@ -72,14 +73,22 @@ bool MediaCodecBridge::IsAvailable() { |
return base::android::BuildInfo::GetInstance()->sdk_int() >= 16; |
} |
-MediaCodecBridge::MediaCodecBridge(const char* mime) { |
+// static |
+bool MediaCodecBridge::IsDecoderSupported(const std::string& mime, |
+ bool secure) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); |
+ return !Java_MediaCodecBridge_create(env, j_mime.obj(), secure).is_null(); |
+} |
+ |
+// TODO(xhwang): Support creating secure MediaCodecBridge. |
+MediaCodecBridge::MediaCodecBridge(const std::string& mime) { |
JNIEnv* env = AttachCurrentThread(); |
CHECK(env); |
- DCHECK(mime); |
- ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, mime); |
- j_media_codec_.Reset(Java_MediaCodecBridge_create( |
- env, j_type.obj())); |
+ DCHECK(!mime.empty()); |
+ ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); |
+ j_media_codec_.Reset(Java_MediaCodecBridge_create(env, j_mime.obj(), false)); |
} |
MediaCodecBridge::~MediaCodecBridge() { |
@@ -227,7 +236,7 @@ size_t MediaCodecBridge::FillInputBuffer( |
return size_to_copy; |
} |
-AudioCodecBridge::AudioCodecBridge(const char* mime) |
+AudioCodecBridge::AudioCodecBridge(const std::string& mime) |
: MediaCodecBridge(mime) { |
} |
@@ -236,13 +245,14 @@ bool AudioCodecBridge::Start( |
const uint8* extra_data, size_t extra_data_size, bool play_audio, |
jobject media_crypto) { |
JNIEnv* env = AttachCurrentThread(); |
- DCHECK(AudioCodecToMimeType(codec)); |
if (!media_codec()) |
return false; |
+ std::string codec_string = AudioCodecToMimeType(codec); |
+ DCHECK(!codec_string.empty()); |
ddorwin
2013/08/28 02:28:50
Who calls Start()? Are we sure invalid types won't
xhwang
2013/08/28 18:19:15
Good point. It comes from renderer. So we could hi
|
ScopedJavaLocalRef<jstring> j_mime = |
- ConvertUTF8ToJavaString(env, AudioCodecToMimeType(codec)); |
+ ConvertUTF8ToJavaString(env, codec_string); |
ScopedJavaLocalRef<jobject> j_format( |
Java_MediaCodecBridge_createAudioFormat( |
env, j_mime.obj(), sample_rate, channel_count)); |
@@ -255,6 +265,7 @@ bool AudioCodecBridge::Start( |
env, media_codec(), j_format.obj(), media_crypto, 0, play_audio)) { |
return false; |
} |
+ |
StartInternal(); |
return true; |
} |
@@ -382,7 +393,7 @@ void AudioCodecBridge::SetVolume(double volume) { |
Java_MediaCodecBridge_setVolume(env, media_codec(), volume); |
} |
-VideoCodecBridge::VideoCodecBridge(const char* mime) |
+VideoCodecBridge::VideoCodecBridge(const std::string& mime) |
: MediaCodecBridge(mime) { |
} |
@@ -390,13 +401,14 @@ bool VideoCodecBridge::Start( |
const VideoCodec codec, const gfx::Size& size, jobject surface, |
jobject media_crypto) { |
JNIEnv* env = AttachCurrentThread(); |
- DCHECK(VideoCodecToMimeType(codec)); |
if (!media_codec()) |
return false; |
+ std::string codec_string = VideoCodecToMimeType(codec); |
+ DCHECK(!codec_string.empty()); |
ScopedJavaLocalRef<jstring> j_mime = |
- ConvertUTF8ToJavaString(env, VideoCodecToMimeType(codec)); |
+ ConvertUTF8ToJavaString(env, codec_string); |
ScopedJavaLocalRef<jobject> j_format( |
Java_MediaCodecBridge_createVideoFormat( |
env, j_mime.obj(), size.width(), size.height())); |
@@ -410,13 +422,13 @@ bool VideoCodecBridge::Start( |
} |
AudioCodecBridge* AudioCodecBridge::Create(const AudioCodec codec) { |
- const char* mime = AudioCodecToMimeType(codec); |
- return mime ? new AudioCodecBridge(mime) : NULL; |
+ const std::string mime = AudioCodecToMimeType(codec); |
+ return mime.empty() ? NULL: new AudioCodecBridge(mime); |
ddorwin
2013/08/28 02:28:50
space before ':'
below too
xhwang
2013/08/28 18:19:15
Done.
|
} |
VideoCodecBridge* VideoCodecBridge::Create(const VideoCodec codec) { |
- const char* mime = VideoCodecToMimeType(codec); |
- return mime ? new VideoCodecBridge(mime) : NULL; |
+ const std::string mime = VideoCodecToMimeType(codec); |
+ return mime.empty() ? NULL: new VideoCodecBridge(mime); |
} |
bool MediaCodecBridge::RegisterMediaCodecBridge(JNIEnv* env) { |