NdkMediaCodec.h revision e419d7cd5c62b4b5866a45d59c5770bb470193c1
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*
18 * 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
30#include <android/native_window.h>
31
32#include "NdkMediaCrypto.h"
33#include "NdkMediaError.h"
34#include "NdkMediaFormat.h"
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40
41struct AMediaCodec;
42typedef struct AMediaCodec AMediaCodec;
43
44struct AMediaCodecBufferInfo {
45    int32_t offset;
46    int32_t size;
47    int64_t presentationTimeUs;
48    uint32_t flags;
49};
50typedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo;
51typedef struct AMediaCodecCryptoInfo AMediaCodecCryptoInfo;
52
53enum {
54    AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4,
55    AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1,
56    AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3,
57    AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2,
58    AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1
59};
60
61/**
62 * Create codec by name. Use this if you know the exact codec you want to use.
63 * When configuring, you will need to specify whether to use the codec as an
64 * encoder or decoder.
65 */
66AMediaCodec* AMediaCodec_createCodecByName(const char *name);
67
68/**
69 * Create codec by mime type. Most applications will use this, specifying a
70 * mime type obtained from media extractor.
71 */
72AMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type);
73
74/**
75 * Create encoder by name.
76 */
77AMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type);
78
79/**
80 * delete the codec and free its resources
81 */
82media_status_t AMediaCodec_delete(AMediaCodec*);
83
84/**
85 * Configure the codec. For decoding you would typically get the format from an extractor.
86 */
87media_status_t AMediaCodec_configure(
88        AMediaCodec*,
89        const AMediaFormat* format,
90        ANativeWindow* surface,
91        AMediaCrypto *crypto,
92        uint32_t flags);
93
94/**
95 * Start the codec. A codec must be configured before it can be started, and must be started
96 * before buffers can be sent to it.
97 */
98media_status_t AMediaCodec_start(AMediaCodec*);
99
100/**
101 * Stop the codec.
102 */
103media_status_t AMediaCodec_stop(AMediaCodec*);
104
105/*
106 * Flush the codec's input and output. All indices previously returned from calls to
107 * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid.
108 */
109media_status_t AMediaCodec_flush(AMediaCodec*);
110
111/**
112 * Get an input buffer. The specified buffer index must have been previously obtained from
113 * dequeueInputBuffer, and not yet queued.
114 */
115uint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
116
117/**
118 * Get an output buffer. The specified buffer index must have been previously obtained from
119 * dequeueOutputBuffer, and not yet queued.
120 */
121uint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size);
122
123/**
124 * Get the index of the next available input buffer. An app will typically use this with
125 * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded
126 * into the buffer before passing it to the codec.
127 */
128ssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs);
129
130/**
131 * Send the specified buffer to the codec for processing.
132 */
133media_status_t AMediaCodec_queueInputBuffer(AMediaCodec*,
134        size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
135
136/**
137 * Send the specified buffer to the codec for processing.
138 */
139media_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*,
140        size_t idx, off_t offset, AMediaCodecCryptoInfo*, uint64_t time, uint32_t flags);
141
142/**
143 * Get the index of the next available buffer of processed data.
144 */
145ssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info, int64_t timeoutUs);
146AMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*);
147
148/**
149 * Release and optionally render the specified buffer.
150 */
151media_status_t AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render);
152
153
154typedef void (*OnCodecEvent)(AMediaCodec *codec, void *userdata);
155
156/**
157 * Set a callback to be called when a new buffer is available, or there was a format
158 * or buffer change.
159 * Note that you cannot perform any operations on the mediacodec from within the callback.
160 * If you need to perform mediacodec operations, you must do so on a different thread.
161 */
162media_status_t AMediaCodec_setNotificationCallback(
163        AMediaCodec*, OnCodecEvent callback, void *userdata);
164
165
166enum {
167    AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
168    AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1
169};
170
171/**
172 * create an AMediaCodecCryptoInfo from scratch. Use this if you need to use custom
173 * crypto info, rather than one obtained from AMediaExtractor.
174 */
175AMediaCodecCryptoInfo *AMediaCodecCryptoInfo_new(
176        int numsubsamples,
177        uint8_t key[16],
178        uint8_t iv[16],
179        uint32_t mode,
180        size_t *clearbytes,
181        size_t *encryptedbytes);
182
183/**
184 * delete an AMediaCodecCryptoInfo created previously with AMediaCodecCryptoInfo_new, or
185 * obtained from AMediaExtractor
186 */
187media_status_t AMediaCodecCryptoInfo_delete(AMediaCodecCryptoInfo*);
188
189size_t AMediaCodecCryptoInfo_getNumSubSamples(AMediaCodecCryptoInfo*);
190media_status_t AMediaCodecCryptoInfo_getKey(AMediaCodecCryptoInfo*, uint8_t *dst);
191media_status_t AMediaCodecCryptoInfo_getIV(AMediaCodecCryptoInfo*, uint8_t *dst);
192uint32_t AMediaCodecCryptoInfo_getMode(AMediaCodecCryptoInfo*);
193media_status_t AMediaCodecCryptoInfo_getClearBytes(AMediaCodecCryptoInfo*, size_t *dst);
194media_status_t AMediaCodecCryptoInfo_getEncryptedBytes(AMediaCodecCryptoInfo*, size_t *dst);
195
196#ifdef __cplusplus
197} // extern "C"
198#endif
199
200#endif //_NDK_MEDIA_CODEC_H
201