ACodec.h revision 78b01639c08fe5e7e9c1be5e9dc5de560f1383f9
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef A_CODEC_H_
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define A_CODEC_H_
20d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
22d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include <android/native_window.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IOMX.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/CodecBase.h>
26cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn#include <media/stagefright/SkipCutBuffer.h>
27ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#include <OMX_Audio.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#define TRACK_BUFFER_TIMING     0
308f26b323d8f78c6a183e74c464864ef7da457267Brad Fitzpatrick
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianstruct ABuffer;
340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopianstruct MemoryDealer;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct DescribeColorFormatParams;
362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick
370b41448506610f73302cc631677823fd8b865ea5Christopher Tatestruct ACodec : public AHierarchicalStateMachine, public CodecBase {
380b41448506610f73302cc631677823fd8b865ea5Christopher Tate    ACodec();
3944bc18664985e845a2299f20b6392d378fad8b4dColin Cross
400795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian    virtual void setNotificationMessage(const sp<AMessage> &msg);
410795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian
420795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian    void initiateSetup(const sp<AMessage> &msg);
435348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick
440bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown    virtual void initiateAllocateComponent(const sp<AMessage> &msg);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void initiateConfigureComponent(const sp<AMessage> &msg);
46ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate    virtual void initiateCreateInputSurface();
47ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate    virtual void initiateStart();
48ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate    virtual void initiateShutdown(bool keepComponentAllocated = false);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void signalFlush();
5171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    virtual void signalResume();
5271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void signalSetParameters(const sp<AMessage> &msg);
5479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate    virtual void signalEndOfInputStream();
5579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate    virtual void signalRequestIDRFrame();
565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block
5779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate    // AHierarchicalStateMachine implements the message handling
5871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    virtual void onMessageReceived(const sp<AMessage> &msg) {
5979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate        handleMessage(msg);
6079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate    }
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct PortDescription : public CodecBase::PortDescription {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t countBuffers();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IOMX::buffer_id bufferIDAt(size_t index) const;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<ABuffer> bufferAt(size_t index) const;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend struct ACodec;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<IOMX::buffer_id> mBufferIDs;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Vector<sp<ABuffer> > mBuffers;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PortDescription();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool isFlexibleColorFormat(
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<IOMX> &omx, IOMX::node_id node,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t colorFormat, OMX_U32 *flexibleEquivalent);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Returns 0 if configuration is not supported.  NOTE: this is treated by
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // some OMX components as auto level, and by others as invalid level.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int /* OMX_VIDEO_AVCLEVELTYPE */ getAVCLevelFor(
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int width, int height, int rate, int bitrate,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_VIDEO_AVCPROFILETYPE profile = OMX_VIDEO_AVCProfileBaseline);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~ACodec();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct BaseState;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct UninitializedState;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct LoadedState;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct LoadedToIdleState;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct IdleToExecutingState;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct ExecutingState;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct OutputPortSettingsChangedState;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct ExecutingToIdleState;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct IdleToLoadedState;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct FlushingState;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct DeathNotifier;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatSetup                   = 'setu',
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatOMXMessage              = 'omx ',
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatInputBufferFilled       = 'inpF',
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatOutputBufferDrained     = 'outD',
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatShutdown                = 'shut',
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatFlush                   = 'flus',
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatResume                  = 'resm',
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatDrainDeferredMessages   = 'drai',
114bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate        kWhatAllocateComponent       = 'allo',
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatConfigureComponent      = 'conf',
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatCreateInputSurface      = 'cisf',
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatSignalEndOfInputStream  = 'eois',
1180d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate        kWhatStart                   = 'star',
1190d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate        kWhatRequestIDRFrame         = 'ridr',
1200d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate        kWhatSetParameters           = 'setP',
1210d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate        kWhatSubmitOutputMetaDataBufferIfEOS = 'subm',
1220d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate        kWhatOMXDied                 = 'OMXd',
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kWhatReleaseCodecInstance    = 'relC',
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kPortIndexInput  = 0,
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kPortIndexOutput = 1
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kFlagIsSecure                                 = 1,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kFlagPushBlankBuffersToNativeWindowOnShutdown = 2,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kFlagIsGrallocUsageProtected                  = 4,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct BufferInfo {
138727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick        enum Status {
139727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            OWNED_BY_US,
140727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            OWNED_BY_COMPONENT,
141727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            OWNED_BY_UPSTREAM,
142727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            OWNED_BY_DOWNSTREAM,
143727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            OWNED_BY_NATIVE_WINDOW,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IOMX::buffer_id mBufferID;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Status mStatus;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned mDequeuedAt;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<ABuffer> mData;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<GraphicBuffer> mGraphicBuffer;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if TRACK_BUFFER_TIMING
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct BufferStats {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int64_t mEmptyBufferTimeUs;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int64_t mFillBufferDoneTimeUs;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    KeyedVector<int64_t, BufferStats> mBufferStats;
16171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block#endif
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AMessage> mNotify;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<UninitializedState> mUninitializedState;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<LoadedState> mLoadedState;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<LoadedToIdleState> mLoadedToIdleState;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IdleToExecutingState> mIdleToExecutingState;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<ExecutingState> mExecutingState;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<ExecutingToIdleState> mExecutingToIdleState;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IdleToLoadedState> mIdleToLoadedState;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<FlushingState> mFlushingState;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<SkipCutBuffer> mSkipCutBuffer;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AString mComponentName;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mFlags;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mQuirks;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IOMX> mOMX;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IOMX::node_id mNode;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MemoryDealer> mDealer[2];
182d1a7fca1451bf4ab7f9b704c0bace180095c2237Mathieu Chartier
183d1a7fca1451bf4ab7f9b704c0bace180095c2237Mathieu Chartier    sp<ANativeWindow> mNativeWindow;
184d1a7fca1451bf4ab7f9b704c0bace180095c2237Mathieu Chartier    sp<AMessage> mInputFormat;
185d1a7fca1451bf4ab7f9b704c0bace180095c2237Mathieu Chartier    sp<AMessage> mOutputFormat;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<AMessage> mBaseOutputFormat;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<BufferInfo> mBuffers[2];
1893762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    bool mPortEOS[2];
1903762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    status_t mInputEOSResult;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    List<sp<AMessage> > mDeferredQueue;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mSentFormat;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mIsEncoder;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mUseMetadataOnEncoderOutput;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mShutdownInProgress;
1988564c8da817a845353d213acd8636b76f567b234Steve Block    bool mExplicitShutdown;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If "mKeepComponentAllocated" we only transition back to Loaded state
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and do not release the component instance.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mKeepComponentAllocated;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mEncoderDelay;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mEncoderPadding;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mRotationDegrees;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mChannelMaskPresent;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mChannelMask;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned mDequeueCounter;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mStoreMetaDataInOutputBuffers;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t mMetaDataBuffersToSubmit;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t mNumUndequeuedBuffers;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int64_t mRepeatFrameDelayUs;
2163762c311729fe9f3af085c14c5c1fb471d994c03Steve Block    int64_t mMaxPtsGapUs;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int64_t mTimePerFrameUs;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int64_t mTimePerCaptureUs;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mCreateInputBuffersSuspended;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool mTunneled;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t allocateBuffersOnPort(OMX_U32 portIndex);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t freeBuffersOnPort(OMX_U32 portIndex);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t freeBuffer(OMX_U32 portIndex, size_t i);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t configureOutputBuffersFromNativeWindow(
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_U32 *nBufferCount, OMX_U32 *nBufferSize,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_U32 *nMinUndequeuedBuffers);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t allocateOutputMetaDataBuffers();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t submitOutputMetaDataBuffer();
23571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    void signalSubmitOutputMetaDataBufferIfEOS_workaround();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t allocateOutputBuffersFromNativeWindow();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t cancelBufferToNativeWindow(BufferInfo *info);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t freeOutputBuffersNotOwnedByComponent();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BufferInfo *dequeueBufferFromNativeWindow();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BufferInfo *findBufferByID(
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t portIndex, IOMX::buffer_id bufferID,
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t *index = NULL);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setComponentRole(bool isEncoder, const char *mime);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t configureCodec(const char *mime, const sp<AMessage> &msg);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t configureTunneledVideoPlayback(int32_t audioHwSync,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<ANativeWindow> &nativeWindow);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setVideoPortFormatType(
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_U32 portIndex,
25371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block            OMX_VIDEO_CODINGTYPE compressionFormat,
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_COLOR_FORMATTYPE colorFormat);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setSupportedOutputFormat();
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setupVideoDecoder(
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char *mime, const sp<AMessage> &msg);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setupVideoEncoder(
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const char *mime, const sp<AMessage> &msg);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    status_t setVideoFormatOnPort(
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_U32 portIndex,
266727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick            int32_t width, int32_t height,
267ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn            OMX_VIDEO_CODINGTYPE compressionFormat, float frameRate = -1.0);
268727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef struct drcParams {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t drcCut;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t drcBoost;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t heavyCompression;
2738ab665dda40ab10e60fc69392022171f454af530Ashok Bhat        int32_t targetRefLevel;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t encodedTargetLevel;
275727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    } drcParams_t;
2769013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert
2779013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert    status_t setupAACCodec(
2789013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            bool encoder,
2799013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            int32_t numChannels, int32_t sampleRate, int32_t bitRate,
2809013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            int32_t aacProfile, bool isADTS, int32_t sbrMode,
2819013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            int32_t maxOutputChannelCount, const drcParams_t& drc,
2829013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            int32_t pcmLimiterEnable);
2839013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert
2849013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert    status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
2859013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert
286ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn    status_t setupEAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
287ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn
288ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn    status_t selectAudioPortFormat(
289ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn            OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
290ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn
291727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
292727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    status_t setupG711Codec(bool encoder, int32_t numChannels);
293727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
2949013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert    status_t setupFlacCodec(
2959013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
2969013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert
2979013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert    status_t setupRawAudioFormat(
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
2999013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
302a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
303a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    status_t setupH263EncoderParameters(const sp<AMessage> &msg);
304a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
305a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    status_t setupHEVCEncoderParameters(const sp<AMessage> &msg);
306a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    status_t setupVPXEncoderParameters(const sp<AMessage> &msg);
307a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t configureBitrate(
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setupErrorCorrectionParameters();
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t initNativeWindow();
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t pushBlankBuffersToNativeWindow();
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Returns true iff all buffers on the given port have status
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool allYourBuffersAreBelongToUs();
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t countBuffersOwnedByNativeWindow() const;
3290b41448506610f73302cc631677823fd8b865ea5Christopher Tate
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void deferMessage(const sp<AMessage> &msg);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void processDeferredMessages();
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void sendFormatChange(const sp<AMessage> &reply);
3340b41448506610f73302cc631677823fd8b865ea5Christopher Tate    status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
336cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn    void signalError(
3370b41448506610f73302cc631677823fd8b865ea5Christopher Tate            OMX_ERRORTYPE error = OMX_ErrorUndefined,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t internalError = UNKNOWN_ERROR);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool describeDefaultColorFormat(DescribeColorFormatParams &describeParams);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool describeColorFormat(
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<IOMX> &omx, IOMX::node_id node,
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DescribeColorFormatParams &describeParams);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t requestIDRFrame();
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setParameters(const sp<AMessage> &params);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Send EOS on input stream.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void onSignalEndOfInputStream();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace android
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3560b41448506610f73302cc631677823fd8b865ea5Christopher Tate#endif  // A_CODEC_H_
3570b41448506610f73302cc631677823fd8b865ea5Christopher Tate