ACodec.h revision ed5554fb1c837f6b1008d3910018c979c57da502
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr/*
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Copyright (C) 2010 The Android Open Source Project
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao *
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
59ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao * you may not use this file except in compliance with the License.
69ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao * You may obtain a copy of the License at
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao *
86315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr *      http://www.apache.org/licenses/LICENSE-2.0
96315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr *
106315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * Unless required by applicable law or agreed to in writing, software
116315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * distributed under the License is distributed on an "AS IS" BASIS,
126315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * See the License for the specific language governing permissions and
146315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr * limitations under the License.
159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao */
169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#ifndef A_CODEC_H_
189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define A_CODEC_H_
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <stdint.h>
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <android/native_window.h>
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <media/IOMX.h>
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <media/stagefright/CodecBase.h>
269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <media/stagefright/SkipCutBuffer.h>
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <OMX_Audio.h>
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#define TRACK_BUFFER_TIMING     0
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace android {
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostruct ABuffer;
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostruct MemoryDealer;
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostruct DescribeColorFormatParams;
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostruct ACodec : public AHierarchicalStateMachine, public CodecBase {
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    ACodec();
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    virtual void setNotificationMessage(const sp<AMessage> &msg);
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void initiateSetup(const sp<AMessage> &msg);
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void initiateAllocateComponent(const sp<AMessage> &msg);
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void initiateConfigureComponent(const sp<AMessage> &msg);
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    virtual void initiateCreateInputSurface();
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void initiateStart();
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    virtual void initiateShutdown(bool keepComponentAllocated = false);
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void signalFlush();
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void signalResume();
5291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void signalSetParameters(const sp<AMessage> &msg);
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void signalEndOfInputStream();
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void signalRequestIDRFrame();
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // AHierarchicalStateMachine implements the message handling
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual void onMessageReceived(const sp<AMessage> &msg) {
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        handleMessage(msg);
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct PortDescription : public CodecBase::PortDescription {
6391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        size_t countBuffers();
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        IOMX::buffer_id bufferIDAt(size_t index) const;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        sp<ABuffer> bufferAt(size_t index) const;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    private:
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        friend struct ACodec;
6992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
7092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Vector<IOMX::buffer_id> mBufferIDs;
7192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Vector<sp<ABuffer> > mBuffers;
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        PortDescription();
7492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
7692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
7792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    };
7892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static bool isFlexibleColorFormat(
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const sp<IOMX> &omx, IOMX::node_id node,
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent);
829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Returns 0 if configuration is not supported.  NOTE: this is treated by
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // some OMX components as auto level, and by others as invalid level.
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static int /* OMX_VIDEO_AVCLEVELTYPE */ getAVCLevelFor(
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            int width, int height, int rate, int bitrate,
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_VIDEO_AVCPROFILETYPE profile = OMX_VIDEO_AVCProfileBaseline);
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoprotected:
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    virtual ~ACodec();
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoprivate:
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    struct BaseState;
94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    struct UninitializedState;
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct LoadedState;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct LoadedToIdleState;
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct IdleToExecutingState;
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct ExecutingState;
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct OutputPortSettingsChangedState;
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct ExecutingToIdleState;
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct IdleToLoadedState;
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct FlushingState;
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    struct DeathNotifier;
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    enum {
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatSetup                   = 'setu',
10791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        kWhatOMXMessage              = 'omx ',
10891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        kWhatInputBufferFilled       = 'inpF',
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatOutputBufferDrained     = 'outD',
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatShutdown                = 'shut',
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatFlush                   = 'flus',
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatResume                  = 'resm',
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatDrainDeferredMessages   = 'drai',
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatAllocateComponent       = 'allo',
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatConfigureComponent      = 'conf',
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatCreateInputSurface      = 'cisf',
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatSignalEndOfInputStream  = 'eois',
1189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatStart                   = 'star',
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatRequestIDRFrame         = 'ridr',
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatSetParameters           = 'setP',
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatSubmitOutputMetaDataBufferIfEOS = 'subm',
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatOMXDied                 = 'OMXd',
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kWhatReleaseCodecInstance    = 'relC',
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    enum {
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kPortIndexInput  = 0,
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kPortIndexOutput = 1
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    enum {
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kFlagIsSecure                                 = 1,
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kFlagPushBlankBuffersToNativeWindowOnShutdown = 2,
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        kFlagIsGrallocUsageProtected                  = 4,
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    };
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    struct BufferInfo {
1389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        enum Status {
1399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OWNED_BY_US,
1409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OWNED_BY_COMPONENT,
141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            OWNED_BY_UPSTREAM,
1429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OWNED_BY_DOWNSTREAM,
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            OWNED_BY_NATIVE_WINDOW,
144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        };
14592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
14692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        IOMX::buffer_id mBufferID;
14792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        Status mStatus;
14892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        unsigned mDequeuedAt;
14992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        sp<ABuffer> mData;
15192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        sp<GraphicBuffer> mGraphicBuffer;
15292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    };
15392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
15492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang#if TRACK_BUFFER_TIMING
15592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    struct BufferStats {
15692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        int64_t mEmptyBufferTimeUs;
15792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        int64_t mFillBufferDoneTimeUs;
15892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    };
15992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    KeyedVector<int64_t, BufferStats> mBufferStats;
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<AMessage> mNotify;
1649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<UninitializedState> mUninitializedState;
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<LoadedState> mLoadedState;
167324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    sp<LoadedToIdleState> mLoadedToIdleState;
1689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<IdleToExecutingState> mIdleToExecutingState;
1699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<ExecutingState> mExecutingState;
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
171324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    sp<ExecutingToIdleState> mExecutingToIdleState;
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<IdleToLoadedState> mIdleToLoadedState;
173324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    sp<FlushingState> mFlushingState;
174324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    sp<SkipCutBuffer> mSkipCutBuffer;
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1766315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    AString mComponentName;
17791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    uint32_t mFlags;
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    uint32_t mQuirks;
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<IOMX> mOMX;
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    IOMX::node_id mNode;
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<MemoryDealer> mDealer[2];
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<ANativeWindow> mNativeWindow;
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<AMessage> mInputFormat;
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<AMessage> mOutputFormat;
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    sp<AMessage> mBaseOutputFormat;
1879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    Vector<BufferInfo> mBuffers[2];
1899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mPortEOS[2];
1909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t mInputEOSResult;
1919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    List<sp<AMessage> > mDeferredQueue;
1939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
19491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    bool mSentFormat;
19591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    bool mIsEncoder;
19691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    bool mUseMetadataOnEncoderOutput;
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mShutdownInProgress;
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mExplicitShutdown;
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // If "mKeepComponentAllocated" we only transition back to Loaded state
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // and do not release the component instance.
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mKeepComponentAllocated;
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int32_t mEncoderDelay;
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int32_t mEncoderPadding;
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int32_t mRotationDegrees;
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mChannelMaskPresent;
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int32_t mChannelMask;
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    unsigned mDequeueCounter;
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mStoreMetaDataInOutputBuffers;
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int32_t mMetaDataBuffersToSubmit;
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t mNumUndequeuedBuffers;
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int64_t mRepeatFrameDelayUs;
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int64_t mMaxPtsGapUs;
217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    float mMaxFps;
218462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int64_t mTimePerFrameUs;
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int64_t mTimePerCaptureUs;
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    bool mCreateInputBuffersSuspended;
2236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    bool mTunneled;
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t allocateBuffersOnPort(OMX_U32 portIndex);
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t freeBuffersOnPort(OMX_U32 portIndex);
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t freeBuffer(OMX_U32 portIndex, size_t i);
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t configureOutputBuffersFromNativeWindow(
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_U32 *nBufferCount, OMX_U32 *nBufferSize,
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_U32 *nMinUndequeuedBuffers);
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t allocateOutputMetaDataBuffers();
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t submitOutputMetaDataBuffer();
236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void signalSubmitOutputMetaDataBufferIfEOS_workaround();
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t allocateOutputBuffersFromNativeWindow();
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t cancelBufferToNativeWindow(BufferInfo *info);
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t freeOutputBuffersNotOwnedByComponent();
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    BufferInfo *dequeueBufferFromNativeWindow();
24192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
24292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    BufferInfo *findBufferByID(
24392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            uint32_t portIndex, IOMX::buffer_id bufferID,
24492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            ssize_t *index = NULL);
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    status_t setComponentRole(bool isEncoder, const char *mime);
2476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    status_t configureCodec(const char *mime, const sp<AMessage> &msg);
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t configureTunneledVideoPlayback(int32_t audioHwSync,
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const sp<ANativeWindow> &nativeWindow);
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setVideoPortFormatType(
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_U32 portIndex,
254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            OMX_VIDEO_CODINGTYPE compressionFormat,
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_COLOR_FORMATTYPE colorFormat,
256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            bool usingNativeBuffers = false);
257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setSupportedOutputFormat(bool getLegacyFlexibleFormat);
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupVideoDecoder(
2616315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            const char *mime, const sp<AMessage> &msg, bool usingNativeBuffers);
2626315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupVideoEncoder(
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            const char *mime, const sp<AMessage> &msg);
26591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
26691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    status_t setVideoFormatOnPort(
26791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            OMX_U32 portIndex,
26891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            int32_t width, int32_t height,
26991a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao            OMX_VIDEO_CODINGTYPE compressionFormat, float frameRate = -1.0);
27091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
27191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    typedef struct drcParams {
27291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        int32_t drcCut;
27391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        int32_t drcBoost;
27491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        int32_t heavyCompression;
27591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        int32_t targetRefLevel;
27691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao        int32_t encodedTargetLevel;
2779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    } drcParams_t;
2789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupAACCodec(
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            bool encoder,
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            int32_t numChannels, int32_t sampleRate, int32_t bitRate,
28292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            int32_t aacProfile, bool isADTS, int32_t sbrMode,
28392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            int32_t maxOutputChannelCount, const drcParams_t& drc,
28492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            int32_t pcmLimiterEnable);
2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2866315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
2876315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2886315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    status_t setupEAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
2896315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
2906315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    status_t selectAudioPortFormat(
2916315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr            OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels);
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupFlacCodec(
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupRawAudioFormat(
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setPriority(int32_t priority);
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setOperatingRate(float rateFloat, bool isVideo);
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupH263EncoderParameters(const sp<AMessage> &msg);
3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupHEVCEncoderParameters(const sp<AMessage> &msg);
3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t setupVPXEncoderParameters(const sp<AMessage> &msg);
3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
31391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
31591a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    status_t configureBitrate(
3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
31791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    status_t setupErrorCorrectionParameters();
3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t initNativeWindow();
32191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
3229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    status_t pushBlankBuffersToNativeWindow();
3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
32491a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    // Returns true iff all buffers on the given port have status
3259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
32691a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
32791a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
32891a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao    bool allYourBuffersAreBelongToUs();
3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
33191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao
3329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t countBuffersOwnedByNativeWindow() const;
33492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
33592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    void deferMessage(const sp<AMessage> &msg);
33692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    void processDeferredMessages();
33792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
33892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    void sendFormatChange(const sp<AMessage> &reply);
33992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify);
34092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
34192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    void signalError(
34292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            OMX_ERRORTYPE error = OMX_ErrorUndefined,
34392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang            status_t internalError = UNKNOWN_ERROR);
34492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
34592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    static bool describeDefaultColorFormat(DescribeColorFormatParams &describeParams);
34692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    static bool describeColorFormat(
34792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        const sp<IOMX> &omx, IOMX::node_id node,
34892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang        DescribeColorFormatParams &describeParams);
34992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
35092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    status_t requestIDRFrame();
35192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang    status_t setParameters(const sp<AMessage> &params);
35292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang
3539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Send EOS on input stream.
3549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void onSignalEndOfInputStream();
3556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
3569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
3579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};
358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}  // namespace android
360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#endif  // A_CODEC_H_
3629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao