OMXCodec.h revision be06d26cdc70070654f1eedcd08c1c68cd587ad6
1be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber/*
2be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber *
4be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * you may not use this file except in compliance with the License.
6be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * You may obtain a copy of the License at
7be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber *
8be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber *
10be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * See the License for the specific language governing permissions and
14be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber * limitations under the License.
15be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber */
16be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
17be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#ifndef OMX_CODEC_H_
18be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
19be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#define OMX_CODEC_H_
20be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
21be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/IOMX.h>
22be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/stagefright/MediaBuffer.h>
23be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/stagefright/MediaSource.h>
24be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <utils/threads.h>
25be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
26be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Hubernamespace android {
27be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
28be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberclass MemoryDealer;
29be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberstruct OMXCodecObserver;
30be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
31be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberstruct OMXCodec : public MediaSource,
32be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber                  public MediaBufferObserver {
33be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    static sp<OMXCodec> Create(
34be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const sp<IOMX> &omx,
35be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const sp<MetaData> &meta, bool createEncoder,
36be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const sp<MediaSource> &source);
37be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
38be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t start(MetaData *params = NULL);
39be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t stop();
40be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
41be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual sp<MetaData> getFormat();
42be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
43be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t read(
44be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            MediaBuffer **buffer, const ReadOptions *options = NULL);
45be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
46be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void on_message(const omx_message &msg);
47be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
48be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    // from MediaBufferObserver
49be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual void signalBufferReturned(MediaBuffer *buffer);
50be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
51be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprotected:
52be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual ~OMXCodec();
53be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
54be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprivate:
55be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    enum State {
56be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        DEAD,
57be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        LOADED,
58be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        LOADED_TO_IDLE,
59be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        IDLE_TO_EXECUTING,
60be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        EXECUTING,
61be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        EXECUTING_TO_IDLE,
62be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        IDLE_TO_LOADED,
63be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        RECONFIGURING,
64be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        ERROR
65be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
66be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
67be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    enum {
68be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kPortIndexInput  = 0,
69be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kPortIndexOutput = 1
70be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
71be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
72be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    enum PortStatus {
73be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        ENABLED,
74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        DISABLING,
75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        DISABLED,
76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        ENABLING,
77be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        SHUTTING_DOWN,
78be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    enum Quirks {
81be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kNeedsFlushBeforeDisable             = 1,
82be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kWantsRawNALFrames                   = 2,
83be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kRequiresLoadedToIdleAfterAllocation = 4,
84be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        kRequiresAllocateBufferOnInputPorts  = 8,
85be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
86be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
87be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    struct BufferInfo {
88be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        IOMX::buffer_id mBuffer;
89be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        bool mOwnedByComponent;
90be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        sp<IMemory> mMem;
91be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        MediaBuffer *mMediaBuffer;
92be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
93be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
94be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    struct CodecSpecificData {
95be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        size_t mSize;
96be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber        uint8_t mData[1];
97be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    };
98be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
99be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    sp<IOMX> mOMX;
100be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id mNode;
101be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    sp<OMXCodecObserver> mObserver;
102be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    uint32_t mQuirks;
103be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    bool mIsEncoder;
104be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    char *mMIME;
105be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    char *mComponentName;
106be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    sp<MetaData> mOutputFormat;
107be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    sp<MediaSource> mSource;
108be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    Vector<CodecSpecificData *> mCodecSpecificData;
109be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    size_t mCodecSpecificDataIndex;
110be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
111be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    sp<MemoryDealer> mDealer;
112be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
113be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    State mState;
114be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    Vector<BufferInfo> mPortBuffers[2];
115be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    PortStatus mPortStatus[2];
116be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    bool mSignalledEOS;
117be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    bool mNoMoreOutputData;
118be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    int64_t mSeekTimeUs;
119be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
120be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    Mutex mLock;
121be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    Condition mAsyncCompletion;
122be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
123be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    // A list of indices into mPortStatus[kPortIndexOutput] filled with data.
124be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    List<size_t> mFilledBuffers;
125be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    Condition mBufferFilled;
126be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
127be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks,
128be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber             bool isEncoder, const char *mime, const char *componentName,
129be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber             const sp<MediaSource> &source);
130be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
131be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void addCodecSpecificData(const void *data, size_t size);
132be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void clearCodecSpecificData();
133be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
134be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setAMRFormat();
135be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setAACFormat();
136be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
137be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    status_t setVideoPortFormatType(
138be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_U32 portIndex,
139be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_VIDEO_CODINGTYPE compressionFormat,
140be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat);
141be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
142be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setVideoInputFormat(
143be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *mime, OMX_U32 width, OMX_U32 height);
144be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
145be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setVideoOutputFormat(
146be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *mime, OMX_U32 width, OMX_U32 height);
147be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
148be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setImageOutputFormat(
149be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);
150be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
151be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    status_t allocateBuffers();
152be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    status_t allocateBuffersOnPort(OMX_U32 portIndex);
153be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
154be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    status_t freeBuffersOnPort(
155be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_U32 portIndex, bool onlyThoseWeOwn = false);
156be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
157be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void drainInputBuffer(IOMX::buffer_id buffer);
158be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void fillOutputBuffer(IOMX::buffer_id buffer);
159be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void drainInputBuffer(BufferInfo *info);
160be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void fillOutputBuffer(BufferInfo *info);
161be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
162be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void drainInputBuffers();
163be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void fillOutputBuffers();
164be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
165be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void flushPortAsync(OMX_U32 portIndex);
166be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void disablePortAsync(OMX_U32 portIndex);
167be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void enablePortAsync(OMX_U32 portIndex);
168be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
169be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    static size_t countBuffersWeOwn(const Vector<BufferInfo> &buffers);
170be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    static bool isIntermediateState(State state);
171be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
172be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
173be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data);
174be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void onStateChange(OMX_STATETYPE newState);
175be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void onPortSettingsChanged(OMX_U32 portIndex);
176be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
177be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void setState(State newState);
178be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
179be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    status_t init();
180be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void initOutputFormat(const sp<MetaData> &inputFormat);
181be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
182be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    void dumpPortStatus(OMX_U32 portIndex);
183be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
184be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    OMXCodec(const OMXCodec &);
185be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    OMXCodec &operator=(const OMXCodec &);
186be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber};
187be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
188be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber}  // namespace android
189be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
190be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#endif  // OMX_CODEC_H_
191