ACodec.h revision 2c2814b900a61fa07ddfff860b143fbbe9c740e9
1#ifndef A_CODEC_H_
2
3#define A_CODEC_H_
4
5#include <stdint.h>
6#include <android/native_window.h>
7#include <media/IOMX.h>
8#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
9
10namespace android {
11
12struct ABuffer;
13struct MemoryDealer;
14
15struct ACodec : public AHierarchicalStateMachine {
16    enum {
17        kWhatFillThisBuffer      = 'fill',
18        kWhatDrainThisBuffer     = 'drai',
19        kWhatEOS                 = 'eos ',
20        kWhatShutdownCompleted   = 'scom',
21        kWhatFlushCompleted      = 'fcom',
22        kWhatOutputFormatChanged = 'outC',
23    };
24
25    ACodec();
26
27    void setNotificationMessage(const sp<AMessage> &msg);
28    void initiateSetup(const sp<AMessage> &msg);
29    void signalFlush();
30    void signalResume();
31    void initiateShutdown();
32
33protected:
34    virtual ~ACodec();
35
36private:
37    struct BaseState;
38    struct UninitializedState;
39    struct LoadedToIdleState;
40    struct IdleToExecutingState;
41    struct ExecutingState;
42    struct OutputPortSettingsChangedState;
43    struct ExecutingToIdleState;
44    struct IdleToLoadedState;
45    struct ErrorState;
46    struct FlushingState;
47
48    enum {
49        kWhatSetup                   = 'setu',
50        kWhatOMXMessage              = 'omx ',
51        kWhatInputBufferFilled       = 'inpF',
52        kWhatOutputBufferDrained     = 'outD',
53        kWhatShutdown                = 'shut',
54        kWhatFlush                   = 'flus',
55        kWhatResume                  = 'resm',
56        kWhatDrainDeferredMessages   = 'drai',
57    };
58
59    enum {
60        kPortIndexInput  = 0,
61        kPortIndexOutput = 1
62    };
63
64    struct BufferInfo {
65        enum Status {
66            OWNED_BY_US,
67            OWNED_BY_COMPONENT,
68            OWNED_BY_UPSTREAM,
69            OWNED_BY_DOWNSTREAM,
70            OWNED_BY_NATIVE_WINDOW,
71        };
72
73        IOMX::buffer_id mBufferID;
74        Status mStatus;
75
76        sp<ABuffer> mData;
77        sp<GraphicBuffer> mGraphicBuffer;
78    };
79
80    sp<AMessage> mNotify;
81
82    sp<UninitializedState> mUninitializedState;
83    sp<LoadedToIdleState> mLoadedToIdleState;
84    sp<IdleToExecutingState> mIdleToExecutingState;
85    sp<ExecutingState> mExecutingState;
86    sp<OutputPortSettingsChangedState> mOutputPortSettingsChangedState;
87    sp<ExecutingToIdleState> mExecutingToIdleState;
88    sp<IdleToLoadedState> mIdleToLoadedState;
89    sp<ErrorState> mErrorState;
90    sp<FlushingState> mFlushingState;
91
92    AString mComponentName;
93    sp<IOMX> mOMX;
94    IOMX::node_id mNode;
95    sp<MemoryDealer> mDealer[2];
96
97    sp<ANativeWindow> mNativeWindow;
98
99    Vector<BufferInfo> mBuffers[2];
100    bool mPortEOS[2];
101
102    List<sp<AMessage> > mDeferredQueue;
103
104    status_t allocateBuffersOnPort(OMX_U32 portIndex);
105    status_t freeBuffersOnPort(OMX_U32 portIndex);
106    status_t freeBuffer(OMX_U32 portIndex, size_t i);
107
108    status_t allocateOutputBuffersFromNativeWindow();
109    status_t cancelBufferToNativeWindow(BufferInfo *info);
110    status_t freeOutputBuffersOwnedByNativeWindow();
111    BufferInfo *dequeueBufferFromNativeWindow();
112
113    BufferInfo *findBufferByID(
114            uint32_t portIndex, IOMX::buffer_id bufferID,
115            ssize_t *index = NULL);
116
117    void setComponentRole(bool isEncoder, const char *mime);
118    void configureCodec(const char *mime, const sp<AMessage> &msg);
119
120    status_t setVideoPortFormatType(
121            OMX_U32 portIndex,
122            OMX_VIDEO_CODINGTYPE compressionFormat,
123            OMX_COLOR_FORMATTYPE colorFormat);
124
125    status_t setSupportedOutputFormat();
126
127    status_t setupVideoDecoder(
128            const char *mime, int32_t width, int32_t height);
129
130    status_t setVideoFormatOnPort(
131            OMX_U32 portIndex,
132            int32_t width, int32_t height,
133            OMX_VIDEO_CODINGTYPE compressionFormat);
134
135    status_t setupAACDecoder(int32_t numChannels, int32_t sampleRate);
136    status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
137
138    status_t initNativeWindow();
139
140    // Returns true iff all buffers on the given port have status OWNED_BY_US.
141    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
142
143    bool allYourBuffersAreBelongToUs();
144
145    void deferMessage(const sp<AMessage> &msg);
146    void processDeferredMessages();
147
148    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
149};
150
151}  // namespace android
152
153#endif  // A_CODEC_H_
154