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