ACodec.h revision 89869f692c35d0ca914c7de4a1f5ff63c9920634
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (C) 2010 The Android Open Source Project
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Licensed under the Apache License, Version 2.0 (the "License");
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * you may not use this file except in compliance with the License.
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * You may obtain a copy of the License at
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      http://www.apache.org/licenses/LICENSE-2.0
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Unless required by applicable law or agreed to in writing, software
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * distributed under the License is distributed on an "AS IS" BASIS,
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * See the License for the specific language governing permissions and
143f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org * limitations under the License.
153f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org */
16d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org
17d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org#ifndef A_CODEC_H_
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org#define A_CODEC_H_
20856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org
21856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org#include <stdint.h>
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <android/native_window.h>
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <media/IOMX.h>
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <media/stagefright/CodecBase.h>
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <media/stagefright/SkipCutBuffer.h>
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <OMX_Audio.h>
28856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org
29856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org#define TRACK_BUFFER_TIMING     0
306696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org
316696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.orgnamespace android {
326696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org
336696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.orgstruct ABuffer;
346696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.orgstruct MemoryDealer;
356696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.orgstruct DescribeColorFormatParams;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct ACodec : public AHierarchicalStateMachine, public CodecBase {
386696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org    ACodec();
396696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org
400486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    virtual void setNotificationMessage(const sp<AMessage> &msg);
410486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
420486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    void initiateSetup(const sp<AMessage> &msg);
436696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org
440486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    virtual void initiateAllocateComponent(const sp<AMessage> &msg);
456696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org    virtual void initiateConfigureComponent(const sp<AMessage> &msg);
460486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    virtual void initiateCreateInputSurface();
476696fba9388a386f7d0e3e0d93df48d43f05cd95stefan@webrtc.org    virtual void initiateStart();
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void initiateShutdown(bool keepComponentAllocated = false);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void signalFlush();
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void signalResume();
520486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
530486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    virtual void signalSetParameters(const sp<AMessage> &msg);
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void signalEndOfInputStream();
550486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    virtual void signalRequestIDRFrame();
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // AHierarchicalStateMachine implements the message handling
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void onMessageReceived(const sp<AMessage> &msg) {
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        handleMessage(msg);
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct PortDescription : public CodecBase::PortDescription {
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        size_t countBuffers();
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        IOMX::buffer_id bufferIDAt(size_t index) const;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        sp<ABuffer> bufferAt(size_t index) const;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    private:
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        friend struct ACodec;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Vector<IOMX::buffer_id> mBufferIDs;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Vector<sp<ABuffer> > mBuffers;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        PortDescription();
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
790486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.orgprotected:
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~ACodec();
810486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
830486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    struct BaseState;
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct UninitializedState;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct LoadedState;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct LoadedToIdleState;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct IdleToExecutingState;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct ExecutingState;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct OutputPortSettingsChangedState;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct ExecutingToIdleState;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct IdleToLoadedState;
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct FlushingState;
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct DeathNotifier;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enum {
960ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatSetup                   = 'setu',
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatOMXMessage              = 'omx ',
980ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatInputBufferFilled       = 'inpF',
990ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatOutputBufferDrained     = 'outD',
1000ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatShutdown                = 'shut',
1010ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatFlush                   = 'flus',
1020ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatResume                  = 'resm',
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatDrainDeferredMessages   = 'drai',
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatAllocateComponent       = 'allo',
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatConfigureComponent      = 'conf',
1060486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org        kWhatCreateInputSurface      = 'cisf',
1070486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org        kWhatSignalEndOfInputStream  = 'eois',
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatStart                   = 'star',
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatRequestIDRFrame         = 'ridr',
1100486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org        kWhatSetParameters           = 'setP',
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWhatSubmitOutputMetaDataBufferIfEOS = 'subm',
1120ba496bf33feea212277927f212b4b02556c8f8btnakamura@webrtc.org        kWhatOMXDied                 = 'OMXd',
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enum {
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kPortIndexInput  = 0,
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kPortIndexOutput = 1
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enum {
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kFlagIsSecure                                 = 1,
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kFlagPushBlankBuffersToNativeWindowOnShutdown = 2,
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct BufferInfo {
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        enum Status {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OWNED_BY_US,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OWNED_BY_COMPONENT,
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OWNED_BY_UPSTREAM,
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OWNED_BY_DOWNSTREAM,
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OWNED_BY_NATIVE_WINDOW,
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        };
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        IOMX::buffer_id mBufferID;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Status mStatus;
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        unsigned mDequeuedAt;
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        sp<ABuffer> mData;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        sp<GraphicBuffer> mGraphicBuffer;
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if TRACK_BUFFER_TIMING
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct BufferStats {
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int64_t mEmptyBufferTimeUs;
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int64_t mFillBufferDoneTimeUs;
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
147856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    KeyedVector<int64_t, BufferStats> mBufferStats;
149856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org#endif
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    sp<AMessage> mNotify;
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<UninitializedState> mUninitializedState;
154856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    sp<LoadedState> mLoadedState;
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<LoadedToIdleState> mLoadedToIdleState;
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<IdleToExecutingState> mIdleToExecutingState;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<ExecutingState> mExecutingState;
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<ExecutingToIdleState> mExecutingToIdleState;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<IdleToLoadedState> mIdleToLoadedState;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<FlushingState> mFlushingState;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<SkipCutBuffer> mSkipCutBuffer;
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AString mComponentName;
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    uint32_t mFlags;
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    uint32_t mQuirks;
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<IOMX> mOMX;
168856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    IOMX::node_id mNode;
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<MemoryDealer> mDealer[2];
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    sp<ANativeWindow> mNativeWindow;
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sp<AMessage> mInputFormat;
1730486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    sp<AMessage> mOutputFormat;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    Vector<BufferInfo> mBuffers[2];
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool mPortEOS[2];
1770486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t mInputEOSResult;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
179856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    List<sp<AMessage> > mDeferredQueue;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1810486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool mSentFormat;
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool mIsEncoder;
183856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    bool mUseMetadataOnEncoderOutput;
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool mShutdownInProgress;
1850486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool mExplicitShutdown;
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // If "mKeepComponentAllocated" we only transition back to Loaded state
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // and do not release the component instance.
189856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    bool mKeepComponentAllocated;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int32_t mEncoderDelay;
192856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    int32_t mEncoderPadding;
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int32_t mRotationDegrees;
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
195856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    bool mChannelMaskPresent;
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int32_t mChannelMask;
197856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    unsigned mDequeueCounter;
1980486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool mStoreMetaDataInOutputBuffers;
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int32_t mMetaDataBuffersToSubmit;
200856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    size_t mNumUndequeuedBuffers;
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
202856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    int64_t mRepeatFrameDelayUs;
2030486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    int64_t mMaxPtsGapUs;
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
205856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    int64_t mTimePerFrameUs;
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int64_t mTimePerCaptureUs;
207856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org
2080486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool mCreateInputBuffersSuspended;
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
210856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t allocateBuffersOnPort(OMX_U32 portIndex);
212856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    status_t freeBuffersOnPort(OMX_U32 portIndex);
2130486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t freeBuffer(OMX_U32 portIndex, size_t i);
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t configureOutputBuffersFromNativeWindow(
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_U32 *nBufferCount, OMX_U32 *nBufferSize,
217856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org            OMX_U32 *nMinUndequeuedBuffers);
2180486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t allocateOutputMetaDataBuffers();
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t submitOutputMetaDataBuffer();
220856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    void signalSubmitOutputMetaDataBufferIfEOS_workaround();
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t allocateOutputBuffersFromNativeWindow();
2220486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t cancelBufferToNativeWindow(BufferInfo *info);
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t freeOutputBuffersNotOwnedByComponent();
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BufferInfo *dequeueBufferFromNativeWindow();
2250486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2260486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    BufferInfo *findBufferByID(
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            uint32_t portIndex, IOMX::buffer_id bufferID,
2280486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            ssize_t *index = NULL);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2300486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setComponentRole(bool isEncoder, const char *mime);
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t configureCodec(const char *mime, const sp<AMessage> &msg);
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setVideoPortFormatType(
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_U32 portIndex,
2350486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            OMX_VIDEO_CODINGTYPE compressionFormat,
2360486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            OMX_COLOR_FORMATTYPE colorFormat);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2380486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setSupportedOutputFormat();
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2400486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setupVideoDecoder(
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            const char *mime, const sp<AMessage> &msg);
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupVideoEncoder(
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            const char *mime, const sp<AMessage> &msg);
2450486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2460486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setVideoFormatOnPort(
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_U32 portIndex,
2480486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            int32_t width, int32_t height,
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_VIDEO_CODINGTYPE compressionFormat);
2500486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupAACCodec(
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            bool encoder,
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int32_t numChannels, int32_t sampleRate, int32_t bitRate,
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            int32_t aacProfile, bool isADTS);
2550486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2560486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setupAC3Codec(bool encoder, int32_t numChannels, int32_t sampleRate);
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2580486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t selectAudioPortFormat(
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
2600486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupG711Codec(bool encoder, int32_t numChannels);
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupFlacCodec(
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2670486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setupRawAudioFormat(
2680486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
2690486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2700486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2720486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
273856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    status_t setupH263EncoderParameters(const sp<AMessage> &msg);
274856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
275856edd527f7c49517d6d866b602defd743ca0bdbandrew@webrtc.org    status_t setupHEVCEncoderParameters(const sp<AMessage> &msg);
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setupVPXEncoderParameters(const sp<AMessage> &msg);
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t configureBitrate(
2810486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
2820486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2830486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t setupErrorCorrectionParameters();
2840486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2850486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t initNativeWindow();
2860486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2870486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    status_t pushBlankBuffersToNativeWindow();
2880486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2890486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    // Returns true iff all buffers on the given port have status
2900486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
2910486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
2920486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2930486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    bool allYourBuffersAreBelongToUs();
2940486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2950486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    void waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs();
2960486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
2970486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
2980486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    size_t countBuffersOwnedByNativeWindow() const;
2990486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org
3000486a10044b3af7e612e7e5c26051cc23bea12b1pbos@webrtc.org    void deferMessage(const sp<AMessage> &msg);
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void processDeferredMessages();
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void sendFormatChange(const sp<AMessage> &reply);
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void signalError(
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            OMX_ERRORTYPE error = OMX_ErrorUndefined,
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            status_t internalError = UNKNOWN_ERROR);
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static void describeDefaultColorFormat(DescribeColorFormatParams &describeParams);
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t requestIDRFrame();
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    status_t setParameters(const sp<AMessage> &params);
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Send EOS on input stream.
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void onSignalEndOfInputStream();
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
3202a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org
3212a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org}  // namespace android
3222a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org
3230329e591cd17957836fd295ae9b31f7d3a73e5e8fischman@webrtc.org#endif  // A_CODEC_H_
3242a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org