NdkMediaMuxer.cpp revision 08aaabe87960c04ecac180db1fe88b5a7bc2ed3b
108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/* 208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Copyright (C) 2014 The Android Open Source Project 308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * 408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * you may not use this file except in compliance with the License. 608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * You may obtain a copy of the License at 708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * 808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * 1008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Unless required by applicable law or agreed to in writing, software 1108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 1208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * See the License for the specific language governing permissions and 1408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * limitations under the License. 1508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 1608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 1708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#define LOG_NDEBUG 0 1808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#define LOG_TAG "NdkMediaMuxer" 1908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 2008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 2108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include "NdkMediaMuxer.h" 2208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include "NdkMediaCodec.h" 2308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include "NdkMediaFormatPriv.h" 2408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 2508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 2608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <utils/Log.h> 2708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <utils/StrongPointer.h> 2808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <media/stagefright/foundation/ABuffer.h> 2908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <media/stagefright/foundation/AMessage.h> 3008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <media/stagefright/MetaData.h> 3108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <media/stagefright/MediaMuxer.h> 3208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <media/IMediaHTTPService.h> 3308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <android_runtime/AndroidRuntime.h> 3408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <android_util_Binder.h> 3508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <jni.h> 3708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenusing namespace android; 3908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenstatic int translate_error(status_t err) { 4108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen if (err == OK) { 4208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return OK; 4308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen } 4408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen ALOGE("sf error code: %d", err); 4508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return -1000; 4608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 4708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenstruct AMediaMuxer { 4908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen sp<MediaMuxer> mImpl; 5008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen}; 5208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenextern "C" { 5408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco NelissenAMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format) { 5608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen ALOGV("ctor"); 5708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMediaMuxer *mData = new AMediaMuxer(); 5808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen mData->mImpl = new MediaMuxer(fd, (android::MediaMuxer::OutputFormat)format); 5908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return mData; 6008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 6108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 6208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_delete(AMediaMuxer *muxer) { 6308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen ALOGV("dtor"); 6408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen delete muxer; 6508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return OK; 6608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 6708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 6808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_setLocation(AMediaMuxer *muxer, float latitude, float longtitude) { 6908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error(muxer->mImpl->setLocation(latitude * 10000, longtitude * 10000)); 7008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 7108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 7208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_setOrientationHint(AMediaMuxer *muxer, int degrees) { 7308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error(muxer->mImpl->setOrientationHint(degrees)); 7408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 7508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 7608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenssize_t AMediaMuxer_addTrack(AMediaMuxer *muxer, const AMediaFormat *format) { 7708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen sp<AMessage> msg; 7808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMediaFormat_getFormat(format, &msg); 7908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error(muxer->mImpl->addTrack(msg)); 8008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 8108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 8208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_start(AMediaMuxer *muxer) { 8308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error(muxer->mImpl->start()); 8408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 8508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 8608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_stop(AMediaMuxer *muxer) { 8708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error(muxer->mImpl->stop()); 8808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 8908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenint AMediaMuxer_writeSampleData(AMediaMuxer *muxer, 9108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen size_t trackIdx, const uint8_t *data, const AMediaCodecBufferInfo &info) { 9208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen sp<ABuffer> buf = new ABuffer((void*)(data + info.offset), info.size); 9308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen return translate_error( 9408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen muxer->mImpl->writeSampleData(buf, trackIdx, info.presentationTimeUs, info.flags)); 9508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} 9608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} // extern "C" 9908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 100