MediaCodec.h revision 7bad72237b49ac47e77ffe2a89fd26f3d171324c
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project
35778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License.
65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at
75778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
85778822d86b0337407514b9372562b86edfa91cdAndreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
95778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software
115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and
145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License.
155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
175778822d86b0337407514b9372562b86edfa91cdAndreas Huber#ifndef MEDIA_CODEC_H_
185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define MEDIA_CODEC_H_
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
218ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber#include <media/hardware/CryptoAPI.h>
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h>
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h>
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
265778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer;
295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage;
305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString;
3192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase;
32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto;
335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer;
341a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface;
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *mime, bool encoder);
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *name);
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
551a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &nativeWindow,
561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
62c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
63c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
64c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
67c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
68c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
69c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
70c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
785b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
795b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
905b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
103fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t signalEndOfInputStream();
1087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
110e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t getInputFormat(sp<AMessage> *format) const;
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1157bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer);
1167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1177bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getInputBuffer(size_t index, sp<ABuffer> *buffer);
1187bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
119496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
120496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
121575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
122575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
123575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
124575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
125575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
126717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
127717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
128a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t setParameters(const sp<AMessage> &params);
129a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
145c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
154575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
155575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
1567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatCreateInputSurface             = 'cisf',
157575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
158575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
159575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
160575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
161575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
162575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
163575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
1647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatSignalEndOfInputStream         = 'eois',
165575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
166575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
167575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
168e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        kWhatGetInputFormat                 = 'getI',
169575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
170575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
171575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
172575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
173575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
174717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
175a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        kWhatSetParameters                  = 'setP',
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagIsSoftwareCodec            = 1,
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
185ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
186aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        kFlagSawMediaServerDie          = 128,
187e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagIsEncoder                  = 256,
188e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagGatherCodecSpecificData    = 512,
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
192609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        uint32_t mBufferID;
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
194ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
1967bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar        sp<AMessage> mFormat;
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
20392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    sp<CodecBase> mCodec;
204717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mReplyID;
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
2071a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    sp<Surface> mNativeWindow;
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
210e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> mInputFormat;
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2127bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // Used only to synchronize asynchronous getBufferAndFormat
2137bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // across all the other (synchronous) buffer state change
2147bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // operations, such as de/queueIn/OutputBuffer, start and
2157bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // stop/flush/reset/release.
2167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    Mutex mBufferLock;
2177bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueInputReplyID;
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueOutputReplyID;
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
227ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
228ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
2308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
231575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
232575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
2336507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    bool mHaveInputSurface;
2346507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    MediaCodec(const sp<ALooper> &looper);
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t init(const char *name, bool nameIsType, bool encoder);
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodec();
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodecOnPort(int32_t portIndex);
2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2507bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getBufferAndFormat(
2517bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            size_t portIndex, size_t index,
2527bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            sp<ABuffer> *buffer, sp<AMessage> *format);
2537bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
2598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
2608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
2617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t setNativeWindow(
2621a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &surface);
2637541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
264575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
265575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
266a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t onSetParameters(const sp<AMessage> &params);
267a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
268e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
269e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
276