ACodec.h revision 7e7013392e302a28364df1dcee79b82ad90978b4
1a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall/*
2a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall * Copyright (C) 2010 The Android Open Source Project
304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * you may not use this file except in compliance with the License.
604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * You may obtain a copy of the License at
704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall *
1004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * Unless required by applicable law or agreed to in writing, software
1104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
1204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * See the License for the specific language governing permissions and
1404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall * limitations under the License.
1504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall */
1604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#ifndef A_CODEC_H_
1804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define A_CODEC_H_
2004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <stdint.h>
2204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <android/native_window.h>
2304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <media/IOMX.h>
2404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
2504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <media/stagefright/SkipCutBuffer.h>
2604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <OMX_Audio.h>
2704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define TRACK_BUFFER_TIMING     0
2904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallnamespace android {
3104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct ABuffer;
3304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct MemoryDealer;
3404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct ACodec : public AHierarchicalStateMachine {
3604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    enum {
3704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatFillThisBuffer      = 'fill',
3804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatDrainThisBuffer     = 'drai',
3904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatEOS                 = 'eos ',
4004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatShutdownCompleted   = 'scom',
4104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatFlushCompleted      = 'fcom',
4204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatOutputFormatChanged = 'outC',
4304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatError               = 'erro',
44a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall        kWhatComponentAllocated  = 'cAll',
455ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatComponentConfigured = 'cCon',
465ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatInputSurfaceCreated = 'isfc',
47a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall        kWhatSignaledInputEOS    = 'seos',
48a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall        kWhatBuffersAllocated    = 'allc',
4904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatOMXDied             = 'OMXd',
5004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    };
5104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
5204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    ACodec();
5304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
54a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    void setNotificationMessage(const sp<AMessage> &msg);
55a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    void initiateSetup(const sp<AMessage> &msg);
5604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void signalFlush();
57a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    void signalResume();
5804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void initiateShutdown(bool keepComponentAllocated = false);
59a9bb62b44be381292b893055cd01cdc89ba55c97Jesse Hall
6004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void signalSetParameters(const sp<AMessage> &msg);
6104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void signalEndOfInputStream();
625ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
63a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall    void initiateAllocateComponent(const sp<AMessage> &msg);
645ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    void initiateConfigureComponent(const sp<AMessage> &msg);
655ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    void initiateCreateInputSurface();
6604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void initiateStart();
6704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
6804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void signalRequestIDRFrame();
6904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct PortDescription : public RefBase {
71a366a5186ea941c5653cbdb8df18dc19318912b6Jesse Hall        size_t countBuffers();
7204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        IOMX::buffer_id bufferIDAt(size_t index) const;
7304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        sp<ABuffer> bufferAt(size_t index) const;
7404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    private:
7604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        friend struct ACodec;
7704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
7804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        Vector<IOMX::buffer_id> mBufferIDs;
7904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        Vector<sp<ABuffer> > mBuffers;
8004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
8104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        PortDescription();
8204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
8304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
8404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
8504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    };
8604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
8704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallprotected:
8804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    virtual ~ACodec();
8904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
9004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallprivate:
9104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct BaseState;
9204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct UninitializedState;
9304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct LoadedState;
945ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct LoadedToIdleState;
955ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct IdleToExecutingState;
965ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct ExecutingState;
975ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct OutputPortSettingsChangedState;
985ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct ExecutingToIdleState;
995ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct IdleToLoadedState;
1005ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct FlushingState;
1015ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct DeathNotifier;
1025ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1035ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    enum {
1045ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatSetup                   = 'setu',
1055ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatOMXMessage              = 'omx ',
1065ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatInputBufferFilled       = 'inpF',
1075ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatOutputBufferDrained     = 'outD',
1085ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatShutdown                = 'shut',
1095ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatFlush                   = 'flus',
11004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatResume                  = 'resm',
11104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatDrainDeferredMessages   = 'drai',
11204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        kWhatAllocateComponent       = 'allo',
113a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        kWhatConfigureComponent      = 'conf',
114a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        kWhatCreateInputSurface      = 'cisf',
115a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        kWhatSignalEndOfInputStream  = 'eois',
116a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        kWhatStart                   = 'star',
117a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        kWhatRequestIDRFrame         = 'ridr',
1185ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kWhatSetParameters           = 'setP',
1195ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    };
12004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1215ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    enum {
1225ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kPortIndexInput  = 0,
1235ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kPortIndexOutput = 1
1245ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    };
125606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall
126606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall    enum {
1275ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        kFlagIsSecure   = 1,
12804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    };
1295ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
13004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    struct BufferInfo {
13104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        enum Status {
13204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OWNED_BY_US,
13304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OWNED_BY_COMPONENT,
13404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OWNED_BY_UPSTREAM,
13504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OWNED_BY_DOWNSTREAM,
13604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OWNED_BY_NATIVE_WINDOW,
13704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        };
1385ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1395ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        IOMX::buffer_id mBufferID;
1405ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        Status mStatus;
1415ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1425ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        sp<ABuffer> mData;
143fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall        sp<GraphicBuffer> mGraphicBuffer;
1445ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    };
1455ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1465ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall#if TRACK_BUFFER_TIMING
1475ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    struct BufferStats {
1485ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        int64_t mEmptyBufferTimeUs;
1495ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        int64_t mFillBufferDoneTimeUs;
1505ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    };
1515ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1525ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    KeyedVector<int64_t, BufferStats> mBufferStats;
1535ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall#endif
1545ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1555ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<AMessage> mNotify;
1565ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1575ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<UninitializedState> mUninitializedState;
1585ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<LoadedState> mLoadedState;
1595ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<LoadedToIdleState> mLoadedToIdleState;
1605ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<IdleToExecutingState> mIdleToExecutingState;
1615ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<ExecutingState> mExecutingState;
1625ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
1635ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<ExecutingToIdleState> mExecutingToIdleState;
1645ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<IdleToLoadedState> mIdleToLoadedState;
1655ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<FlushingState> mFlushingState;
1665ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<SkipCutBuffer> mSkipCutBuffer;
1675ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1685ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    AString mComponentName;
1695ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    uint32_t mFlags;
1705ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    uint32_t mQuirks;
1715ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<IOMX> mOMX;
1725ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    IOMX::node_id mNode;
1735ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<MemoryDealer> mDealer[2];
1745ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1755ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    sp<ANativeWindow> mNativeWindow;
1765ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1775ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    Vector<BufferInfo> mBuffers[2];
1785ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    bool mPortEOS[2];
1795ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    status_t mInputEOSResult;
1805ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
181fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    List<sp<AMessage> > mDeferredQueue;
18203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
18303b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    bool mSentFormat;
18403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    bool mIsEncoder;
185a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall
18604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    bool mShutdownInProgress;
187a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall
188a64292517b1876c4bbe5d3e62c577812f40bd922Jesse Hall    // If "mKeepComponentAllocated" we only transition back to Loaded state
18904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    // and do not release the component instance.
19004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    bool mKeepComponentAllocated;
19104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
19204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    int32_t mEncoderDelay;
19303b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    int32_t mEncoderPadding;
19403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
19503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    bool mChannelMaskPresent;
19603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    int32_t mChannelMask;
19703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
19803b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
19903b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t allocateBuffersOnPort(OMX_U32 portIndex);
20003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t freeBuffersOnPort(OMX_U32 portIndex);
20103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t freeBuffer(OMX_U32 portIndex, size_t i);
20203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
20303b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t allocateOutputBuffersFromNativeWindow();
20403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t cancelBufferToNativeWindow(BufferInfo *info);
20503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    status_t freeOutputBuffersNotOwnedByComponent();
20603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    BufferInfo *dequeueBufferFromNativeWindow();
20703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
20803b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    BufferInfo *findBufferByID(
20903b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall            uint32_t portIndex, IOMX::buffer_id bufferID,
21003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall            ssize_t *index = NULL);
21104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
21204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setComponentRole(bool isEncoder, const char *mime);
21304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t configureCodec(const char *mime, const sp<AMessage> &msg);
21404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
21504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setVideoPortFormatType(
21604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_U32 portIndex,
21704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_VIDEO_CODINGTYPE compressionFormat,
21804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_COLOR_FORMATTYPE colorFormat);
21904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
22004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setSupportedOutputFormat();
22104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
22204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupVideoDecoder(
22304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            const char *mime, int32_t width, int32_t height);
22404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
22504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupVideoEncoder(
22604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            const char *mime, const sp<AMessage> &msg);
22704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
22804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setVideoFormatOnPort(
22904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_U32 portIndex,
23004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            int32_t width, int32_t height,
23104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_VIDEO_CODINGTYPE compressionFormat);
23204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
23304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupAACCodec(
23404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            bool encoder,
23504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            int32_t numChannels, int32_t sampleRate, int32_t bitRate,
23604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            int32_t aacProfile, bool isADTS);
23704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
23804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t selectAudioPortFormat(
23904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
24004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
24104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
24204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupG711Codec(bool encoder, int32_t numChannels);
24304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
24404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupFlacCodec(
24504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
24604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
24704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupRawAudioFormat(
24804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
24904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
25004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
25104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
25204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
25304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupH263EncoderParameters(const sp<AMessage> &msg);
25404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
25504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
25604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
25704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
25804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t configureBitrate(
25904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
26004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
26104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setupErrorCorrectionParameters();
26204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
26304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t initNativeWindow();
26404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
26504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t pushBlankBuffersToNativeWindow();
26604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
26704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    // Returns true iff all buffers on the given port have status
26804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
26904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
27004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
27104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    bool allYourBuffersAreBelongToUs();
27204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
27304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
27404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
27504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
27604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    size_t countBuffersOwnedByNativeWindow() const;
27704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
27804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void deferMessage(const sp<AMessage> &msg);
27904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void processDeferredMessages();
28004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
28104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void sendFormatChange();
28204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
28304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void signalError(
28404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            OMX_ERRORTYPE error = OMX_ErrorUndefined,
28504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall            status_t internalError = UNKNOWN_ERROR);
28604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
28704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t requestIDRFrame();
28804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    status_t setParameters(const sp<AMessage> &params);
28904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
29004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    // Send EOS on input stream.
29104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    void onSignalEndOfInputStream();
29204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
29304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
29404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
29504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
29604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}  // namespace android
29704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
29804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#endif  // A_CODEC_H_
29904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall