MediaCodec.h revision 5b8987e7de9d04b09153f329c680d2316cdb44ec
1f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten/* 2f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Copyright 2012, The Android Open Source Project 3f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * 4f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * you may not use this file except in compliance with the License. 6f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * You may obtain a copy of the License at 7f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * 8f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * 10f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * See the License for the specific language governing permissions and 14f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * limitations under the License. 15f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten */ 16f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 17f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#ifndef MEDIA_CODEC_H_ 18f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 19f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#define MEDIA_CODEC_H_ 20f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 21f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <gui/ISurfaceTexture.h> 22f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <media/hardware/CryptoAPI.h> 23f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <media/stagefright/foundation/AHandler.h> 24f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <utils/Vector.h> 25f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 26f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastennamespace android { 27f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 28f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct ABuffer; 29f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct ACodec; 30f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct AMessage; 31f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct AString; 32e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kastenstruct ICrypto; 33f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct SoftwareRenderer; 34f9715e43ea73361321663514c44129c939c5db2fGlenn Kastenstruct SurfaceTextureClient; 35e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 36e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kastenstruct MediaCodec : public AHandler { 37e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten enum ConfigureFlags { 38e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten CONFIGURE_FLAG_ENCODE = 1, 39f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten }; 40e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 41e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten enum BufferFlags { 42f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten BUFFER_FLAG_SYNCFRAME = 1, 43e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten BUFFER_FLAG_CODECCONFIG = 2, 44f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten BUFFER_FLAG_EOS = 4, 45f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten }; 46f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 47f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten static sp<MediaCodec> CreateByType( 48f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const sp<ALooper> &looper, const char *mime, bool encoder); 49f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 50f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten static sp<MediaCodec> CreateByComponentName( 51f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const sp<ALooper> &looper, const char *name); 52f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 53f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t configure( 54f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const sp<AMessage> &format, 55f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const sp<SurfaceTextureClient> &nativeWindow, 56f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const sp<ICrypto> &crypto, 57f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t flags); 58f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 59f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t start(); 60f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 61f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten // Returns to a state in which the component remains allocated but 62f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten // unconfigured. 63f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t stop(); 64f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 65f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten // Client MUST call release before releasing final reference to this 66e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten // object. 67e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten status_t release(); 68f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 69f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t flush(); 70f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 71f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t queueInputBuffer( 725115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten size_t index, 73f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t offset, 74f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t size, 75f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten int64_t presentationTimeUs, 76f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t flags, 77f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten AString *errorDetailMsg = NULL); 78f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 79f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t queueSecureInputBuffer( 80f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t index, 81f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t offset, 82f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const CryptoPlugin::SubSample *subSamples, 83f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t numSubSamples, 84f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const uint8_t key[16], 85f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten const uint8_t iv[16], 86f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten CryptoPlugin::Mode mode, 87f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten int64_t presentationTimeUs, 88f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t flags, 894dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten AString *errorDetailMsg = NULL); 904dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten 914dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll); 92f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 93f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t dequeueOutputBuffer( 94f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t *index, 95f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t *offset, 96f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t *size, 97e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int64_t *presentationTimeUs, 98e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten uint32_t *flags, 99e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int64_t timeoutUs = 0ll); 100e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 101e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten status_t renderOutputBufferAndRelease(size_t index); 102e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten status_t releaseOutputBuffer(size_t index); 103e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 104f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t getOutputFormat(sp<AMessage> *format) const; 105e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 106e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; 10757c4e6f7464d458eb52d209c2a63524913d6406dGlenn Kasten status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const; 108e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 109d330ee46022f34da76d14d0c4d2910526ecc2321Andy Hungprotected: 11057c4e6f7464d458eb52d209c2a63524913d6406dGlenn Kasten virtual ~MediaCodec(); 111f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten virtual void onMessageReceived(const sp<AMessage> &msg); 112e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 113f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenprivate: 114f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten enum State { 115f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten UNINITIALIZED, 116f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten INITIALIZING, 117e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten INITIALIZED, 118e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten CONFIGURING, 119e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten CONFIGURED, 120f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten STARTING, 121f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten STARTED, 122f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten FLUSHING, 123f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten STOPPING, 124e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten RELEASING, 125e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten }; 126f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 127f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten enum { 128e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kPortIndexInput = 0, 1295115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten kPortIndexOutput = 1, 1305115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten }; 131e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 132e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten enum { 133f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kWhatInit = 'init', 134f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kWhatConfigure = 'conf', 135f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kWhatStart = 'strt', 1360a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung kWhatStop = 'stop', 1370a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung kWhatRelease = 'rele', 1380a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung kWhatDequeueInputBuffer = 'deqI', 139e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatQueueInputBuffer = 'queI', 140e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatDequeueOutputBuffer = 'deqO', 141e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatReleaseOutputBuffer = 'relO', 142e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatGetBuffers = 'getB', 143e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatFlush = 'flus', 144e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatGetOutputFormat = 'getO', 145f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kWhatDequeueInputTimedOut = 'dITO', 146e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatDequeueOutputTimedOut = 'dOTO', 147e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kWhatCodecNotify = 'codc', 148e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten }; 149e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 150e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten enum { 151e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kFlagIsSoftwareCodec = 1, 152f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kFlagOutputFormatChanged = 2, 153e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten kFlagOutputBuffersChanged = 4, 154f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kFlagStickyError = 8, 155f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kFlagDequeueInputPending = 16, 156f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kFlagDequeueOutputPending = 32, 157f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten kFlagIsSecure = 64, 158f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten }; 159f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 160f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten struct BufferInfo { 1614dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten void *mBufferID; 1624dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten sp<ABuffer> mData; 1634dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten sp<ABuffer> mEncryptedData; 164f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten sp<AMessage> mNotify; 165f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten bool mOwnedByClient; 166f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten }; 167e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 168e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten State mState; 169f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten sp<ALooper> mLooper; 170f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten sp<ALooper> mCodecLooper; 171d79072e9dff59f767cce2cda1caab80ce5a0815bGlenn Kasten sp<ACodec> mCodec; 172f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t mReplyID; 173f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t mFlags; 174f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten sp<SurfaceTextureClient> mNativeWindow; 175f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten SoftwareRenderer *mSoftRenderer; 176e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten sp<AMessage> mOutputFormat; 177e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 178e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten List<size_t> mAvailPortBuffers[2]; 179f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten Vector<BufferInfo> mPortBuffers[2]; 180f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 181e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int32_t mDequeueInputTimeoutGeneration; 182f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t mDequeueInputReplyID; 183f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 184e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten int32_t mDequeueOutputTimeoutGeneration; 185f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten uint32_t mDequeueOutputReplyID; 186f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 187f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten sp<ICrypto> mCrypto; 188e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 189e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten MediaCodec(const sp<ALooper> &looper); 190e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 1915115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten static status_t PostAndAwaitResponse( 192e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten const sp<AMessage> &msg, sp<AMessage> *response); 193f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 194e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten status_t init(const char *name, bool nameIsType, bool encoder); 195e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten 196f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten void setState(State newState); 197f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten void returnBuffersToCodec(); 198f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten void returnBuffersToCodecOnPort(int32_t portIndex); 199f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg); 200f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t onQueueInputBuffer(const sp<AMessage> &msg); 201f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten status_t onReleaseOutputBuffer(const sp<AMessage> &msg); 202f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten ssize_t dequeuePortBuffer(int32_t portIndex); 203f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 204f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false); 205f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false); 206f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten void cancelPendingDequeueOperations(); 207f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 208f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten DISALLOW_EVIL_CONSTRUCTORS(MediaCodec); 209f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten}; 210f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 211f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten} // namespace android 212f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten 213f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#endif // MEDIA_CODEC_H_ 214f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten