ACodec.h revision 7cd58537932ef6f481f68be0b9c597a89cebdfec
113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi/*
213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * you may not use this file except in compliance with the License.
613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * You may obtain a copy of the License at
713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi *
1013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * See the License for the specific language governing permissions and
1413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi * limitations under the License.
1513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi */
1613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
174ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#ifndef A_CODEC_H_
184ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
194ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define A_CODEC_H_
204ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
214ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <stdint.h>
224ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <android/native_window.h>
2313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include <media/IOMX.h>
2413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
254ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <media/stagefright/SkipCutBuffer.h>
264ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#include <OMX_Audio.h>
274ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
284ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#define TRACK_BUFFER_TIMING     0
294ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivinamespace android {
314ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
323610785fa93586ce84a27a27530feb77b8035229Glenn Kastenstruct ABuffer;
333610785fa93586ce84a27a27530feb77b8035229Glenn Kastenstruct MemoryDealer;
345933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
355933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenstruct ACodec : public AHierarchicalStateMachine {
365933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    enum {
375933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatFillThisBuffer      = 'fill',
385933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatDrainThisBuffer     = 'drai',
395933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatEOS                 = 'eos ',
404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatShutdownCompleted   = 'scom',
4113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatFlushCompleted      = 'fcom',
4213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatOutputFormatChanged = 'outC',
43e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatError               = 'erro',
4413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatComponentAllocated  = 'cAll',
4513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatComponentConfigured = 'cCon',
4613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatInputSurfaceCreated = 'isfc',
4713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatSignaledInputEOS    = 'seos',
4813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatBuffersAllocated    = 'allc',
494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    };
504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    ACodec();
524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
53fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void setNotificationMessage(const sp<AMessage> &msg);
54fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten    void initiateSetup(const sp<AMessage> &msg);
555933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    void signalFlush();
565e4d65e369f28746767aba11b618dee314bb8197Glenn Kasten    void signalResume();
5713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void initiateShutdown(bool keepComponentAllocated = false);
5813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
594ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    void signalSetParameters(const sp<AMessage> &msg);
6013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void signalEndOfInputStream();
6113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
6213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void initiateAllocateComponent(const sp<AMessage> &msg);
63c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    void initiateConfigureComponent(const sp<AMessage> &msg);
64e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    void initiateCreateInputSurface();
6513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    void initiateStart();
66833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten
67833251ab9e5e59a6ea5ac325122cf3abdf7cd944Glenn Kasten    void signalRequestIDRFrame();
6813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
69c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    struct PortDescription : public RefBase {
7013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        size_t countBuffers();
71c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten        IOMX::buffer_id bufferIDAt(size_t index) const;
72c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten        sp<ABuffer> bufferAt(size_t index) const;
73a9f22e6f5f53e90daa779e38b22f88e4faa35c95Glenn Kasten
74c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten    private:
75c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten        friend struct ACodec;
76c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten
7713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        Vector<IOMX::buffer_id> mBufferIDs;
78c4374bd42cd7eadda841a6b089234becb4f6c508Glenn Kasten        Vector<sp<ABuffer> > mBuffers;
795933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
8070c49ae2867094072a4365423417ea452bf82231Jean-Michel Trivi        PortDescription();
81e21f91df7afb1175ddb5b0045ebb0d5338df2535Andy McFadden        void addBuffer(IOMX::buffer_id id, const sp<ABuffer> &buffer);
8235ac702ee1ad91e5c8748c12450222d50b366a52Glenn Kasten
83fa2bd93c3a9852a1f879663eeff598d13cf8fa81Glenn Kasten        DISALLOW_EVIL_CONSTRUCTORS(PortDescription);
843610785fa93586ce84a27a27530feb77b8035229Glenn Kasten    };
853610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
8637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Triviprotected:
8791145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    virtual ~ACodec();
8891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi
895933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kastenprivate:
905933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    struct BaseState;
915933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    struct UninitializedState;
9213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct LoadedState;
931fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    struct LoadedToIdleState;
9437dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    struct IdleToExecutingState;
9513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct ExecutingState;
9613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct OutputPortSettingsChangedState;
9713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct ExecutingToIdleState;
9813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct IdleToLoadedState;
9913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct FlushingState;
1004ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1014ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    enum {
10213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kWhatSetup                   = 'setu',
103e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatOMXMessage              = 'omx ',
104e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatInputBufferFilled       = 'inpF',
105e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatOutputBufferDrained     = 'outD',
106e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatShutdown                = 'shut',
107e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatFlush                   = 'flus',
108e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatResume                  = 'resm',
109e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatDrainDeferredMessages   = 'drai',
110e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten        kWhatAllocateComponent       = 'allo',
1114ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatConfigureComponent      = 'conf',
1124ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        kWhatCreateInputSurface      = 'cisf',
1133610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatSignalEndOfInputStream  = 'eois',
1143610785fa93586ce84a27a27530feb77b8035229Glenn Kasten        kWhatStart                   = 'star',
1155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatRequestIDRFrame         = 'ridr',
1165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kWhatSetParameters           = 'setP',
1175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    };
1185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
1195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    enum {
1205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kPortIndexInput  = 0,
1215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        kPortIndexOutput = 1
1225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    };
12313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
12413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    enum {
12513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        kFlagIsSecure   = 1,
12637dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    };
12737dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
12813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    struct BufferInfo {
12913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        enum Status {
13013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OWNED_BY_US,
13113837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OWNED_BY_COMPONENT,
13213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OWNED_BY_UPSTREAM,
13313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OWNED_BY_DOWNSTREAM,
13413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OWNED_BY_NATIVE_WINDOW,
13513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        };
13613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
13713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        IOMX::buffer_id mBufferID;
13813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi        Status mStatus;
13937dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi
1404ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        sp<ABuffer> mData;
1414ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        sp<GraphicBuffer> mGraphicBuffer;
1424ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    };
1433610785fa93586ce84a27a27530feb77b8035229Glenn Kasten
1443610785fa93586ce84a27a27530feb77b8035229Glenn Kasten#if TRACK_BUFFER_TIMING
1455933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    struct BufferStats {
1465933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten        int64_t mEmptyBufferTimeUs;
1474ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi        int64_t mFillBufferDoneTimeUs;
1484ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    };
1494ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1504ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    KeyedVector<int64_t, BufferStats> mBufferStats;
1514ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi#endif
1524ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1534ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    sp<AMessage> mNotify;
1544ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1554ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    sp<UninitializedState> mUninitializedState;
15613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<LoadedState> mLoadedState;
15713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<LoadedToIdleState> mLoadedToIdleState;
15813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<IdleToExecutingState> mIdleToExecutingState;
15913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ExecutingState> mExecutingState;
160e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
161e6ded5c61944a87fa9e472dec3a6929855d42aebJean-Michel Trivi    sp<ExecutingToIdleState> mExecutingToIdleState;
16213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<IdleToLoadedState> mIdleToLoadedState;
16349935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    sp<FlushingState> mFlushingState;
16413837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<SkipCutBuffer> mSkipCutBuffer;
16549935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten
16649935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    AString mComponentName;
16749935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    uint32_t mFlags;
16849935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    uint32_t mQuirks;
169f6445d330c05ccc57d1adcc6ee05735a33f78881Glenn Kasten    sp<IOMX> mOMX;
1709f07ea788f57654acf29d1321b40162e41eb122bGlenn Kasten    IOMX::node_id mNode;
17149935c51fddcd0caa0030e2aac0c3a7ba3339e3dGlenn Kasten    sp<MemoryDealer> mDealer[2];
17213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
17313837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    sp<ANativeWindow> mNativeWindow;
174e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten
17513837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    Vector<BufferInfo> mBuffers[2];
17613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    bool mPortEOS[2];
17713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    status_t mInputEOSResult;
17813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
179167a2af67dcc0d20e6e3e995a23a0567715e0ee1Glenn Kasten    List<sp<AMessage> > mDeferredQueue;
18013837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi
181e2e8fa36bd7448b59fbcdf141e0b6d21e5401d91Glenn Kasten    bool mSentFormat;
18237dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    bool mIsEncoder;
1831fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten
1841fa5c3206d06bbebdea2dc92f378ce6b8a211e23Glenn Kasten    bool mShutdownInProgress;
1854ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
18691145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    // If "mKeepComponentAllocated" we only transition back to Loaded state
1874ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    // and do not release the component instance.
1884ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    bool mKeepComponentAllocated;
1894ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1904ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mEncoderDelay;
1914ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi    int32_t mEncoderPadding;
1924ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
1937349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    bool mChannelMaskPresent;
1947349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    int32_t mChannelMask;
1957349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
1967349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    status_t setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode);
19791145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    status_t allocateBuffersOnPort(OMX_U32 portIndex);
19891145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    status_t freeBuffersOnPort(OMX_U32 portIndex);
19991145ef159d3e165a461cbd76341ff8ed3d72baeJean-Michel Trivi    status_t freeBuffer(OMX_U32 portIndex, size_t i);
2007349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten
2017349b2e742b2cedc6d149fac62ed661ad7d47decGlenn Kasten    status_t allocateOutputBuffersFromNativeWindow();
20213837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    status_t cancelBufferToNativeWindow(BufferInfo *info);
2035933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t freeOutputBuffersNotOwnedByComponent();
2045933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    BufferInfo *dequeueBufferFromNativeWindow();
2055933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2065933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    BufferInfo *findBufferByID(
2075933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            uint32_t portIndex, IOMX::buffer_id bufferID,
2085933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            ssize_t *index = NULL);
2095933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2105933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t setComponentRole(bool isEncoder, const char *mime);
2115933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t configureCodec(const char *mime, const sp<AMessage> &msg);
2125933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2135933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t setVideoPortFormatType(
2145933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            OMX_U32 portIndex,
2155933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            OMX_VIDEO_CODINGTYPE compressionFormat,
2165933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            OMX_COLOR_FORMATTYPE colorFormat);
2175933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2185933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t setSupportedOutputFormat();
2195933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2205933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t setupVideoDecoder(
2215933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            const char *mime, int32_t width, int32_t height);
2225933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
2235933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten    status_t setupVideoEncoder(
2245933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten            const char *mime, const sp<AMessage> &msg);
2255933f3d5e532aaac31ce0e6551c59f0197c0ae3cGlenn Kasten
22613837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi    status_t setVideoFormatOnPort(
22713837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OMX_U32 portIndex,
22813837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            int32_t width, int32_t height,
22913837cf3f7be0eb8b1a9552bd99a89f98c987720Jean-Michel Trivi            OMX_VIDEO_CODINGTYPE compressionFormat);
2304ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi
23199b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten    status_t setupAACCodec(
23299b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten            bool encoder,
23399b927751677abfb60a388d65dfeed1fed1db12cGlenn Kasten            int32_t numChannels, int32_t sampleRate, int32_t bitRate,
2344ee246c55533bdab8ab5fa0f0581744fe58e7c91Jean-Michel Trivi            int32_t aacProfile, bool isADTS);
235
236    status_t selectAudioPortFormat(
237            OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);
238
239    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
240    status_t setupG711Codec(bool encoder, int32_t numChannels);
241
242    status_t setupFlacCodec(
243            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel);
244
245    status_t setupRawAudioFormat(
246            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
247
248    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
249
250    status_t setupMPEG4EncoderParameters(const sp<AMessage> &msg);
251    status_t setupH263EncoderParameters(const sp<AMessage> &msg);
252    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);
253
254    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
255
256    status_t configureBitrate(
257            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);
258
259    status_t setupErrorCorrectionParameters();
260
261    status_t initNativeWindow();
262
263    status_t pushBlankBuffersToNativeWindow();
264
265    // Returns true iff all buffers on the given port have status OWNED_BY_US.
266    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
267
268    bool allYourBuffersAreBelongToUs();
269
270    size_t countBuffersOwnedByComponent(OMX_U32 portIndex) const;
271
272    void deferMessage(const sp<AMessage> &msg);
273    void processDeferredMessages();
274
275    void sendFormatChange();
276
277    void signalError(
278            OMX_ERRORTYPE error = OMX_ErrorUndefined,
279            status_t internalError = UNKNOWN_ERROR);
280
281    status_t requestIDRFrame();
282    status_t setParameters(const sp<AMessage> &params);
283
284    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
285};
286
287}  // namespace android
288
289#endif  // A_CODEC_H_
290