10c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/*
20c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Copyright (C) 2014 The Android Open Source Project
30c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen *
40c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
50c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * you may not use this file except in compliance with the License.
60c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * You may obtain a copy of the License at
70c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen *
80c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
90c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen *
100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Unless required by applicable law or agreed to in writing, software
110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * See the License for the specific language governing permissions and
140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * limitations under the License.
150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
170c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/*
180c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * This file defines an NDK API.
190c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not remove methods.
200c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change method signatures.
210c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change the value of constants.
220c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change the size of any of the classes defined in here.
230c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not reference types that are not part of the NDK.
240c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not #include files that aren't part of the NDK.
250c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
260c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
270c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifndef _NDK_MEDIA_CODEC_H
280c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#define _NDK_MEDIA_CODEC_H
290c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
3019abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#include <stdint.h>
312975a24dc42c8953125b39a5194da3aec244cbefDan Albert#include <sys/cdefs.h>
322975a24dc42c8953125b39a5194da3aec244cbefDan Albert
33050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCrypto.h"
34e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen#include "NdkMediaError.h"
350c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include "NdkMediaFormat.h"
360c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
370c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus
380c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenextern "C" {
390c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif
400c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
41bc1713d3b85d7ce656e032da6e4b6b342f14db03Mathias Agopianstruct ANativeWindow;
42bc1713d3b85d7ce656e032da6e4b6b342f14db03Mathias Agopian
432975a24dc42c8953125b39a5194da3aec244cbefDan Albert#if __ANDROID_API__ >= 21
440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
450c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodec;
460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodec AMediaCodec;
470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
480c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodecBufferInfo {
490c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int32_t offset;
500c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int32_t size;
510c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int64_t presentationTimeUs;
520c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    uint32_t flags;
530c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen};
540c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo;
55050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissentypedef struct AMediaCodecCryptoInfo AMediaCodecCryptoInfo;
560c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenenum {
580c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4,
5986aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen    AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1,
600c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3,
610c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2,
620c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1
630c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen};
640c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
650c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
6686aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * Create codec by name. Use this if you know the exact codec you want to use.
6786aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * When configuring, you will need to specify whether to use the codec as an
6886aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * encoder or decoder.
690c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
7086aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createCodecByName(const char *name);
710c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
720c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
730c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create codec by mime type. Most applications will use this, specifying a
740c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * mime type obtained from media extractor.
750c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
7686aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type);
770c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
780c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
790c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create encoder by name.
800c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
8186aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type);
820c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
830c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
840c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * delete the codec and free its resources
850c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
86e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_delete(AMediaCodec*);
870c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
880c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
890c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Configure the codec. For decoding you would typically get the format from an extractor.
900c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
91e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_configure(
92050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        AMediaCodec*,
93050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        const AMediaFormat* format,
94050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        ANativeWindow* surface,
95050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        AMediaCrypto *crypto,
96050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint32_t flags);
970c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
980c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
990c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Start the codec. A codec must be configured before it can be started, and must be started
1000c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * before buffers can be sent to it.
1010c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
102e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_start(AMediaCodec*);
1030c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1040c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1050c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Stop the codec.
1060c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
107e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_stop(AMediaCodec*);
1080c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1090c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/*
1100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Flush the codec's input and output. All indices previously returned from calls to
1110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid.
1120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
113e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_flush(AMediaCodec*);
1140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an input buffer. The specified buffer index must have been previously obtained from
1170c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueInputBuffer, and not yet queued.
1180c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1190c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
1200c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1210c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1220c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an output buffer. The specified buffer index must have been previously obtained from
1230c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueOutputBuffer, and not yet queued.
1240c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1250c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
1260c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1270c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1280c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available input buffer. An app will typically use this with
1290c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded
1300c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * into the buffer before passing it to the codec.
1310c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1320c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs);
1330c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
13419abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert/*
13519abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * __USE_FILE_OFFSET64 changes the type of off_t in LP32, which changes the ABI
13619abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * of these declarations to  not match the platform. In that case, define these
13719abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * APIs in terms of int32_t instead. Passing an off_t in this situation will
13819abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * result in silent truncation unless the user builds with -Wconversion, but the
13919abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * only alternative it to not expose them at all for this configuration, which
14019abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * makes the whole API unusable.
14119abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert *
14219abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert * https://github.com/android-ndk/ndk/issues/459
14319abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert */
14419abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#if defined(__USE_FILE_OFFSET64) && !defined(__LP64__)
14519abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#define _off_t_compat int32_t
14619abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#else
14719abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#define _off_t_compat off_t
14819abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#endif  /* defined(__USE_FILE_OFFSET64) && !defined(__LP64__) */
14919abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert
15019abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
15119abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert    __STDC_VERSION__ >= 201112L
15219abcd84905a6613b4869478a46b4a4087ab7f46Dan Albertstatic_assert(sizeof(_off_t_compat) == sizeof(long),
15319abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert              "_off_t_compat does not match the NDK ABI. See "
15419abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert              "https://github.com/android-ndk/ndk/issues/459.");
15519abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#endif
15619abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert
1570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1580c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Send the specified buffer to the codec for processing.
1590c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
16019abcd84905a6613b4869478a46b4a4087ab7f46Dan Albertmedia_status_t AMediaCodec_queueInputBuffer(AMediaCodec*, size_t idx,
16119abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert                                            _off_t_compat offset, size_t size,
16219abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert                                            uint64_t time, uint32_t flags);
1630c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1640c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
165050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Send the specified buffer to the codec for processing.
166050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
16719abcd84905a6613b4869478a46b4a4087ab7f46Dan Albertmedia_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*, size_t idx,
16819abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert                                                  _off_t_compat offset,
16919abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert                                                  AMediaCodecCryptoInfo*,
17019abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert                                                  uint64_t time, uint32_t flags);
17119abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert
17219abcd84905a6613b4869478a46b4a4087ab7f46Dan Albert#undef _off_t_compat
173050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
174050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
1750c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available buffer of processed data.
1760c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
177b187de1ada34a9023c05d020a4592686ba761278Glenn Kastenssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info,
178b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten        int64_t timeoutUs);
1790c3be875376adaee8d8e8dd917c64926e1513b29Marco NelissenAMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*);
1800c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1810c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
18279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * If you are done with a buffer, use this call to return the buffer to
18379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * the codec. If you previously specified a surface when configuring this
18479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * video decoder you can optionally render the buffer.
1850c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
186e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render);
1870c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
18879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
1898c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava * Dynamically sets the output surface of a codec.
1908c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *
1918c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *  This can only be used if the codec was configured with an output surface.  The
1928c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *  new output surface should have a compatible usage type to the original output surface.
1938c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *  E.g. codecs may not support switching from a SurfaceTexture (GPU readable) output
1948c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *  to ImageReader (software readable) output.
1958c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava *
1968c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava * For more details, see the Java documentation for MediaCodec.setOutputSurface.
1978c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava */
1988c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastavamedia_status_t AMediaCodec_setOutputSurface(AMediaCodec*, ANativeWindow* surface);
1998c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava
2008c35da50221e6d87e49c13ad2f058f265b3b29c4Vineeta Srivastava/**
20179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * If you are done with a buffer, use this call to update its surface timestamp
20279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * and return it to the codec to render it on the output surface. If you
20379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * have not specified an output surface when configuring this video codec,
20479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * this call will simply return the buffer to the codec.
20579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen *
20679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * For more details, see the Java documentation for MediaCodec.releaseOutputBuffer.
20779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
20879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissenmedia_status_t AMediaCodec_releaseOutputBufferAtTime(
20979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen        AMediaCodec *mData, size_t idx, int64_t timestampNs);
2100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
21119431587cec960606a8756fa2767bc4bce987318Praveen Chavan/**
21219431587cec960606a8756fa2767bc4bce987318Praveen Chavan * Creates a Surface that can be used as the input to encoder, in place of input buffers
21319431587cec960606a8756fa2767bc4bce987318Praveen Chavan *
21419431587cec960606a8756fa2767bc4bce987318Praveen Chavan * This can only be called after the codec has been configured via
21519431587cec960606a8756fa2767bc4bce987318Praveen Chavan * AMediaCodec_configure(..); and before AMediaCodec_start() has been called.
21619431587cec960606a8756fa2767bc4bce987318Praveen Chavan *
21719431587cec960606a8756fa2767bc4bce987318Praveen Chavan * The application is responsible for releasing the surface by calling
21819431587cec960606a8756fa2767bc4bce987318Praveen Chavan * ANativeWindow_release() when done.
21919431587cec960606a8756fa2767bc4bce987318Praveen Chavan *
22019431587cec960606a8756fa2767bc4bce987318Praveen Chavan * For more details, see the Java documentation for MediaCodec.createInputSurface.
22119431587cec960606a8756fa2767bc4bce987318Praveen Chavan */
22285a536331e3a18a41361fe326187508a3e9972daPraveen Chavanmedia_status_t AMediaCodec_createInputSurface(
22385a536331e3a18a41361fe326187508a3e9972daPraveen Chavan        AMediaCodec *mData, ANativeWindow **surface);
22485a536331e3a18a41361fe326187508a3e9972daPraveen Chavan
22585a536331e3a18a41361fe326187508a3e9972daPraveen Chavan/**
22685a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * Creates a persistent Surface that can be used as the input to encoder
22785a536331e3a18a41361fe326187508a3e9972daPraveen Chavan *
22885a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * Persistent surface can be reused by MediaCodec instances and can be set
22985a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * on a new instance via AMediaCodec_setInputSurface().
23085a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * A persistent surface can be connected to at most one instance of MediaCodec
23185a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * at any point in time.
23285a536331e3a18a41361fe326187508a3e9972daPraveen Chavan *
23385a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * The application is responsible for releasing the surface by calling
23485a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * ANativeWindow_release() when done.
23585a536331e3a18a41361fe326187508a3e9972daPraveen Chavan *
23685a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * For more details, see the Java documentation for MediaCodec.createPersistentInputSurface.
23785a536331e3a18a41361fe326187508a3e9972daPraveen Chavan */
23885a536331e3a18a41361fe326187508a3e9972daPraveen Chavanmedia_status_t AMediaCodec_createPersistentInputSurface(
23985a536331e3a18a41361fe326187508a3e9972daPraveen Chavan        ANativeWindow **surface);
24085a536331e3a18a41361fe326187508a3e9972daPraveen Chavan
24185a536331e3a18a41361fe326187508a3e9972daPraveen Chavan/**
24285a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * Set a persistent-surface that can be used as the input to encoder, in place of input buffers
24385a536331e3a18a41361fe326187508a3e9972daPraveen Chavan *
24485a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * The surface provided *must* be a persistent surface created via
24585a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * AMediaCodec_createPersistentInputSurface()
24685a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * This can only be called after the codec has been configured by calling
24785a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * AMediaCodec_configure(..); and before AMediaCodec_start() has been called.
24885a536331e3a18a41361fe326187508a3e9972daPraveen Chavan *
24985a536331e3a18a41361fe326187508a3e9972daPraveen Chavan * For more details, see the Java documentation for MediaCodec.setInputSurface.
25085a536331e3a18a41361fe326187508a3e9972daPraveen Chavan */
25185a536331e3a18a41361fe326187508a3e9972daPraveen Chavanmedia_status_t AMediaCodec_setInputSurface(
25285a536331e3a18a41361fe326187508a3e9972daPraveen Chavan        AMediaCodec *mData, ANativeWindow *surface);
25385a536331e3a18a41361fe326187508a3e9972daPraveen Chavan
254f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan/**
255f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan * Signal additional parameters to the codec instance.
256f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan *
257f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan * Parameters can be communicated only when the codec is running, i.e
258f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan * after AMediaCodec_start() has been called.
259f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan *
260f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan * NOTE: Some of these parameter changes may silently fail to apply.
261f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan */
262f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavanmedia_status_t AMediaCodec_setParameters(
263f373e84c798b113d274a4d89edfea8afb899d3e2Praveen Chavan        AMediaCodec *mData, const AMediaFormat* params);
26485a536331e3a18a41361fe326187508a3e9972daPraveen Chavan
265af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih/**
266af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * Signals end-of-stream on input. Equivalent to submitting an empty buffer with
267af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM set.
268af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih *
269af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * Returns AMEDIA_ERROR_INVALID_OPERATION when used with an encoder not in executing state
270af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * or not receiving input from a Surface created by AMediaCodec_createInputSurface or
271af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * AMediaCodec_createPersistentInputSurface.
272af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih *
273af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * Returns the previous codec error if one exists.
274af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih *
275af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * Returns AMEDIA_OK when completed succesfully.
276af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih *
277af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih * For more details, see the Java documentation for MediaCodec.signalEndOfInputStream.
278af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih */
279af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shihmedia_status_t AMediaCodec_signalEndOfInputStream(AMediaCodec *mData);
280af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih
281af42d3f9c5fa1847b661a76bd888b480aedfe5a7Robert Shih
28219431587cec960606a8756fa2767bc4bce987318Praveen Chavan
28379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissentypedef enum {
284050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen    AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
285f45c7e7ec65d3fa754c0c538a680313a3647e644Jeff Tinker    AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1,
286f45c7e7ec65d3fa754c0c538a680313a3647e644Jeff Tinker    AMEDIACODECRYPTOINFO_MODE_AES_WV = 2,
287f45c7e7ec65d3fa754c0c538a680313a3647e644Jeff Tinker    AMEDIACODECRYPTOINFO_MODE_AES_CBC = 3
28879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen} cryptoinfo_mode_t;
289050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
29018cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinkertypedef struct {
29118cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker    int32_t encryptBlocks;
29218cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker    int32_t skipBlocks;
29318cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker} cryptoinfo_pattern_t;
29418cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker
295050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
29679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * Create an AMediaCodecCryptoInfo from scratch. Use this if you need to use custom
297050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * crypto info, rather than one obtained from AMediaExtractor.
29879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen *
29979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * AMediaCodecCryptoInfo describes the structure of an (at least
30079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * partially) encrypted input sample.
30179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * A buffer's data is considered to be partitioned into "subsamples",
30279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * each subsample starts with a (potentially empty) run of plain,
30379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * unencrypted bytes followed by a (also potentially empty) run of
30479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * encrypted bytes.
30579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * numBytesOfClearData can be null to indicate that all data is encrypted.
30679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * This information encapsulates per-sample metadata as outlined in
30779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * ISO/IEC FDIS 23001-7:2011 "Common encryption in ISO base media file format files".
308050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
309050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenAMediaCodecCryptoInfo *AMediaCodecCryptoInfo_new(
310050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        int numsubsamples,
311050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint8_t key[16],
312050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint8_t iv[16],
31379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen        cryptoinfo_mode_t mode,
314050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        size_t *clearbytes,
315050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        size_t *encryptedbytes);
316050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
317050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
318829e097f832b4c4c41733f9b77121888204d993eMarco Nelissen * delete an AMediaCodecCryptoInfo created previously with AMediaCodecCryptoInfo_new, or
319050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * obtained from AMediaExtractor
320050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
321e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodecCryptoInfo_delete(AMediaCodecCryptoInfo*);
322050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
32379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
32418cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker * Set the crypto pattern on an AMediaCryptoInfo object
32518cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker */
32618cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinkervoid AMediaCodecCryptoInfo_setPattern(
32718cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker        AMediaCodecCryptoInfo *info,
32818cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker        cryptoinfo_pattern_t *pattern);
32918cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker
33018cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker/**
33179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The number of subsamples that make up the buffer's contents.
33279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
333050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissensize_t AMediaCodecCryptoInfo_getNumSubSamples(AMediaCodecCryptoInfo*);
33479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen
33579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
33679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * A 16-byte opaque key
33779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
338e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodecCryptoInfo_getKey(AMediaCodecCryptoInfo*, uint8_t *dst);
33979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen
34079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
34179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * A 16-byte initialization vector
34279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
343e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodecCryptoInfo_getIV(AMediaCodecCryptoInfo*, uint8_t *dst);
34479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen
34579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
34679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The type of encryption that has been applied,
34779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * one of AMEDIACODECRYPTOINFO_MODE_CLEAR or AMEDIACODECRYPTOINFO_MODE_AES_CTR.
34879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
34979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissencryptoinfo_mode_t AMediaCodecCryptoInfo_getMode(AMediaCodecCryptoInfo*);
35079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen
35179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
35279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The number of leading unencrypted bytes in each subsample.
35379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
354e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodecCryptoInfo_getClearBytes(AMediaCodecCryptoInfo*, size_t *dst);
35579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen
35679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/**
35779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * The number of trailing encrypted bytes in each subsample.
35879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */
359e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaCodecCryptoInfo_getEncryptedBytes(AMediaCodecCryptoInfo*, size_t *dst);
360050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
3612975a24dc42c8953125b39a5194da3aec244cbefDan Albert#endif /* __ANDROID_API__ >= 21 */
3622975a24dc42c8953125b39a5194da3aec244cbefDan Albert
3630c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus
3640c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen} // extern "C"
3650c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif
3660c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
3670c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif //_NDK_MEDIA_CODEC_H
368