MediaCodec.h revision 1a2952aee048ca7b1765e2bc09ebe9aeddaeafa3
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2012, The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_CODEC_H_
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_CODEC_H_
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <gui/IGraphicBufferProducer.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/hardware/CryptoAPI.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/foundation/AHandler.h>
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utils/Vector.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ABuffer;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ACodec;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AMessage;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AString;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ICrypto;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SoftwareRenderer;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct Surface;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)struct MediaCodec : public AHandler {
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    enum ConfigureFlags {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CONFIGURE_FLAG_ENCODE   = 1,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum BufferFlags {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BUFFER_FLAG_SYNCFRAME   = 1,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BUFFER_FLAG_CODECCONFIG = 2,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BUFFER_FLAG_EOS         = 4,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static sp<MediaCodec> CreateByType(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<ALooper> &looper, const char *mime, bool encoder);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static sp<MediaCodec> CreateByComponentName(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<ALooper> &looper, const char *name);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t configure(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<AMessage> &format,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<Surface> &nativeWindow,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<ICrypto> &crypto,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t flags);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    status_t start();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns to a state in which the component remains allocated but
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // unconfigured.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t stop();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Client MUST call release before releasing final reference to this
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // object.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t release();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t flush();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t queueInputBuffer(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t index,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t offset,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t size,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int64_t presentationTimeUs,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            uint32_t flags,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AString *errorDetailMsg = NULL);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t queueSecureInputBuffer(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t index,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t offset,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            const CryptoPlugin::SubSample *subSamples,
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            size_t numSubSamples,
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            const uint8_t key[16],
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            const uint8_t iv[16],
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            CryptoPlugin::Mode mode,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int64_t presentationTimeUs,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t flags,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AString *errorDetailMsg = NULL);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    status_t dequeueOutputBuffer(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            size_t *index,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            size_t *offset,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t *size,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int64_t *presentationTimeUs,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            uint32_t *flags,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int64_t timeoutUs = 0ll);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t renderOutputBufferAndRelease(size_t index);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t releaseOutputBuffer(size_t index);
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    status_t getOutputFormat(sp<AMessage> *format) const;
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t requestIDRFrame();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notification will be posted once there "is something to do", i.e.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // an input/output buffer has become available, a format change is
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pending, an error is pending.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void requestActivityNotification(const sp<AMessage> &notify);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t getName(AString *componentName) const;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    status_t setParameters(const sp<AMessage> &params);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MediaCodec();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void onMessageReceived(const sp<AMessage> &msg);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum State {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        UNINITIALIZED,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        INITIALIZING,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        INITIALIZED,
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CONFIGURING,
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CONFIGURED,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        STARTING,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        STARTED,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FLUSHING,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        STOPPING,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        RELEASING,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kPortIndexInput         = 0,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kPortIndexOutput        = 1,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatInit                           = 'init',
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatConfigure                      = 'conf',
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatStart                          = 'strt',
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatStop                           = 'stop',
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatRelease                        = 'rele',
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatDequeueInputBuffer             = 'deqI',
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatQueueInputBuffer               = 'queI',
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatDequeueOutputBuffer            = 'deqO',
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatReleaseOutputBuffer            = 'relO',
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kWhatGetBuffers                     = 'getB',
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kWhatFlush                          = 'flus',
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatGetOutputFormat                = 'getO',
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatDequeueInputTimedOut           = 'dITO',
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatDequeueOutputTimedOut          = 'dOTO',
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatCodecNotify                    = 'codc',
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatRequestIDRFrame                = 'ridr',
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kWhatRequestActivityNotification    = 'racN',
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kWhatGetName                        = 'getN',
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatSetParameters                  = 'setP',
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kFlagIsSoftwareCodec            = 1,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kFlagOutputFormatChanged        = 2,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kFlagOutputBuffersChanged       = 4,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kFlagStickyError                = 8,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kFlagDequeueInputPending        = 16,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kFlagDequeueOutputPending       = 32,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kFlagIsSecure                   = 64,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct BufferInfo {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void *mBufferID;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sp<ABuffer> mData;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sp<ABuffer> mEncryptedData;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sp<AMessage> mNotify;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool mOwnedByClient;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State mState;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ALooper> mLooper;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ALooper> mCodecLooper;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ACodec> mCodec;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AString mComponentName;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mReplyID;
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    uint32_t mFlags;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<Surface> mNativeWindow;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SoftwareRenderer *mSoftRenderer;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<AMessage> mOutputFormat;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    List<size_t> mAvailPortBuffers[2];
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vector<BufferInfo> mPortBuffers[2];
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t mDequeueInputTimeoutGeneration;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mDequeueInputReplyID;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t mDequeueOutputTimeoutGeneration;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mDequeueOutputReplyID;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ICrypto> mCrypto;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    List<sp<ABuffer> > mCSD;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<AMessage> mActivityNotify;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaCodec(const sp<ALooper> &looper);
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static status_t PostAndAwaitResponse(
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            const sp<AMessage> &msg, sp<AMessage> *response);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t init(const char *name, bool nameIsType, bool encoder);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void setState(State newState);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void returnBuffersToCodec();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void returnBuffersToCodecOnPort(int32_t portIndex);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssize_t dequeuePortBuffer(int32_t portIndex);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void cancelPendingDequeueOperations();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void extractCSD(const sp<AMessage> &format);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t queueCSDInputBuffer(size_t bufferIndex);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t setNativeWindow(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<Surface> &surface);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void postActivityNotificationIfPossible();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t onSetParameters(const sp<AMessage> &params);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace android
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_CODEC_H_
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)