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
38 extern "C" {
39 #endif
40 
41 struct AMediaMuxer;
42 typedef struct AMediaMuxer AMediaMuxer;
43 
44 typedef enum {
45     AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 = 0,
46     AMEDIAMUXER_OUTPUT_FORMAT_WEBM   = 1,
47 } OutputFormat;
48 
49 /**
50  * Create new media muxer
51  */
52 AMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format);
53 
54 /**
55  * Delete a previously created media muxer
56  */
57 media_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  */
70 media_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  */
84 media_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  */
91 ssize_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  */
97 media_status_t AMediaMuxer_start(AMediaMuxer*);
98 
99 /**
100  * Stops the muxer.
101  * Once the muxer stops, it can not be restarted.
102  */
103 media_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  */
112 media_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