NdkMediaCodec.h revision 86aa02ce274826dc80ffa00766b16172c47503fd
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 320c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include "NdkMediaFormat.h" 330c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 340c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus 350c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenextern "C" { 360c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif 370c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 380c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 390c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodec; 400c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodec AMediaCodec; 410c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 420c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaCodecBufferInfo { 430c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen int32_t offset; 440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen int32_t size; 450c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen int64_t presentationTimeUs; 460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen uint32_t flags; 470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen}; 480c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo; 490c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 500c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenenum { 510c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4, 5286aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1, 530c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3, 540c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2, 550c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1 560c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen}; 570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 580c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 590c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 6086aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * Create codec by name. Use this if you know the exact codec you want to use. 6186aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * When configuring, you will need to specify whether to use the codec as an 6286aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen * encoder or decoder. 630c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 6486aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createCodecByName(const char *name); 650c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 660c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 670c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create codec by mime type. Most applications will use this, specifying a 680c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * mime type obtained from media extractor. 690c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 7086aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type); 710c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 720c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 730c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create encoder by name. 740c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 7586aa02ce274826dc80ffa00766b16172c47503fdMarco NelissenAMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type); 760c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 770c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 780c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * delete the codec and free its resources 790c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 800c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_delete(AMediaCodec*); 810c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 820c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 830c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Configure the codec. For decoding you would typically get the format from an extractor. 840c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 8586aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissenint AMediaCodec_configure(AMediaCodec*, const AMediaFormat* format, 8686aa02ce274826dc80ffa00766b16172c47503fdMarco Nelissen ANativeWindow* surface, uint32_t flags); // TODO: other args 870c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 880c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 890c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Start the codec. A codec must be configured before it can be started, and must be started 900c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * before buffers can be sent to it. 910c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 920c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_start(AMediaCodec*); 930c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 940c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 950c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Stop the codec. 960c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 970c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_stop(AMediaCodec*); 980c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 990c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/* 1000c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Flush the codec's input and output. All indices previously returned from calls to 1010c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid. 1020c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1030c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_flush(AMediaCodec*); 1040c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1050c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1060c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an input buffer. The specified buffer index must have been previously obtained from 1070c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueInputBuffer, and not yet queued. 1080c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1090c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size); 1100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get an output buffer. The specified buffer index must have been previously obtained from 1130c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * dequeueOutputBuffer, and not yet queued. 1140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenuint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size); 1160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1170c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1180c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available input buffer. An app will typically use this with 1190c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded 1200c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * into the buffer before passing it to the codec. 1210c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1220c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs); 1230c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1240c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1250c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Send the specified buffer to the codec for processing. 1260c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1270c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_queueInputBuffer(AMediaCodec*, 1280c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags); 1290c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1300c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1310c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Get the index of the next available buffer of processed data. 1320c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1330c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info, int64_t timeoutUs); 1340c3be875376adaee8d8e8dd917c64926e1513b29Marco NelissenAMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*); 1350c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1360c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1370c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Release and optionally render the specified buffer. 1380c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1390c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render); 1400c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1410c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1420c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1430c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus 1440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen} // extern "C" 1450c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif 1460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif //_NDK_MEDIA_CODEC_H 148