1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18/* 19 * This file defines an NDK API. 20 * Do not remove methods. 21 * Do not change method signatures. 22 * Do not change the value of constants. 23 * Do not change the size of any of the classes defined in here. 24 * Do not reference types that are not part of the NDK. 25 * Do not #include files that aren't part of the NDK. 26 */ 27 28#ifndef _NDK_MEDIA_MUXER_H 29#define _NDK_MEDIA_MUXER_H 30 31#include <sys/types.h> 32 33#include "NdkMediaCodec.h" 34#include "NdkMediaError.h" 35#include "NdkMediaFormat.h" 36 37#ifdef __cplusplus 38extern "C" { 39#endif 40 41struct AMediaMuxer; 42typedef struct AMediaMuxer AMediaMuxer; 43 44typedef enum { 45 AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 = 0, 46 AMEDIAMUXER_OUTPUT_FORMAT_WEBM = 1, 47} OutputFormat; 48 49/** 50 * Create new media muxer 51 */ 52AMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format); 53 54/** 55 * Delete a previously created media muxer 56 */ 57media_status_t AMediaMuxer_delete(AMediaMuxer*); 58 59/** 60 * Set and store the geodata (latitude and longitude) in the output file. 61 * This method should be called before AMediaMuxer_start. The geodata is stored 62 * in udta box if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, and is 63 * ignored for other output formats. 64 * The geodata is stored according to ISO-6709 standard. 65 * 66 * Both values are specified in degrees. 67 * Latitude must be in the range [-90, 90]. 68 * Longitude must be in the range [-180, 180]. 69 */ 70media_status_t AMediaMuxer_setLocation(AMediaMuxer*, float latitude, float longitude); 71 72/** 73 * Sets the orientation hint for output video playback. 74 * This method should be called before AMediaMuxer_start. Calling this 75 * method will not rotate the video frame when muxer is generating the file, 76 * but add a composition matrix containing the rotation angle in the output 77 * video if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, so that a 78 * video player can choose the proper orientation for playback. 79 * Note that some video players may choose to ignore the composition matrix 80 * during playback. 81 * The angle is specified in degrees, clockwise. 82 * The supported angles are 0, 90, 180, and 270 degrees. 83 */ 84media_status_t AMediaMuxer_setOrientationHint(AMediaMuxer*, int degrees); 85 86/** 87 * Adds a track with the specified format. 88 * Returns the index of the new track or a negative value in case of failure, 89 * which can be interpreted as a media_status_t. 90 */ 91ssize_t AMediaMuxer_addTrack(AMediaMuxer*, const AMediaFormat* format); 92 93/** 94 * Start the muxer. Should be called after AMediaMuxer_addTrack and 95 * before AMediaMuxer_writeSampleData. 96 */ 97media_status_t AMediaMuxer_start(AMediaMuxer*); 98 99/** 100 * Stops the muxer. 101 * Once the muxer stops, it can not be restarted. 102 */ 103media_status_t AMediaMuxer_stop(AMediaMuxer*); 104 105/** 106 * Writes an encoded sample into the muxer. 107 * The application needs to make sure that the samples are written into 108 * the right tracks. Also, it needs to make sure the samples for each track 109 * are written in chronological order (e.g. in the order they are provided 110 * by the encoder.) 111 */ 112media_status_t AMediaMuxer_writeSampleData(AMediaMuxer *muxer, 113 size_t trackIdx, const uint8_t *data, const AMediaCodecBufferInfo *info); 114 115#ifdef __cplusplus 116} // extern "C" 117#endif 118 119#endif // _NDK_MEDIA_MUXER_H 120