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

Commit cfd47481 authored by Zhijun He's avatar Zhijun He
Browse files

MediaMuxer: Add setLocation API

This API could be used for camera recording when MediaMuxer is used to write
output media file.

Bug: 10594784
Change-Id: Ide2d6e1d87b246100a5def49bfb8646dc984a512
parent e3d0f022
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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();
+36 −0
Original line number Diff line number Diff line
@@ -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
+15 −0
Original line number Diff line number Diff line
@@ -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",