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