diff options
Diffstat (limited to 'chromium/media/base/android/media_codec_bridge.cc')
-rw-r--r-- | chromium/media/base/android/media_codec_bridge.cc | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/chromium/media/base/android/media_codec_bridge.cc b/chromium/media/base/android/media_codec_bridge.cc index 6e7987fd055..92b2791506d 100644 --- a/chromium/media/base/android/media_codec_bridge.cc +++ b/chromium/media/base/android/media_codec_bridge.cc @@ -14,7 +14,7 @@ #include "base/basictypes.h" #include "base/lazy_instance.h" #include "base/logging.h" -#include "base/safe_numerics.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "jni/MediaCodecBridge_jni.h" @@ -116,12 +116,11 @@ bool MediaCodecBridge::SupportsSetParameters() { // static std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() { std::vector<CodecsInfo> codecs_info; - JNIEnv* env = AttachCurrentThread(); if (!IsAvailable()) return codecs_info; + JNIEnv* env = AttachCurrentThread(); std::string mime_type; - std::string codec_name; ScopedJavaLocalRef<jobjectArray> j_codec_info_array = Java_MediaCodecBridge_getCodecsInfo(env); jsize len = env->GetArrayLength(j_codec_info_array.obj()); @@ -145,6 +144,9 @@ std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() { // static bool MediaCodecBridge::CanDecode(const std::string& codec, bool is_secure) { + if (!IsAvailable()) + return false; + JNIEnv* env = AttachCurrentThread(); std::string mime = CodecTypeToAndroidMimeType(codec); if (mime.empty()) @@ -162,6 +164,9 @@ bool MediaCodecBridge::CanDecode(const std::string& codec, bool is_secure) { // static bool MediaCodecBridge::IsKnownUnaccelerated(const std::string& mime_type, MediaCodecDirection direction) { + if (!IsAvailable()) + return true; + std::string codec_type = AndroidMimeTypeToCodecType(mime_type); std::vector<media::MediaCodecBridge::CodecsInfo> codecs_info = MediaCodecBridge::GetCodecsInfo(); @@ -225,7 +230,7 @@ MediaCodecStatus MediaCodecBridge::QueueInputBuffer( size_t data_size, const base::TimeDelta& presentation_time) { DVLOG(3) << __PRETTY_FUNCTION__ << index << ": " << data_size; - if (data_size > base::checked_numeric_cast<size_t>(kint32max)) + if (data_size > base::checked_cast<size_t>(kint32max)) return MEDIA_CODEC_ERROR; if (data && !FillInputBuffer(index, data, data_size)) return MEDIA_CODEC_ERROR; @@ -252,7 +257,7 @@ MediaCodecStatus MediaCodecBridge::QueueSecureInputBuffer( int subsamples_size, const base::TimeDelta& presentation_time) { DVLOG(3) << __PRETTY_FUNCTION__ << index << ": " << data_size; - if (data_size > base::checked_numeric_cast<size_t>(kint32max)) + if (data_size > base::checked_cast<size_t>(kint32max)) return MEDIA_CODEC_ERROR; if (data && !FillInputBuffer(index, data, data_size)) return MEDIA_CODEC_ERROR; @@ -349,9 +354,9 @@ MediaCodecStatus MediaCodecBridge::DequeueOutputBuffer( Java_MediaCodecBridge_dequeueOutputBuffer( env, j_media_codec_.obj(), timeout.InMicroseconds()); *index = Java_DequeueOutputResult_index(env, result.obj()); - *offset = base::checked_numeric_cast<size_t>( + *offset = base::checked_cast<size_t>( Java_DequeueOutputResult_offset(env, result.obj())); - *size = base::checked_numeric_cast<size_t>( + *size = base::checked_cast<size_t>( Java_DequeueOutputResult_numBytes(env, result.obj())); if (presentation_time) { *presentation_time = base::TimeDelta::FromMicroseconds( @@ -408,7 +413,7 @@ void MediaCodecBridge::GetInputBuffer(int input_buffer_index, ScopedJavaLocalRef<jobject> j_buffer(Java_MediaCodecBridge_getInputBuffer( env, j_media_codec_.obj(), input_buffer_index)); *data = static_cast<uint8*>(env->GetDirectBufferAddress(j_buffer.obj())); - *capacity = base::checked_numeric_cast<size_t>( + *capacity = base::checked_cast<size_t>( env->GetDirectBufferCapacity(j_buffer.obj())); } @@ -588,9 +593,9 @@ bool AudioCodecBridge::ConfigureMediaFormat(jobject j_format, return true; } -void AudioCodecBridge::PlayOutputBuffer(int index, size_t size) { +int64 AudioCodecBridge::PlayOutputBuffer(int index, size_t size) { DCHECK_LE(0, index); - int numBytes = base::checked_numeric_cast<int>(size); + int numBytes = base::checked_cast<int>(size); JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> buf = Java_MediaCodecBridge_getOutputBuffer(env, media_codec(), index); @@ -598,7 +603,8 @@ void AudioCodecBridge::PlayOutputBuffer(int index, size_t size) { ScopedJavaLocalRef<jbyteArray> byte_array = base::android::ToJavaByteArray(env, buffer, numBytes); - Java_MediaCodecBridge_playOutputBuffer(env, media_codec(), byte_array.obj()); + return Java_MediaCodecBridge_playOutputBuffer( + env, media_codec(), byte_array.obj()); } void AudioCodecBridge::SetVolume(double volume) { @@ -606,7 +612,11 @@ void AudioCodecBridge::SetVolume(double volume) { Java_MediaCodecBridge_setVolume(env, media_codec(), volume); } +// static AudioCodecBridge* AudioCodecBridge::Create(const AudioCodec& codec) { + if (!MediaCodecBridge::IsAvailable()) + return NULL; + const std::string mime = AudioCodecToAndroidMimeType(codec); return mime.empty() ? NULL : new AudioCodecBridge(mime); } @@ -624,12 +634,15 @@ bool VideoCodecBridge::IsKnownUnaccelerated(const VideoCodec& codec, VideoCodecToAndroidMimeType(codec), direction); } +// static VideoCodecBridge* VideoCodecBridge::CreateDecoder(const VideoCodec& codec, bool is_secure, const gfx::Size& size, jobject surface, jobject media_crypto) { - JNIEnv* env = AttachCurrentThread(); + if (!MediaCodecBridge::IsAvailable()) + return NULL; + const std::string mime = VideoCodecToAndroidMimeType(codec); if (mime.empty()) return NULL; @@ -639,6 +652,7 @@ VideoCodecBridge* VideoCodecBridge::CreateDecoder(const VideoCodec& codec, if (!bridge->media_codec()) return NULL; + JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); ScopedJavaLocalRef<jobject> j_format( Java_MediaCodecBridge_createVideoDecoderFormat( @@ -656,13 +670,16 @@ VideoCodecBridge* VideoCodecBridge::CreateDecoder(const VideoCodec& codec, return bridge->StartInternal() ? bridge.release() : NULL; } +// static VideoCodecBridge* VideoCodecBridge::CreateEncoder(const VideoCodec& codec, const gfx::Size& size, int bit_rate, int frame_rate, int i_frame_interval, int color_format) { - JNIEnv* env = AttachCurrentThread(); + if (!MediaCodecBridge::IsAvailable()) + return NULL; + const std::string mime = VideoCodecToAndroidMimeType(codec); if (mime.empty()) return NULL; @@ -672,6 +689,7 @@ VideoCodecBridge* VideoCodecBridge::CreateEncoder(const VideoCodec& codec, if (!bridge->media_codec()) return NULL; + JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); ScopedJavaLocalRef<jobject> j_format( Java_MediaCodecBridge_createVideoEncoderFormat(env, @@ -698,7 +716,8 @@ VideoCodecBridge* VideoCodecBridge::CreateEncoder(const VideoCodec& codec, VideoCodecBridge::VideoCodecBridge(const std::string& mime, bool is_secure, MediaCodecDirection direction) - : MediaCodecBridge(mime, is_secure, direction) {} + : MediaCodecBridge(mime, is_secure, direction), + adaptive_playback_supported_for_testing_(-1) {} void VideoCodecBridge::SetVideoBitrate(int bps) { JNIEnv* env = AttachCurrentThread(); @@ -710,6 +729,16 @@ void VideoCodecBridge::RequestKeyFrameSoon() { Java_MediaCodecBridge_requestKeyFrameSoon(env, media_codec()); } +bool VideoCodecBridge::IsAdaptivePlaybackSupported(int width, int height) { + if (adaptive_playback_supported_for_testing_ == 0) + return false; + else if (adaptive_playback_supported_for_testing_ > 0) + return true; + JNIEnv* env = AttachCurrentThread(); + return Java_MediaCodecBridge_isAdaptivePlaybackSupported( + env, media_codec(), width, height); +} + bool MediaCodecBridge::RegisterMediaCodecBridge(JNIEnv* env) { return RegisterNativesImpl(env); } |