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