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 312975a24dc42c8953125b39a5194da3aec244cbefDan Albert#include <sys/cdefs.h> 3208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include <sys/types.h> 3308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 3408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#include "NdkMediaCodec.h" 35e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen#include "NdkMediaError.h" 36e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen#include "NdkMediaFormat.h" 3708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 385e496db43045b59bec22f9de7c7490f80e8f42dfDan Albert__BEGIN_DECLS 392975a24dc42c8953125b39a5194da3aec244cbefDan Albert 4008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenstruct AMediaMuxer; 4108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissentypedef struct AMediaMuxer AMediaMuxer; 4208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 4308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissentypedef enum { 4408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 = 0, 4508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen AMEDIAMUXER_OUTPUT_FORMAT_WEBM = 1, 4608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen} OutputFormat; 4708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 485e496db43045b59bec22f9de7c7490f80e8f42dfDan Albert#if __ANDROID_API__ >= 21 495e496db43045b59bec22f9de7c7490f80e8f42dfDan Albert 5008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/** 5108aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Create new media muxer 5208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 5308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco NelissenAMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format); 5408aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 5508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen/** 5608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen * Delete a previously created media muxer 5708aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen */ 58e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_delete(AMediaMuxer*); 5908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 6079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 6179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Set and store the geodata (latitude and longitude) in the output file. 6279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * This method should be called before AMediaMuxer_start. The geodata is stored 6379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * in udta box if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, and is 6479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * ignored for other output formats. 6579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The geodata is stored according to ISO-6709 standard. 6679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * 6779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Both values are specified in degrees. 6879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Latitude must be in the range [-90, 90]. 6979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Longitude must be in the range [-180, 180]. 7079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 7179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissenmedia_status_t AMediaMuxer_setLocation(AMediaMuxer*, float latitude, float longitude); 7208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 7379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 7479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Sets the orientation hint for output video playback. 7579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * This method should be called before AMediaMuxer_start. Calling this 7679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * method will not rotate the video frame when muxer is generating the file, 7779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * but add a composition matrix containing the rotation angle in the output 7879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * video if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, so that a 7979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * video player can choose the proper orientation for playback. 8079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Note that some video players may choose to ignore the composition matrix 8179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * during playback. 8279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The angle is specified in degrees, clockwise. 8379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The supported angles are 0, 90, 180, and 270 degrees. 8479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 85e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_setOrientationHint(AMediaMuxer*, int degrees); 8608aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 8779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 8879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Adds a track with the specified format. 8979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Returns the index of the new track or a negative value in case of failure, 9079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * which can be interpreted as a media_status_t. 9179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 9208aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissenssize_t AMediaMuxer_addTrack(AMediaMuxer*, const AMediaFormat* format); 9308aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 9479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 9579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Start the muxer. Should be called after AMediaMuxer_addTrack and 9679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * before AMediaMuxer_writeSampleData. 9779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 98e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_start(AMediaMuxer*); 9908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 10079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 10179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Stops the muxer. 10279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Once the muxer stops, it can not be restarted. 10379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 104e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_stop(AMediaMuxer*); 10508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 10679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 10779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Writes an encoded sample into the muxer. 10879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The application needs to make sure that the samples are written into 10979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * the right tracks. Also, it needs to make sure the samples for each track 11079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * are written in chronological order (e.g. in the order they are provided 11179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * by the encoder.) 11279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 113e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaMuxer_writeSampleData(AMediaMuxer *muxer, 1140e03cf07deeda10c573657479591dcfbf1efca56Marco Nelissen size_t trackIdx, const uint8_t *data, const AMediaCodecBufferInfo *info); 11508aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 1162975a24dc42c8953125b39a5194da3aec244cbefDan Albert#endif /* __ANDROID_API__ >= 21 */ 1172975a24dc42c8953125b39a5194da3aec244cbefDan Albert 1185e496db43045b59bec22f9de7c7490f80e8f42dfDan Albert__END_DECLS 11908aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen 12008aaabe87960c04ecac180db1fe88b5a7bc2ed3bMarco Nelissen#endif // _NDK_MEDIA_MUXER_H 121