Merge "MediaMuxer:Maintain proper state after stop()" into rvc-dev am: 7f42b75525 am: 700fa1f40d am: 65c68d8011

Change-Id: I33ee2935b48a828d9a296249429ffceb57af4082
This commit is contained in:
Gopalakrishnan Nallasamy
2020-05-19 00:55:07 +00:00
committed by Automerger Merge Worker
2 changed files with 34 additions and 35 deletions

View File

@@ -321,6 +321,21 @@ final public class MediaMuxer {
@UnsupportedAppUsage @UnsupportedAppUsage
private long mNativeObject; private long mNativeObject;
private String convertMuxerStateCodeToString(int aState) {
switch (aState) {
case MUXER_STATE_UNINITIALIZED:
return "UNINITIALIZED";
case MUXER_STATE_INITIALIZED:
return "INITIALIZED";
case MUXER_STATE_STARTED:
return "STARTED";
case MUXER_STATE_STOPPED:
return "STOPPED";
default:
return "UNKNOWN";
}
}
/** /**
* Constructor. * Constructor.
* Creates a media muxer that writes to the specified path. * Creates a media muxer that writes to the specified path.
@@ -397,7 +412,7 @@ final public class MediaMuxer {
nativeSetOrientationHint(mNativeObject, degrees); nativeSetOrientationHint(mNativeObject, degrees);
} else { } else {
throw new IllegalStateException("Can't set rotation degrees due" + throw new IllegalStateException("Can't set rotation degrees due" +
" to wrong state."); " to wrong state(" + convertMuxerStateCodeToString(mState) + ")");
} }
} }
@@ -432,7 +447,8 @@ final public class MediaMuxer {
if (mState == MUXER_STATE_INITIALIZED && mNativeObject != 0) { if (mState == MUXER_STATE_INITIALIZED && mNativeObject != 0) {
nativeSetLocation(mNativeObject, latitudex10000, longitudex10000); nativeSetLocation(mNativeObject, latitudex10000, longitudex10000);
} else { } else {
throw new IllegalStateException("Can't set location due to wrong state."); throw new IllegalStateException("Can't set location due to wrong state("
+ convertMuxerStateCodeToString(mState) + ")");
} }
} }
@@ -451,7 +467,8 @@ final public class MediaMuxer {
nativeStart(mNativeObject); nativeStart(mNativeObject);
mState = MUXER_STATE_STARTED; mState = MUXER_STATE_STARTED;
} else { } else {
throw new IllegalStateException("Can't start due to wrong state."); throw new IllegalStateException("Can't start due to wrong state("
+ convertMuxerStateCodeToString(mState) + ")");
} }
} }
@@ -462,10 +479,16 @@ final public class MediaMuxer {
*/ */
public void stop() { public void stop() {
if (mState == MUXER_STATE_STARTED) { if (mState == MUXER_STATE_STARTED) {
nativeStop(mNativeObject); try {
mState = MUXER_STATE_STOPPED; nativeStop(mNativeObject);
} catch (Exception e) {
throw e;
} finally {
mState = MUXER_STATE_STOPPED;
}
} else { } else {
throw new IllegalStateException("Can't stop due to wrong state."); throw new IllegalStateException("Can't stop due to wrong state("
+ convertMuxerStateCodeToString(mState) + ")");
} }
} }

View File

@@ -26,15 +26,11 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <android/api-level.h>
#include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaMuxer.h> #include <media/stagefright/MediaMuxer.h>
extern "C" int android_get_application_target_sdk_version();
namespace android { namespace android {
struct fields_t { struct fields_t {
@@ -233,31 +229,11 @@ static void android_media_MediaMuxer_stop(JNIEnv *env, jclass /* clazz */,
status_t err = muxer->stop(); status_t err = muxer->stop();
if (android_get_application_target_sdk_version() >= __ANDROID_API_R__) { if (err != OK) {
switch (err) { ALOGE("Error during stop:%d", err);
case OK: jniThrowException(env, "java/lang/IllegalStateException",
break; "Error during stop(), muxer would have stopped already");
case ERROR_IO: { return;
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;
}
} }
} }