android_media_MediaCodec.h revision d8578577b02cf6360402eb8726e964d18b46434d
188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber/* 288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Copyright 2012, The Android Open Source Project 388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * you may not use this file except in compliance with the License. 688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * You may obtain a copy of the License at 788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 1088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Unless required by applicable law or agreed to in writing, software 1188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * See the License for the specific language governing permissions and 1488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * limitations under the License. 1588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber */ 1688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 1788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#ifndef _ANDROID_MEDIA_MEDIACODEC_H_ 1888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#define _ANDROID_MEDIA_MEDIACODEC_H_ 1988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "jni.h" 2188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 229e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber#include <media/hardware/CryptoAPI.h> 2388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ABase.h> 24aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber#include <media/stagefright/foundation/AHandler.h> 2588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <utils/Errors.h> 2688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubernamespace android { 2888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 297de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnarstruct ABuffer; 3088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct ALooper; 3188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct AMessage; 32bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huberstruct AString; 338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberstruct ICrypto; 34d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstruct IGraphicBufferProducer; 3588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct MediaCodec; 368034d60f6e044deafe48501dfbfe17c31284bc17Chong Zhangstruct PersistentSurface; 3752800617946c456e78ed010c82d0ec4358368164Mathias Agopianclass Surface; 3888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 39aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huberstruct JMediaCodec : public AHandler { 4088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JMediaCodec( 4188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, 4288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber const char *name, bool nameIsType, bool encoder); 4388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t initCheck() const; 4588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 46aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber void registerSelf(); 47128b012cc8c2369136bb8450bc91c81aebe18506Chong Zhang void release(); 48aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber 49d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar status_t enableOnFrameRenderedListener(jboolean enable); 50d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar 518d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang status_t setCallback(jobject cb); 528d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang 5388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t configure( 5488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber const sp<AMessage> &format, 55d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer, 568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber const sp<ICrypto> &crypto, 5788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber int flags); 5888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 595e02ba977ede1e38c9f206057ec3f0f1e89ba943Lajos Molnar status_t setSurface( 605e02ba977ede1e38c9f206057ec3f0f1e89ba943Lajos Molnar const sp<IGraphicBufferProducer> &surface); 615e02ba977ede1e38c9f206057ec3f0f1e89ba943Lajos Molnar 622621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); 639560ddb48af0e2da7743452f8d9d6d9cd34d8438Chong Zhang status_t setInputSurface(const sp<PersistentSurface> &surface); 642621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden 6588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t start(); 6688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t stop(); 671e6e8018a4f914210b615bfca0f818fd13574228Lajos Molnar status_t reset(); 6888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 6988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t flush(); 7088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 7188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t queueInputBuffer( 7288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber size_t index, 73bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber size_t offset, size_t size, int64_t timeUs, uint32_t flags, 74bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber AString *errorDetailMsg); 7588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 769e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber status_t queueSecureInputBuffer( 779e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber size_t index, 789e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber size_t offset, 799e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber const CryptoPlugin::SubSample *subSamples, 809e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber size_t numSubSamples, 819e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber const uint8_t key[16], 829e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber const uint8_t iv[16], 839e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber CryptoPlugin::Mode mode, 849e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber int64_t presentationTimeUs, 85bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber uint32_t flags, 86bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber AString *errorDetailMsg); 879e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber 8888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs); 8988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 9088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t dequeueOutputBuffer( 9188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject bufferInfo, size_t *index, int64_t timeoutUs); 9288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 937c513b6bef8ed4dfc28e0af6c8594563fdb9f436Lajos Molnar status_t releaseOutputBuffer( 947c513b6bef8ed4dfc28e0af6c8594563fdb9f436Lajos Molnar size_t index, bool render, bool updatePTS, int64_t timestampNs); 9588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 962621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden status_t signalEndOfInputStream(); 972621e40d0e0a496a96575768b7e2b70e3b3be640Andy McFadden 98d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar status_t getFormat(JNIEnv *env, bool input, jobject *format) const; 99d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar 100d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar status_t getOutputFormat(JNIEnv *env, size_t index, jobject *format) const; 10188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 10288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t getBuffers( 10388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, bool input, jobjectArray *bufArray) const; 10488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 105d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar status_t getBuffer( 106d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar JNIEnv *env, bool input, size_t index, jobject *buf) const; 107d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar 108d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar status_t getImage( 109d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar JNIEnv *env, bool input, size_t index, jobject *image) const; 110d4023114e8cf7ec7db4d07958a303699b658f2c0Lajos Molnar 111056ef2ed5ff92b742fe53f2498c596ec1f6bed3cMartin Storsjo status_t getName(JNIEnv *env, jstring *name) const; 112056ef2ed5ff92b742fe53f2498c596ec1f6bed3cMartin Storsjo 113226065bbe60cf32b33a5f86d27e2db88138e4486Andreas Huber status_t setParameters(const sp<AMessage> ¶ms); 114226065bbe60cf32b33a5f86d27e2db88138e4486Andreas Huber 115b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber void setVideoScalingMode(int mode); 116b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber 11788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberprotected: 11888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber virtual ~JMediaCodec(); 11988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 120aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 121aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber 12288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberprivate: 123aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber enum { 1248d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang kWhatCallbackNotify, 125d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar kWhatFrameRendered, 126aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber }; 127aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber 12888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jclass mClass; 12988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jweak mObject; 13052800617946c456e78ed010c82d0ec4358368164Mathias Agopian sp<Surface> mSurfaceTextureClient; 13188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 1327de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar // java objects cached 1337de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jclass mByteBufferClass; 1347de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jobject mNativeByteOrderObj; 1357de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jmethodID mByteBufferOrderMethodID; 1367de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jmethodID mByteBufferPositionMethodID; 1377de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jmethodID mByteBufferLimitMethodID; 1387de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jmethodID mByteBufferAsReadOnlyBufferMethodID; 1397de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar 14088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<ALooper> mLooper; 14188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<MediaCodec> mCodec; 14288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 1438d5e556b2b76278000a506382fdf594c071e1fbdChong Zhang sp<AMessage> mCallbackNotification; 144d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar sp<AMessage> mOnFrameRenderedNotification; 145aba671392d6606e35726c350a28d0c9b36ebfe16Andreas Huber 1465f9aa0bcea8be860fdf5a35476435616cb5f44f3Andy Hung status_t mInitStatus; 1475f9aa0bcea8be860fdf5a35476435616cb5f44f3Andy Hung 1487de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar status_t createByteBufferFromABuffer( 1497de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar JNIEnv *env, bool readOnly, bool clearBuffer, const sp<ABuffer> &buffer, 1507de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar jobject *buf) const; 1517de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar 1527de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar void cacheJavaObjects(JNIEnv *env); 1537de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar void deleteJavaObjects(JNIEnv *env); 154d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar void handleCallback(const sp<AMessage> &msg); 155d8578577b02cf6360402eb8726e964d18b46434dLajos Molnar void handleFrameRenderedNotification(const sp<AMessage> &msg); 1567de28d34f1ca3a727a8325cf3304f2fe03d2ac59Lajos Molnar 15788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(JMediaCodec); 15888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}; 15988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 16088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} // namespace android 16188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 16288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#endif // _ANDROID_MEDIA_MEDIACODEC_H_ 163