MediaMuxerJNI:Throw relevant exception on error

MediaMuxerJNI throws more relevant Exception when native MediaMuxer reports
ERROR_IO or ERROR_MALFORMED.

Bug: 135685864

Test:  1) atest android.media.cts.MediaMuxerTest
       2) Filled up sdcard memory on phone and tried to compose large file using MediaMuxer.
	Writing was stopped when ::write failed because sdcard memory ran out and corresponding
	exception thrown in test app.( Pre-allocation was disabled).
	3) Same as step 2 with pre-allocation enabled, expected error
	was reported and corresponding exception was thrown.

Change-Id: I07d2872585b5d0a328512c3a6eb5d73b8e4540b3
This commit is contained in:
Gopalakrishnan Nallasamy
2019-12-09 20:54:42 -08:00
parent 0d52f4202c
commit 1ec633dbcb

View File

@@ -26,11 +26,15 @@
#include <unistd.h>
#include <fcntl.h>
#include <android/api-level.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaMuxer.h>
extern "C" int android_get_application_target_sdk_version();
namespace android {
struct fields_t {
@@ -229,10 +233,31 @@ static void android_media_MediaMuxer_stop(JNIEnv *env, jclass /* clazz */,
status_t err = muxer->stop();
if (err != OK) {
jniThrowException(env, "java/lang/IllegalStateException",
"Failed to stop the muxer");
return;
if (android_get_application_target_sdk_version() >= __ANDROID_API_R__) {
switch (err) {
case OK:
break;
case ERROR_IO: {
jniThrowException(env, "java/lang/UncheckedIOException",
"Muxer stopped unexpectedly");
return;
}
case ERROR_MALFORMED: {
jniThrowException(env, "java/io/IOError",
"Failure of reading or writing operation");
return;
}
default: {
jniThrowException(env, "java/lang/IllegalStateException",
"Failed to stop the muxer");
return;
}
}
} else {
if (err != OK) {
jniThrowException(env, "java/lang/IllegalStateException", "Failed to stop the muxer");
return;
}
}
}