MediaCodec.h revision 8b1be2ca7cee71a4920d5d31fdcbad2b1d4ca49d
15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Copyright 2012, The Android Open Source Project
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License");
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * you may not use this file except in compliance with the License.
65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * You may obtain a copy of the License at
75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *     http://www.apache.org/licenses/LICENSE-2.0
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Unless required by applicable law or agreed to in writing, software
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS,
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * See the License for the specific language governing permissions and
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * limitations under the License.
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef MEDIA_CODEC_H_
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MEDIA_CODEC_H_
205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <gui/IGraphicBufferProducer.h>
225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <media/hardware/CryptoAPI.h>
235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <media/stagefright/foundation/AHandler.h>
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <utils/Vector.h>
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnernamespace android {
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct ABuffer;
295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct ACodec;
305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct AMessage;
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct AString;
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct ICrypto;
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct SoftwareRenderer;
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct Surface;
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct MediaCodec : public AHandler {
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum ConfigureFlags {
385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        CONFIGURE_FLAG_ENCODE   = 1,
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum BufferFlags {
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        BUFFER_FLAG_SYNCFRAME   = 1,
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        BUFFER_FLAG_CODECCONFIG = 2,
445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        BUFFER_FLAG_EOS         = 4,
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    static sp<MediaCodec> CreateByType(
485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<ALooper> &looper, const char *mime, bool encoder);
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    static sp<MediaCodec> CreateByComponentName(
515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<ALooper> &looper, const char *name);
525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t configure(
545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<AMessage> &format,
555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<Surface> &nativeWindow,
565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<ICrypto> &crypto,
575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            uint32_t flags);
585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t start();
625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // Returns to a state in which the component remains allocated but
645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // unconfigured.
655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t stop();
665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // Client MUST call release before releasing final reference to this
685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // object.
695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t release();
705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t flush();
725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t queueInputBuffer(
745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t index,
755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t offset,
765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t size,
775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            int64_t presentationTimeUs,
785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            uint32_t flags,
795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            AString *errorDetailMsg = NULL);
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t queueSecureInputBuffer(
825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t index,
835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t offset,
845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const CryptoPlugin::SubSample *subSamples,
855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t numSubSamples,
865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const uint8_t key[16],
875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const uint8_t iv[16],
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            CryptoPlugin::Mode mode,
895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            int64_t presentationTimeUs,
905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            uint32_t flags,
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            AString *errorDetailMsg = NULL);
925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t dequeueOutputBuffer(
965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t *index,
975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t *offset,
985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            size_t *size,
995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            int64_t *presentationTimeUs,
1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            uint32_t *flags,
1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            int64_t timeoutUs = 0ll);
1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t renderOutputBufferAndRelease(size_t index);
1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t releaseOutputBuffer(size_t index);
1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t signalEndOfInputStream();
1075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t getOutputFormat(sp<AMessage> *format) const;
1095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t requestIDRFrame();
1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // Notification will be posted once there "is something to do", i.e.
1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // an input/output buffer has become available, a format change is
1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    // pending, an error is pending.
1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void requestActivityNotification(const sp<AMessage> &notify);
1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t getName(AString *componentName) const;
1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t setParameters(const sp<AMessage> &params);
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerprotected:
1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    virtual ~MediaCodec();
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    virtual void onMessageReceived(const sp<AMessage> &msg);
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerprivate:
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum State {
1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        UNINITIALIZED,
1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        INITIALIZING,
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        INITIALIZED,
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        CONFIGURING,
1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        CONFIGURED,
1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        STARTING,
1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        STARTED,
1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        FLUSHING,
1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        STOPPING,
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        RELEASING,
1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum {
1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kPortIndexInput         = 0,
1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kPortIndexOutput        = 1,
1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum {
1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatInit                           = 'init',
1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatConfigure                      = 'conf',
1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatCreateInputSurface             = 'cisf',
1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatStart                          = 'strt',
1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatStop                           = 'stop',
1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatRelease                        = 'rele',
1545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatDequeueInputBuffer             = 'deqI',
1555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatQueueInputBuffer               = 'queI',
1565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatDequeueOutputBuffer            = 'deqO',
1575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatReleaseOutputBuffer            = 'relO',
1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatSignalEndOfInputStream         = 'eois',
1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatGetBuffers                     = 'getB',
1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatFlush                          = 'flus',
1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatGetOutputFormat                = 'getO',
1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatDequeueInputTimedOut           = 'dITO',
1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatDequeueOutputTimedOut          = 'dOTO',
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatCodecNotify                    = 'codc',
1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatRequestIDRFrame                = 'ridr',
1665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatRequestActivityNotification    = 'racN',
1675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatGetName                        = 'getN',
1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kWhatSetParameters                  = 'setP',
1695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
1705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    enum {
1725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagIsSoftwareCodec            = 1,
1735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagOutputFormatChanged        = 2,
1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagOutputBuffersChanged       = 4,
1755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagStickyError                = 8,
1765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagDequeueInputPending        = 16,
1775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagDequeueOutputPending       = 32,
1785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagIsSecure                   = 64,
1795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagSawMediaServerDie          = 128,
1805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagIsEncoder                  = 256,
1815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        kFlagGatherCodecSpecificData    = 512,
1825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
1835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct BufferInfo {
1855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t mBufferID;
1865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        sp<ABuffer> mData;
1875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        sp<ABuffer> mEncryptedData;
1885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        sp<AMessage> mNotify;
1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        bool mOwnedByClient;
1905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    };
1915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    State mState;
1935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<ALooper> mLooper;
1945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<ALooper> mCodecLooper;
1955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<ACodec> mCodec;
1965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    AString mComponentName;
1975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t mReplyID;
1985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t mFlags;
1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<Surface> mNativeWindow;
2005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    SoftwareRenderer *mSoftRenderer;
2015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<AMessage> mOutputFormat;
2025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    List<size_t> mAvailPortBuffers[2];
2045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Vector<BufferInfo> mPortBuffers[2];
2055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int32_t mDequeueInputTimeoutGeneration;
2075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t mDequeueInputReplyID;
2085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int32_t mDequeueOutputTimeoutGeneration;
2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t mDequeueOutputReplyID;
2115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<ICrypto> mCrypto;
2135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    List<sp<ABuffer> > mCSD;
2155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sp<AMessage> mActivityNotify;
2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    bool mHaveInputSurface;
2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    MediaCodec(const sp<ALooper> &looper);
2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    static status_t PostAndAwaitResponse(
2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<AMessage> &msg, sp<AMessage> *response);
2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t init(const char *name, bool nameIsType, bool encoder);
2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void setState(State newState);
2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void returnBuffersToCodec();
2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void returnBuffersToCodecOnPort(int32_t portIndex);
2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ssize_t dequeuePortBuffer(int32_t portIndex);
2345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void cancelPendingDequeueOperations();
2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void extractCSD(const sp<AMessage> &format);
2405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t queueCSDInputBuffer(size_t bufferIndex);
2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t setNativeWindow(
2435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            const sp<Surface> &surface);
2445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void postActivityNotificationIfPossible();
2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t onSetParameters(const sp<AMessage> &params);
2485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}  // namespace android
2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif  // MEDIA_CODEC_H_
2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner