Chromium Code Reviews| 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) { |