Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Unified Diff: media/base/android/sdk_media_codec_bridge.cc

Issue 1764813002: Catch CodecException in MediaCodecBridge and return MEDIA_CODEC_ERROR (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: dale's comment Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/sdk_media_codec_bridge.h ('k') | media/base/android/video_decoder_job.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/android/sdk_media_codec_bridge.cc
diff --git a/media/base/android/sdk_media_codec_bridge.cc b/media/base/android/sdk_media_codec_bridge.cc
index 62782160d42e8a8fb7330674fda770115f1a170b..fdda989db485fa24db0a131a0c738e4a98b9f59c 100644
--- a/media/base/android/sdk_media_codec_bridge.cc
+++ b/media/base/android/sdk_media_codec_bridge.cc
@@ -112,17 +112,29 @@ void SdkMediaCodecBridge::Stop() {
Java_MediaCodecBridge_stop(env, j_media_codec_.obj());
}
-void SdkMediaCodecBridge::GetOutputFormat(int* width, int* height) {
+MediaCodecStatus SdkMediaCodecBridge::GetOutputSize(gfx::Size* size) {
JNIEnv* env = AttachCurrentThread();
-
- *width = Java_MediaCodecBridge_getOutputWidth(env, j_media_codec_.obj());
- *height = Java_MediaCodecBridge_getOutputHeight(env, j_media_codec_.obj());
+ ScopedJavaLocalRef<jobject> result =
+ Java_MediaCodecBridge_getOutputFormat(env, j_media_codec_.obj());
+ MediaCodecStatus status = static_cast<MediaCodecStatus>(
+ Java_GetOutputFormatResult_status(env, result.obj()));
+ if (status == MEDIA_CODEC_OK) {
+ size->SetSize(Java_GetOutputFormatResult_width(env, result.obj()),
+ Java_GetOutputFormatResult_height(env, result.obj()));
+ }
+ return status;
}
-int SdkMediaCodecBridge::GetOutputSamplingRate() {
+MediaCodecStatus SdkMediaCodecBridge::GetOutputSamplingRate(
+ int* sampling_rate) {
JNIEnv* env = AttachCurrentThread();
-
- return Java_MediaCodecBridge_getOutputSamplingRate(env, j_media_codec_.obj());
+ ScopedJavaLocalRef<jobject> result =
+ Java_MediaCodecBridge_getOutputFormat(env, j_media_codec_.obj());
+ MediaCodecStatus status = static_cast<MediaCodecStatus>(
+ Java_GetOutputFormatResult_status(env, result.obj()));
+ if (status == MEDIA_CODEC_OK)
+ *sampling_rate = Java_GetOutputFormatResult_sampleRate(env, result.obj());
+ return status;
}
MediaCodecStatus SdkMediaCodecBridge::QueueInputBuffer(
@@ -274,39 +286,52 @@ void SdkMediaCodecBridge::ReleaseOutputBuffer(int index, bool render) {
render);
}
-void SdkMediaCodecBridge::GetInputBuffer(int input_buffer_index,
- uint8_t** data,
- size_t* capacity) {
+MediaCodecStatus SdkMediaCodecBridge::GetInputBuffer(int input_buffer_index,
+ uint8_t** data,
+ size_t* capacity) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_buffer(Java_MediaCodecBridge_getInputBuffer(
env, j_media_codec_.obj(), input_buffer_index));
+ if (j_buffer.is_null())
+ return MEDIA_CODEC_ERROR;
+
*data = static_cast<uint8_t*>(env->GetDirectBufferAddress(j_buffer.obj()));
*capacity =
base::checked_cast<size_t>(env->GetDirectBufferCapacity(j_buffer.obj()));
+ return MEDIA_CODEC_OK;
}
-void SdkMediaCodecBridge::CopyFromOutputBuffer(int index,
- size_t offset,
- void* dst,
- size_t num) {
+MediaCodecStatus SdkMediaCodecBridge::CopyFromOutputBuffer(int index,
+ size_t offset,
+ void* dst,
+ size_t num) {
void* src_data = nullptr;
- const size_t src_capacity = GetOutputBufferAddress(index, offset, &src_data);
- CHECK_GE(src_capacity, num);
- memcpy(dst, src_data, num);
+ size_t src_capacity = 0;
+ MediaCodecStatus status =
+ GetOutputBufferAddress(index, offset, &src_data, &src_capacity);
+ if (status == MEDIA_CODEC_OK) {
+ CHECK_GE(src_capacity, num);
+ memcpy(dst, src_data, num);
+ }
+ return status;
}
-size_t SdkMediaCodecBridge::GetOutputBufferAddress(int index,
- size_t offset,
- void** addr) {
+MediaCodecStatus SdkMediaCodecBridge::GetOutputBufferAddress(int index,
+ size_t offset,
+ void** addr,
+ size_t* capacity) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_buffer(
Java_MediaCodecBridge_getOutputBuffer(env, j_media_codec_.obj(), index));
+ if (j_buffer.is_null())
+ return MEDIA_CODEC_ERROR;
const size_t total_capacity = env->GetDirectBufferCapacity(j_buffer.obj());
CHECK_GE(total_capacity, offset);
*addr =
reinterpret_cast<uint8_t*>(env->GetDirectBufferAddress(j_buffer.obj())) +
offset;
- return total_capacity - offset;
+ *capacity = total_capacity - offset;
+ return MEDIA_CODEC_OK;
}
// static
@@ -528,23 +553,30 @@ bool AudioCodecBridge::ConfigureMediaFormat(jobject j_format,
return true;
}
-int64_t AudioCodecBridge::PlayOutputBuffer(int index,
- size_t size,
- size_t offset,
- bool postpone) {
+MediaCodecStatus AudioCodecBridge::PlayOutputBuffer(int index,
+ size_t size,
+ size_t offset,
+ bool postpone,
+ int64_t* playback_pos) {
DCHECK_LE(0, index);
int numBytes = base::checked_cast<int>(size);
void* buffer = nullptr;
- int capacity = GetOutputBufferAddress(index, offset, &buffer);
- numBytes = std::min(capacity, numBytes);
+ size_t capacity = 0;
+ MediaCodecStatus status =
+ GetOutputBufferAddress(index, offset, &buffer, &capacity);
+ if (status == MEDIA_CODEC_ERROR)
+ return status;
+
+ numBytes = std::min(base::checked_cast<int>(capacity), numBytes);
CHECK_GE(numBytes, 0);
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jbyteArray> byte_array = base::android::ToJavaByteArray(
env, static_cast<uint8_t*>(buffer), numBytes);
- return Java_MediaCodecBridge_playOutputBuffer(env, media_codec(),
- byte_array.obj(), postpone);
+ *playback_pos = Java_MediaCodecBridge_playOutputBuffer(
+ env, media_codec(), byte_array.obj(), postpone);
+ return status;
}
void AudioCodecBridge::SetVolume(double volume) {
« no previous file with comments | « media/base/android/sdk_media_codec_bridge.h ('k') | media/base/android/video_decoder_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698