NdkMediaCodec.h revision 829e097f832b4c4c41733f9b77121888204d993e
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
300c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include <android/native_window.h>
310c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
32050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCrypto.h"
330c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include "NdkMediaFormat.h"
340c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
350c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus
360c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenextern "C" {
370c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif
380c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
390c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
400c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodec;
410c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodec AMediaCodec;
420c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
430c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodecBufferInfo {
440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int32_t offset;
450c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int32_t size;
460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    int64_t presentationTimeUs;
470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    uint32_t flags;
480c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen};
490c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo;
50050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissentypedef struct AMediaCodecCryptoInfo AMediaCodecCryptoInfo;
510c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
520c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenenum {
530c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4,
5486aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen    AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1,
550c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3,
560c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2,
570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen    AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1
580c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen};
590c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
600c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
6186aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * Create codec by name. Use this if you know the exact codec you want to use.
6286aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * When configuring, you will need to specify whether to use the codec as an
6386aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * encoder or decoder.
640c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
6586aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createCodecByName(const char *name);
660c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
670c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
680c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create codec by mime type. Most applications will use this, specifying a
690c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * mime type obtained from media extractor.
700c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
7186aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type);
720c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
730c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
740c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create encoder by name.
750c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
7686aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type);
770c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
780c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
790c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * delete the codec and free its resources
800c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
810c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_delete(AMediaCodec*);
820c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
830c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
840c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Configure the codec. For decoding you would typically get the format from an extractor.
850c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
86050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodec_configure(
87050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        AMediaCodec*,
88050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        const AMediaFormat* format,
89050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        ANativeWindow* surface,
90050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        AMediaCrypto *crypto,
91050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint32_t flags);
920c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
930c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
940c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Start the codec. A codec must be configured before it can be started, and must be started
950c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * before buffers can be sent to it.
960c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
970c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_start(AMediaCodec*);
980c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
990c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1000c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Stop the codec.
1010c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1020c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_stop(AMediaCodec*);
1030c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1040c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/*
1050c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Flush the codec's input and output. All indices previously returned from calls to
1060c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid.
1070c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1080c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_flush(AMediaCodec*);
1090c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an input buffer. The specified buffer index must have been previously obtained from
1120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueInputBuffer, and not yet queued.
1130c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
1150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1170c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an output buffer. The specified buffer index must have been previously obtained from
1180c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueOutputBuffer, and not yet queued.
1190c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1200c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
1210c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1220c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1230c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available input buffer. An app will typically use this with
1240c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded
1250c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * into the buffer before passing it to the codec.
1260c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1270c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs);
1280c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1290c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1300c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Send the specified buffer to the codec for processing.
1310c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1320c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_queueInputBuffer(AMediaCodec*,
1330c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen        size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
1340c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1350c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
136050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Send the specified buffer to the codec for processing.
137050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
138050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodec_queueSecureInputBuffer(AMediaCodec*,
139050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        size_t idx, off_t offset, AMediaCodecCryptoInfo*, uint64_t time, uint32_t flags);
140050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
141050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
1420c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available buffer of processed data.
1430c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info, int64_t timeoutUs);
1450c3be875376adaee8d8e8dd917c64926e1513b29Marco NelissenAMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*);
1460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/**
1480c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Release and optionally render the specified buffer.
1490c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */
1500c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render);
1510c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1520c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
153cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissentypedef void (*OnCodecEvent)(AMediaCodec *codec, void *userdata);
154cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen
155cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen/**
156cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen * Set a callback to be called when a new buffer is available, or there was a format
157cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen * or buffer change.
158cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen * Note that you cannot perform any operations on the mediacodec from within the callback.
159cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen * If you need to perform mediacodec operations, you must do so on a different thread.
160cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen */
161cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissenint AMediaCodec_setNotificationCallback(AMediaCodec*, OnCodecEvent callback, void *userdata);
162cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen
163cdb42cdc5ccb785edabe1ee6407134fbae5662a9Marco Nelissen
164050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenenum {
165050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen    AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
166050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen    AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1
167050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen};
168050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
169050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
170050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * create an AMediaCodecCryptoInfo from scratch. Use this if you need to use custom
171050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * crypto info, rather than one obtained from AMediaExtractor.
172050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
173050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenAMediaCodecCryptoInfo *AMediaCodecCryptoInfo_new(
174050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        int numsubsamples,
175050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint8_t key[16],
176050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint8_t iv[16],
177050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        uint32_t mode,
178050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        size_t *clearbytes,
179050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen        size_t *encryptedbytes);
180050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
181050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/**
182829e097f832b4c4c41733f9b77121888204d993eMarco Nelissen * delete an AMediaCodecCryptoInfo created previously with AMediaCodecCryptoInfo_new, or
183050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * obtained from AMediaExtractor
184050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */
185050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodecCryptoInfo_delete(AMediaCodecCryptoInfo*);
186050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
187050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissensize_t AMediaCodecCryptoInfo_getNumSubSamples(AMediaCodecCryptoInfo*);
188050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodecCryptoInfo_getKey(AMediaCodecCryptoInfo*, uint8_t *dst);
189050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodecCryptoInfo_getIV(AMediaCodecCryptoInfo*, uint8_t *dst);
190050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenuint32_t AMediaCodecCryptoInfo_getMode(AMediaCodecCryptoInfo*);
191050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodecCryptoInfo_getClearBytes(AMediaCodecCryptoInfo*, size_t *dst);
192050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenint AMediaCodecCryptoInfo_getEncryptedBytes(AMediaCodecCryptoInfo*, size_t *dst);
193050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen
1940c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus
1950c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen} // extern "C"
1960c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif
1970c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen
1980c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif //_NDK_MEDIA_CODEC_H
199