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