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 1808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/* 1908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * This file defines an NDK API. 2008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not remove methods. 2108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not change method signatures. 2208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not change the value of constants. 2308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not change the size of any of the classes defined in here. 2408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not reference types that are not part of the NDK. 2508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Do not #include files that aren't part of the NDK. 2608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 2708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 2808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#ifndef _NDK_MEDIA_MUXER_H 2908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#define _NDK_MEDIA_MUXER_H 3008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <sys/types.h> 3208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include "NdkMediaCodec.h" 34e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen#include "NdkMediaError.h" 35e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen#include "NdkMediaFormat.h" 3608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#ifdef __cplusplus 3808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenextern "C" { 3908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#endif 4008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenstruct AMediaMuxer; 4208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissentypedef struct AMediaMuxer AMediaMuxer; 4308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissentypedef enum { 4508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 = 0, 4608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMEDIAMUXER_OUTPUT_FORMAT_WEBM = 1, 4708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} OutputFormat; 4808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/** 5008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Create new media muxer 5108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 5208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco NelissenAMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format); 5308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/** 5508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Delete a previously created media muxer 5608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 57e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_delete(AMediaMuxer*); 5808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 6079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Set and store the geodata (latitude and longitude) in the output file. 6179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * This method should be called before AMediaMuxer_start. The geodata is stored 6279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * in udta box if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, and is 6379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * ignored for other output formats. 6479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The geodata is stored according to ISO-6709 standard. 6579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * 6679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Both values are specified in degrees. 6779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Latitude must be in the range [-90, 90]. 6879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Longitude must be in the range [-180, 180]. 6979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 7079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissenmedia_status_t AMediaMuxer_setLocation(AMediaMuxer*, float latitude, float longitude); 7108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 7279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 7379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Sets the orientation hint for output video playback. 7479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * This method should be called before AMediaMuxer_start. Calling this 7579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * method will not rotate the video frame when muxer is generating the file, 7679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * but add a composition matrix containing the rotation angle in the output 7779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * video if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, so that a 7879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * video player can choose the proper orientation for playback. 7979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Note that some video players may choose to ignore the composition matrix 8079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * during playback. 8179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The angle is specified in degrees, clockwise. 8279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The supported angles are 0, 90, 180, and 270 degrees. 8379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 84e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_setOrientationHint(AMediaMuxer*, int degrees); 8508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 8679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 8779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Adds a track with the specified format. 8879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Returns the index of the new track or a negative value in case of failure, 8979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * which can be interpreted as a media_status_t. 9079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 9108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenssize_t AMediaMuxer_addTrack(AMediaMuxer*, const AMediaFormat* format); 9208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 9479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Start the muxer. Should be called after AMediaMuxer_addTrack and 9579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * before AMediaMuxer_writeSampleData. 9679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 97e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_start(AMediaMuxer*); 9808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 10079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Stops the muxer. 10179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Once the muxer stops, it can not be restarted. 10279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 103e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_stop(AMediaMuxer*); 10408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 10579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 10679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Writes an encoded sample into the muxer. 10779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The application needs to make sure that the samples are written into 10879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * the right tracks. Also, it needs to make sure the samples for each track 10979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * are written in chronological order (e.g. in the order they are provided 11079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * by the encoder.) 11179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 112e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_writeSampleData(AMediaMuxer *muxer, 1130e03cf07deeda10c573657479591dcfbf1efca56Marco Nelissen size_t trackIdx, const uint8_t *data, const AMediaCodecBufferInfo *info); 11408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 11508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#ifdef __cplusplus 11608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} // extern "C" 11708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#endif 11808aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 11908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#endif // _NDK_MEDIA_MUXER_H 120