Merge "MediaMuxer: Add setLocation API" into klp-dev
This commit is contained in:
@@ -12790,6 +12790,7 @@ package android.media {
|
||||
ctor public MediaMuxer(java.lang.String, int) throws java.io.IOException;
|
||||
method public int addTrack(android.media.MediaFormat);
|
||||
method public void release();
|
||||
method public void setLocation(float, float);
|
||||
method public void setOrientationHint(int);
|
||||
method public void start();
|
||||
method public void stop();
|
||||
|
||||
@@ -92,6 +92,7 @@ final public class MediaMuxer {
|
||||
Object[] values);
|
||||
private static native void nativeSetOrientationHint(int nativeObject,
|
||||
int degrees);
|
||||
private static native void nativeSetLocation(int nativeObject, int latitude, int longitude);
|
||||
private static native void nativeWriteSampleData(int nativeObject,
|
||||
int trackIndex, ByteBuffer byteBuf,
|
||||
int offset, int size, long presentationTimeUs, int flags);
|
||||
@@ -164,6 +165,41 @@ final public class MediaMuxer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set and store the geodata (latitude and longitude) in the output file.
|
||||
* This method should be called before {@link #start}. The geodata is stored
|
||||
* in udta box if the output format is
|
||||
* {@link OutputFormat#MUXER_OUTPUT_MPEG_4}, and is ignored for other output
|
||||
* formats. The geodata is stored according to ISO-6709 standard.
|
||||
*
|
||||
* @param latitude Latitude in degrees. Its value must be in the range [-90,
|
||||
* 90].
|
||||
* @param longitude Longitude in degrees. Its value must be in the range
|
||||
* [-180, 180].
|
||||
* @throws IllegalArgumentException If the given latitude or longitude is out
|
||||
* of range.
|
||||
* @throws IllegalStateException If this method is called after {@link #start}.
|
||||
*/
|
||||
public void setLocation(float latitude, float longitude) {
|
||||
int latitudex10000 = (int) (latitude * 10000 + 0.5);
|
||||
int longitudex10000 = (int) (longitude * 10000 + 0.5);
|
||||
|
||||
if (latitudex10000 > 900000 || latitudex10000 < -900000) {
|
||||
String msg = "Latitude: " + latitude + " out of range.";
|
||||
throw new IllegalArgumentException(msg);
|
||||
}
|
||||
if (longitudex10000 > 1800000 || longitudex10000 < -1800000) {
|
||||
String msg = "Longitude: " + longitude + " out of range";
|
||||
throw new IllegalArgumentException(msg);
|
||||
}
|
||||
|
||||
if (mState == MUXER_STATE_INITIALIZED && mNativeObject != 0) {
|
||||
nativeSetLocation(mNativeObject, latitudex10000, longitudex10000);
|
||||
} else {
|
||||
throw new IllegalStateException("Can't set location due to wrong state.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the muxer.
|
||||
* <p>Make sure this is called after {@link #addTrack} and before
|
||||
|
||||
@@ -164,6 +164,18 @@ static void android_media_MediaMuxer_setOrientationHint(
|
||||
|
||||
}
|
||||
|
||||
static void android_media_MediaMuxer_setLocation(
|
||||
JNIEnv *env, jclass clazz, jint nativeObject, jint latitude, jint longitude) {
|
||||
MediaMuxer* muxer = reinterpret_cast<MediaMuxer *>(nativeObject);
|
||||
|
||||
status_t res = muxer->setLocation(latitude, longitude);
|
||||
if (res != OK) {
|
||||
jniThrowException(env, "java/lang/IllegalStateException",
|
||||
"Failed to set location");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void android_media_MediaMuxer_start(JNIEnv *env, jclass clazz,
|
||||
jint nativeObject) {
|
||||
sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
|
||||
@@ -216,6 +228,9 @@ static JNINativeMethod gMethods[] = {
|
||||
{ "nativeSetOrientationHint", "(II)V",
|
||||
(void *)android_media_MediaMuxer_setOrientationHint},
|
||||
|
||||
{ "nativeSetLocation", "(III)V",
|
||||
(void *)android_media_MediaMuxer_setLocation},
|
||||
|
||||
{ "nativeStart", "(I)V", (void *)android_media_MediaMuxer_start},
|
||||
|
||||
{ "nativeWriteSampleData", "(IILjava/nio/ByteBuffer;IIJI)V",
|
||||
|
||||
Reference in New Issue
Block a user