Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ec633db authored by Gopalakrishnan Nallasamy's avatar Gopalakrishnan Nallasamy
Browse files

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
parent 0d52f420
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -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,12 +233,33 @@ static void android_media_MediaMuxer_stop(JNIEnv *env, jclass /* clazz */,

    status_t err = muxer->stop();

    if (err != OK) {
    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;
        }
    }
}

static void android_media_MediaMuxer_native_release(
        JNIEnv* /* env */, jclass clazz, jlong nativeObject) {