168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui/*
268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * Copyright 2013, The Android Open Source Project
368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui *
468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * Licensed under the Apache License, Version 2.0 (the "License");
568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * you may not use this file except in compliance with the License.
668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * You may obtain a copy of the License at
768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui *
868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui *     http://www.apache.org/licenses/LICENSE-2.0
968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui *
1068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * Unless required by applicable law or agreed to in writing, software
1168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * distributed under the License is distributed on an "AS IS" BASIS,
1268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * See the License for the specific language governing permissions and
1468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui * limitations under the License.
1568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui */
1668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
1768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui//#define LOG_NDEBUG 0
1868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#define LOG_TAG "MediaMuxer-JNI"
1968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include <utils/Log.h>
2068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
2168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include "android_media_Utils.h"
2268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include "android_runtime/AndroidRuntime.h"
2368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include "jni.h"
2468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include "JNIHelp.h"
2568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
2668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include <media/stagefright/foundation/ABuffer.h>
2768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include <media/stagefright/foundation/ADebug.h>
2868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include <media/stagefright/foundation/AMessage.h>
2968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui#include <media/stagefright/MediaMuxer.h>
3068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
3168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuinamespace android {
3268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
3368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistruct fields_t {
3468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    jmethodID arrayID;
3568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui};
3668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
3768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic fields_t gFields;
3868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
3968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
4068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
4168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiusing namespace android;
4268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
4368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic jint android_media_MediaMuxer_addTrack(
44656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat        JNIEnv *env, jclass clazz, jlong nativeObject, jobjectArray keys,
4568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jobjectArray values) {
4668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
4768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (muxer == NULL) {
4868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
4968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Muxer was not set up correctly");
5068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return -1;
5168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
5268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
5368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<AMessage> trackformat;
5468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    status_t err = ConvertKeyValueArraysToMessage(env, keys, values,
5568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                                                  &trackformat);
5668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (err != OK) {
5768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalArgumentException",
5868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "ConvertKeyValueArraysToMessage got an error");
5968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return err;
6068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
6168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
6268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    // Return negative value when errors happen in addTrack.
6368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    jint trackIndex = muxer->addTrack(trackformat);
6468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
6568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (trackIndex < 0) {
6668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
6768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Failed to add the track to the muxer");
6868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return -1;
6968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
7068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    return trackIndex;
7168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
7268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
7368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic void android_media_MediaMuxer_writeSampleData(
74656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat        JNIEnv *env, jclass clazz, jlong nativeObject, jint trackIndex,
7568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jobject byteBuf, jint offset, jint size, jlong timeUs, jint flags) {
7668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
7768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (muxer == NULL) {
7868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
7968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Muxer was not set up correctly");
8068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
8168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
8268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
8368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    // Try to convert the incoming byteBuffer into ABuffer
8468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    void *dst = env->GetDirectBufferAddress(byteBuf);
8568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
8668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    jlong dstSize;
8768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    jbyteArray byteArray = NULL;
8868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
8968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (dst == NULL) {
9068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
9168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        byteArray =
9268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui            (jbyteArray)env->CallObjectMethod(byteBuf, gFields.arrayID);
9368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
9468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        if (byteArray == NULL) {
9568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui            jniThrowException(env, "java/lang/IllegalArgumentException",
9668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                              "byteArray is null");
9768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui            return;
9868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        }
9968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
10068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jboolean isCopy;
10168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        dst = env->GetByteArrayElements(byteArray, &isCopy);
10268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
10368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        dstSize = env->GetArrayLength(byteArray);
10468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    } else {
10568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        dstSize = env->GetDirectBufferCapacity(byteBuf);
10668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
10768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
10868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (dstSize < (offset + size)) {
10968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        ALOGE("writeSampleData saw wrong dstSize %lld, size  %d, offset %d",
11068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui              dstSize, size, offset);
11168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        if (byteArray != NULL) {
11268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui            env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
11368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        }
11468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalArgumentException",
11568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "sample has a wrong size");
11668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
11768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
11868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
11968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<ABuffer> buffer = new ABuffer((char *)dst + offset, size);
12068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
12168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    status_t err = muxer->writeSampleData(buffer, trackIndex, timeUs, flags);
12268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
12368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (byteArray != NULL) {
12468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
12568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
12668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
12768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (err != OK) {
12868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
12968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "writeSampleData returned an error");
13068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
13168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    return;
13268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
13368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
13468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui// Constructor counterpart.
135d2507a2f3cbe150fdf90d5a3a12b2711774ca3d4Ashok Bhatstatic jlong android_media_MediaMuxer_native_setup(
13668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        JNIEnv *env, jclass clazz, jobject fileDescriptor,
13768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jint format) {
13868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
13968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    ALOGV("native_setup: fd %d", fd);
14068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
14168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    MediaMuxer::OutputFormat fileFormat =
14268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        static_cast<MediaMuxer::OutputFormat>(format);
14368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer = new MediaMuxer(fd, fileFormat);
14468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    muxer->incStrong(clazz);
145d2507a2f3cbe150fdf90d5a3a12b2711774ca3d4Ashok Bhat    return reinterpret_cast<jlong>(muxer.get());
14668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
14768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
148effc9b4839f3cc109fe3d8244022f3c898cd080bztenghuistatic void android_media_MediaMuxer_setOrientationHint(
149656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat        JNIEnv *env, jclass clazz, jlong nativeObject, jint degrees) {
150effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
151effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    if (muxer == NULL) {
152effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui        jniThrowException(env, "java/lang/IllegalStateException",
153effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui                          "Muxer was not set up correctly");
154effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui        return;
155effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    }
156effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    status_t err = muxer->setOrientationHint(degrees);
157effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui
158effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    if (err != OK) {
159effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui        jniThrowException(env, "java/lang/IllegalStateException",
160effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui                          "Failed to set orientation hint");
161effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui        return;
162effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui    }
163effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui
164effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui}
165effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui
166cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun Hestatic void android_media_MediaMuxer_setLocation(
1673cb78498d3f664f541ba7d28f4543cf8c12733f1Robert Shih        JNIEnv *env, jclass clazz, jlong nativeObject, jint latitude, jint longitude) {
168cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He    MediaMuxer* muxer = reinterpret_cast<MediaMuxer *>(nativeObject);
169cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He
170cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He    status_t res = muxer->setLocation(latitude, longitude);
171cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He    if (res != OK) {
172cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He        jniThrowException(env, "java/lang/IllegalStateException",
173cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He                          "Failed to set location");
174cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He        return;
175cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He    }
176cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He}
177cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He
17868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic void android_media_MediaMuxer_start(JNIEnv *env, jclass clazz,
179656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat                                           jlong nativeObject) {
18068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
18168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (muxer == NULL) {
18268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
18368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Muxer was not set up correctly");
18468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
18568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
18668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    status_t err = muxer->start();
18768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
18868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (err != OK) {
18968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
19068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Failed to start the muxer");
19168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
19268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
19368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
19468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
19568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
19668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic void android_media_MediaMuxer_stop(JNIEnv *env, jclass clazz,
197656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat                                          jlong nativeObject) {
19868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
19968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (muxer == NULL) {
20068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
20168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Muxer was not set up correctly");
20268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
20368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
20468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
20568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    status_t err = muxer->stop();
20668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
20768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (err != OK) {
20868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        jniThrowException(env, "java/lang/IllegalStateException",
20968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                          "Failed to stop the muxer");
21068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        return;
21168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
21268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
21368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
21468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic void android_media_MediaMuxer_native_release(
215656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat        JNIEnv *env, jclass clazz, jlong nativeObject) {
21668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    sp<MediaMuxer> muxer(reinterpret_cast<MediaMuxer *>(nativeObject));
21768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (muxer != NULL) {
21868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        muxer->decStrong(clazz);
21968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
22068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
22168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
22268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuistatic JNINativeMethod gMethods[] = {
22368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
224656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeAddTrack", "(J[Ljava/lang/String;[Ljava/lang/Object;)I",
22568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        (void *)android_media_MediaMuxer_addTrack },
22668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
227656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeSetOrientationHint", "(JI)V",
228effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui        (void *)android_media_MediaMuxer_setOrientationHint},
229effc9b4839f3cc109fe3d8244022f3c898cd080bztenghui
230656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeSetLocation", "(JII)V",
231cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He        (void *)android_media_MediaMuxer_setLocation},
232cfd47481d1b375663d4e8e8d0c292d9001aa384bZhijun He
233656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeStart", "(J)V", (void *)android_media_MediaMuxer_start},
23468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
235656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeWriteSampleData", "(JILjava/nio/ByteBuffer;IIJI)V",
23668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        (void *)android_media_MediaMuxer_writeSampleData },
23768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
238656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeStop", "(J)V", (void *)android_media_MediaMuxer_stop},
23968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
240656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeSetup", "(Ljava/io/FileDescriptor;I)J",
24168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        (void *)android_media_MediaMuxer_native_setup },
24268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
243656fd0402613cec0196d5e2ae0a460d044d2805bAshok Bhat    { "nativeRelease", "(J)V",
24468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        (void *)android_media_MediaMuxer_native_release },
24568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
24668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui};
24768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
24868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui// This function only registers the native methods, and is called from
24968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui// JNI_OnLoad in android_media_MediaPlayer.cpp
25068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiint register_android_media_MediaMuxer(JNIEnv *env) {
25168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    int err = AndroidRuntime::registerNativeMethods(env,
25268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui                "android/media/MediaMuxer", gMethods, NELEM(gMethods));
25368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
25468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    jclass byteBufClass = env->FindClass("java/nio/ByteBuffer");
25568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    CHECK(byteBufClass != NULL);
25668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
25768ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    gFields.arrayID =
25868ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        env->GetMethodID(byteBufClass, "array", "()[B");
25968ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    CHECK(gFields.arrayID != NULL);
26068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
26168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    return err;
26268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui}
263