blob: 637bf9b33d086e2c0c6fd06af7b4f558c35ed721 [file] [log] [blame]
Marco Nelissen0c3be872014-05-01 10:14:44 -07001/*
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 * This file defines an NDK API.
19 * Do not remove methods.
20 * Do not change method signatures.
21 * Do not change the value of constants.
22 * Do not change the size of any of the classes defined in here.
23 * Do not reference types that are not part of the NDK.
24 * Do not #include files that aren't part of the NDK.
25 */
26
27#ifndef _NDK_MEDIA_CODEC_H
28#define _NDK_MEDIA_CODEC_H
29
Dan Albert2975a242016-09-23 16:17:45 -070030#include <sys/cdefs.h>
31
Marco Nelissen050eb322014-05-09 15:10:23 -070032#include "NdkMediaCrypto.h"
Marco Nelissene419d7c2014-05-15 14:17:25 -070033#include "NdkMediaError.h"
Marco Nelissen0c3be872014-05-01 10:14:44 -070034#include "NdkMediaFormat.h"
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
Mathias Agopianbc1713d2017-02-13 18:37:50 -080040struct ANativeWindow;
41
Dan Albert2975a242016-09-23 16:17:45 -070042#if __ANDROID_API__ >= 21
Marco Nelissen0c3be872014-05-01 10:14:44 -070043
44struct AMediaCodec;
45typedef struct AMediaCodec AMediaCodec;
46
47struct AMediaCodecBufferInfo {
48 int32_t offset;
49 int32_t size;
50 int64_t presentationTimeUs;
51 uint32_t flags;
52};
53typedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo;
Marco Nelissen050eb322014-05-09 15:10:23 -070054typedef struct AMediaCodecCryptoInfo AMediaCodecCryptoInfo;
Marco Nelissen0c3be872014-05-01 10:14:44 -070055
56enum {
57 AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4,
Marco Nelissen86aa02c2014-05-07 16:03:54 -070058 AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1,
Marco Nelissen0c3be872014-05-01 10:14:44 -070059 AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3,
60 AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2,
61 AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1
62};
63
Marco Nelissen0c3be872014-05-01 10:14:44 -070064/**
Marco Nelissen86aa02c2014-05-07 16:03:54 -070065 * Create codec by name. Use this if you know the exact codec you want to use.
66 * When configuring, you will need to specify whether to use the codec as an
67 * encoder or decoder.
Marco Nelissen0c3be872014-05-01 10:14:44 -070068 */
Marco Nelissen86aa02c2014-05-07 16:03:54 -070069AMediaCodec* AMediaCodec_createCodecByName(const char *name);
Marco Nelissen0c3be872014-05-01 10:14:44 -070070
71/**
72 * Create codec by mime type. Most applications will use this, specifying a
73 * mime type obtained from media extractor.
74 */
Marco Nelissen86aa02c2014-05-07 16:03:54 -070075AMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type);
Marco Nelissen0c3be872014-05-01 10:14:44 -070076
77/**
78 * Create encoder by name.
79 */
Marco Nelissen86aa02c2014-05-07 16:03:54 -070080AMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type);
Marco Nelissen0c3be872014-05-01 10:14:44 -070081
82/**
83 * delete the codec and free its resources
84 */
Marco Nelissene419d7c2014-05-15 14:17:25 -070085media_status_t AMediaCodec_delete(AMediaCodec*);
Marco Nelissen0c3be872014-05-01 10:14:44 -070086
87/**
88 * Configure the codec. For decoding you would typically get the format from an extractor.
89 */
Marco Nelissene419d7c2014-05-15 14:17:25 -070090media_status_t AMediaCodec_configure(
Marco Nelissen050eb322014-05-09 15:10:23 -070091 AMediaCodec*,
92 const AMediaFormat* format,
93 ANativeWindow* surface,
94 AMediaCrypto *crypto,
95 uint32_t flags);
Marco Nelissen0c3be872014-05-01 10:14:44 -070096
97/**
98 * Start the codec. A codec must be configured before it can be started, and must be started
99 * before buffers can be sent to it.
100 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700101media_status_t AMediaCodec_start(AMediaCodec*);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700102
103/**
104 * Stop the codec.
105 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700106media_status_t AMediaCodec_stop(AMediaCodec*);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700107
108/*
109 * Flush the codec's input and output. All indices previously returned from calls to
110 * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid.
111 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700112media_status_t AMediaCodec_flush(AMediaCodec*);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700113
114/**
115 * Get an input buffer. The specified buffer index must have been previously obtained from
116 * dequeueInputBuffer, and not yet queued.
117 */
118uint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
119
120/**
121 * Get an output buffer. The specified buffer index must have been previously obtained from
122 * dequeueOutputBuffer, and not yet queued.
123 */
124uint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
125
126/**
127 * Get the index of the next available input buffer. An app will typically use this with
128 * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded
129 * into the buffer before passing it to the codec.
130 */
131ssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs);
132
133/**
134 * Send the specified buffer to the codec for processing.
135 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700136media_status_t AMediaCodec_queueInputBuffer(AMediaCodec*,
Marco Nelissen0c3be872014-05-01 10:14:44 -0700137 size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
138
139/**
Marco Nelissen050eb322014-05-09 15:10:23 -0700140 * Send the specified buffer to the codec for processing.
141 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700142media_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*,
Marco Nelissen050eb322014-05-09 15:10:23 -0700143 size_t idx, off_t offset, AMediaCodecCryptoInfo*, uint64_t time, uint32_t flags);
144
145/**
Marco Nelissen0c3be872014-05-01 10:14:44 -0700146 * Get the index of the next available buffer of processed data.
147 */
Glenn Kastenb187de12014-12-30 08:18:15 -0800148ssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info,
149 int64_t timeoutUs);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700150AMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*);
151
152/**
Marco Nelissen79e2b622014-05-16 08:07:28 -0700153 * If you are done with a buffer, use this call to return the buffer to
154 * the codec. If you previously specified a surface when configuring this
155 * video decoder you can optionally render the buffer.
Marco Nelissen0c3be872014-05-01 10:14:44 -0700156 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700157media_status_t AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700158
Marco Nelissen79e2b622014-05-16 08:07:28 -0700159/**
Vineeta Srivastava8c35da52016-01-08 17:33:09 -0800160 * Dynamically sets the output surface of a codec.
161 *
162 * This can only be used if the codec was configured with an output surface. The
163 * new output surface should have a compatible usage type to the original output surface.
164 * E.g. codecs may not support switching from a SurfaceTexture (GPU readable) output
165 * to ImageReader (software readable) output.
166 *
167 * For more details, see the Java documentation for MediaCodec.setOutputSurface.
168 */
169media_status_t AMediaCodec_setOutputSurface(AMediaCodec*, ANativeWindow* surface);
170
171/**
Marco Nelissen79e2b622014-05-16 08:07:28 -0700172 * If you are done with a buffer, use this call to update its surface timestamp
173 * and return it to the codec to render it on the output surface. If you
174 * have not specified an output surface when configuring this video codec,
175 * this call will simply return the buffer to the codec.
176 *
177 * For more details, see the Java documentation for MediaCodec.releaseOutputBuffer.
178 */
179media_status_t AMediaCodec_releaseOutputBufferAtTime(
180 AMediaCodec *mData, size_t idx, int64_t timestampNs);
Marco Nelissen0c3be872014-05-01 10:14:44 -0700181
Praveen Chavan19431582017-01-16 11:56:18 -0800182/**
183 * Creates a Surface that can be used as the input to encoder, in place of input buffers
184 *
185 * This can only be called after the codec has been configured via
186 * AMediaCodec_configure(..); and before AMediaCodec_start() has been called.
187 *
188 * The application is responsible for releasing the surface by calling
189 * ANativeWindow_release() when done.
190 *
191 * For more details, see the Java documentation for MediaCodec.createInputSurface.
192 */
Praveen Chavan85a53632017-01-31 12:21:33 -0800193media_status_t AMediaCodec_createInputSurface(
194 AMediaCodec *mData, ANativeWindow **surface);
195
196/**
197 * Creates a persistent Surface that can be used as the input to encoder
198 *
199 * Persistent surface can be reused by MediaCodec instances and can be set
200 * on a new instance via AMediaCodec_setInputSurface().
201 * A persistent surface can be connected to at most one instance of MediaCodec
202 * at any point in time.
203 *
204 * The application is responsible for releasing the surface by calling
205 * ANativeWindow_release() when done.
206 *
207 * For more details, see the Java documentation for MediaCodec.createPersistentInputSurface.
208 */
209media_status_t AMediaCodec_createPersistentInputSurface(
210 ANativeWindow **surface);
211
212/**
213 * Set a persistent-surface that can be used as the input to encoder, in place of input buffers
214 *
215 * The surface provided *must* be a persistent surface created via
216 * AMediaCodec_createPersistentInputSurface()
217 * This can only be called after the codec has been configured by calling
218 * AMediaCodec_configure(..); and before AMediaCodec_start() has been called.
219 *
220 * For more details, see the Java documentation for MediaCodec.setInputSurface.
221 */
222media_status_t AMediaCodec_setInputSurface(
223 AMediaCodec *mData, ANativeWindow *surface);
224
Praveen Chavanf373e842017-02-01 11:50:15 -0800225/**
226 * Signal additional parameters to the codec instance.
227 *
228 * Parameters can be communicated only when the codec is running, i.e
229 * after AMediaCodec_start() has been called.
230 *
231 * NOTE: Some of these parameter changes may silently fail to apply.
232 */
233media_status_t AMediaCodec_setParameters(
234 AMediaCodec *mData, const AMediaFormat* params);
Praveen Chavan85a53632017-01-31 12:21:33 -0800235
Robert Shihaf42d3f2017-03-20 16:45:37 -0700236/**
237 * Signals end-of-stream on input. Equivalent to submitting an empty buffer with
238 * AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM set.
239 *
240 * Returns AMEDIA_ERROR_INVALID_OPERATION when used with an encoder not in executing state
241 * or not receiving input from a Surface created by AMediaCodec_createInputSurface or
242 * AMediaCodec_createPersistentInputSurface.
243 *
244 * Returns the previous codec error if one exists.
245 *
246 * Returns AMEDIA_OK when completed succesfully.
247 *
248 * For more details, see the Java documentation for MediaCodec.signalEndOfInputStream.
249 */
250media_status_t AMediaCodec_signalEndOfInputStream(AMediaCodec *mData);
251
252
Praveen Chavan19431582017-01-16 11:56:18 -0800253
Marco Nelissen79e2b622014-05-16 08:07:28 -0700254typedef enum {
Marco Nelissen050eb322014-05-09 15:10:23 -0700255 AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
Jeff Tinkerf45c7e72016-03-23 17:50:11 -0700256 AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1,
257 AMEDIACODECRYPTOINFO_MODE_AES_WV = 2,
258 AMEDIACODECRYPTOINFO_MODE_AES_CBC = 3
Marco Nelissen79e2b622014-05-16 08:07:28 -0700259} cryptoinfo_mode_t;
Marco Nelissen050eb322014-05-09 15:10:23 -0700260
Jeff Tinker18cb1ec2015-12-18 11:55:22 -0800261typedef struct {
262 int32_t encryptBlocks;
263 int32_t skipBlocks;
264} cryptoinfo_pattern_t;
265
Marco Nelissen050eb322014-05-09 15:10:23 -0700266/**
Marco Nelissen79e2b622014-05-16 08:07:28 -0700267 * Create an AMediaCodecCryptoInfo from scratch. Use this if you need to use custom
Marco Nelissen050eb322014-05-09 15:10:23 -0700268 * crypto info, rather than one obtained from AMediaExtractor.
Marco Nelissen79e2b622014-05-16 08:07:28 -0700269 *
270 * AMediaCodecCryptoInfo describes the structure of an (at least
271 * partially) encrypted input sample.
272 * A buffer's data is considered to be partitioned into "subsamples",
273 * each subsample starts with a (potentially empty) run of plain,
274 * unencrypted bytes followed by a (also potentially empty) run of
275 * encrypted bytes.
276 * numBytesOfClearData can be null to indicate that all data is encrypted.
277 * This information encapsulates per-sample metadata as outlined in
278 * ISO/IEC FDIS 23001-7:2011 "Common encryption in ISO base media file format files".
Marco Nelissen050eb322014-05-09 15:10:23 -0700279 */
280AMediaCodecCryptoInfo *AMediaCodecCryptoInfo_new(
281 int numsubsamples,
282 uint8_t key[16],
283 uint8_t iv[16],
Marco Nelissen79e2b622014-05-16 08:07:28 -0700284 cryptoinfo_mode_t mode,
Marco Nelissen050eb322014-05-09 15:10:23 -0700285 size_t *clearbytes,
286 size_t *encryptedbytes);
287
288/**
Marco Nelissen829e0972014-05-13 16:22:19 -0700289 * delete an AMediaCodecCryptoInfo created previously with AMediaCodecCryptoInfo_new, or
Marco Nelissen050eb322014-05-09 15:10:23 -0700290 * obtained from AMediaExtractor
291 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700292media_status_t AMediaCodecCryptoInfo_delete(AMediaCodecCryptoInfo*);
Marco Nelissen050eb322014-05-09 15:10:23 -0700293
Marco Nelissen79e2b622014-05-16 08:07:28 -0700294/**
Jeff Tinker18cb1ec2015-12-18 11:55:22 -0800295 * Set the crypto pattern on an AMediaCryptoInfo object
296 */
297void AMediaCodecCryptoInfo_setPattern(
298 AMediaCodecCryptoInfo *info,
299 cryptoinfo_pattern_t *pattern);
300
301/**
Marco Nelissen79e2b622014-05-16 08:07:28 -0700302 * The number of subsamples that make up the buffer's contents.
303 */
Marco Nelissen050eb322014-05-09 15:10:23 -0700304size_t AMediaCodecCryptoInfo_getNumSubSamples(AMediaCodecCryptoInfo*);
Marco Nelissen79e2b622014-05-16 08:07:28 -0700305
306/**
307 * A 16-byte opaque key
308 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700309media_status_t AMediaCodecCryptoInfo_getKey(AMediaCodecCryptoInfo*, uint8_t *dst);
Marco Nelissen79e2b622014-05-16 08:07:28 -0700310
311/**
312 * A 16-byte initialization vector
313 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700314media_status_t AMediaCodecCryptoInfo_getIV(AMediaCodecCryptoInfo*, uint8_t *dst);
Marco Nelissen79e2b622014-05-16 08:07:28 -0700315
316/**
317 * The type of encryption that has been applied,
318 * one of AMEDIACODECRYPTOINFO_MODE_CLEAR or AMEDIACODECRYPTOINFO_MODE_AES_CTR.
319 */
320cryptoinfo_mode_t AMediaCodecCryptoInfo_getMode(AMediaCodecCryptoInfo*);
321
322/**
323 * The number of leading unencrypted bytes in each subsample.
324 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700325media_status_t AMediaCodecCryptoInfo_getClearBytes(AMediaCodecCryptoInfo*, size_t *dst);
Marco Nelissen79e2b622014-05-16 08:07:28 -0700326
327/**
328 * The number of trailing encrypted bytes in each subsample.
329 */
Marco Nelissene419d7c2014-05-15 14:17:25 -0700330media_status_t AMediaCodecCryptoInfo_getEncryptedBytes(AMediaCodecCryptoInfo*, size_t *dst);
Marco Nelissen050eb322014-05-09 15:10:23 -0700331
Dan Albert2975a242016-09-23 16:17:45 -0700332#endif /* __ANDROID_API__ >= 21 */
333
Marco Nelissen0c3be872014-05-01 10:14:44 -0700334#ifdef __cplusplus
335} // extern "C"
336#endif
337
338#endif //_NDK_MEDIA_CODEC_H