summaryrefslogtreecommitdiffstats
path: root/chromium/media/base/android/media_codec_bridge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/base/android/media_codec_bridge.cc')
-rw-r--r--chromium/media/base/android/media_codec_bridge.cc57
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);
}