Merge "MediaMuxer:Maintain proper state after stop()" into rvc-dev am: 7f42b75525 am: 700fa1f40d am: 65c68d8011
Change-Id: I33ee2935b48a828d9a296249429ffceb57af4082
This commit is contained in:
committed by
Automerger Merge Worker
commit
177df91bae
@@ -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) + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user