OMXCodec.h revision 78d529eb330ab6c04b5c694403f5a7e7de4b702f
1cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran/*
2cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * Copyright (C) 2009 The Android Open Source Project
3cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran *
4cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * Licensed under the Apache License, Version 2.0 (the "License");
5cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * you may not use this file except in compliance with the License.
6cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * You may obtain a copy of the License at
7cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran *
8cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran *      http://www.apache.org/licenses/LICENSE-2.0
9cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran *
10cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * Unless required by applicable law or agreed to in writing, software
11cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * distributed under the License is distributed on an "AS IS" BASIS,
12cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * See the License for the specific language governing permissions and
14cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran * limitations under the License.
15cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran */
16cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
17cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran#ifndef OMX_CODEC_H_
18cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
19cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran#define OMX_CODEC_H_
20cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
218c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti#include <media/IOMX.h>
22cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran#include <media/stagefright/MediaBuffer.h>
23cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran#include <media/stagefright/MediaSource.h>
24cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran#include <utils/threads.h>
25cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
26cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandrannamespace android {
27cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
28cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandranclass MemoryDealer;
29cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandranstruct OMXCodecObserver;
30cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
31cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandranstruct OMXCodec : public MediaSource,
32cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran                  public MediaBufferObserver {
33cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    enum CreationFlags {
34cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        kPreferSoftwareCodecs = 1,
35cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    };
36cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    static sp<MediaSource> Create(
37cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const sp<IOMX> &omx,
38cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const sp<MetaData> &meta, bool createEncoder,
39cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const sp<MediaSource> &source,
40cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const char *matchComponentName = NULL,
41cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            uint32_t flags = 0);
42cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
43cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    static void setComponentRole(
44cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const sp<IOMX> &omx, IOMX::node_id node, bool isEncoder,
45cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const char *mime);
460cbe94a349616442672fad3751ac81f4f7f394f3Robert Greenwalt
47cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    virtual status_t start(MetaData *params = NULL);
48cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    virtual status_t stop();
49cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
508c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    virtual sp<MetaData> getFormat();
518c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
528c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    virtual status_t read(
538c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti            MediaBuffer **buffer, const ReadOptions *options = NULL);
548c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
558c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    void on_message(const omx_message &msg);
568c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
578c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    // from MediaBufferObserver
58cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    virtual void signalBufferReturned(MediaBuffer *buffer);
59cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
608c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colittiprotected:
618c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    virtual ~OMXCodec();
62cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
63cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandranprivate:
64cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    enum State {
65cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        DEAD,
66cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        LOADED,
67cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        LOADED_TO_IDLE,
68cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        IDLE_TO_EXECUTING,
69cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        EXECUTING,
70cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        EXECUTING_TO_IDLE,
718c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        IDLE_TO_LOADED,
72cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        RECONFIGURING,
73cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        ERROR
74cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    };
758c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
768c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    enum {
778c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kPortIndexInput  = 0,
788c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kPortIndexOutput = 1
798c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    };
808c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
81cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    enum PortStatus {
82cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        ENABLED,
83cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        DISABLING,
848c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        DISABLED,
858c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        ENABLING,
868c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        SHUTTING_DOWN,
878c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    };
888c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
898c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    enum Quirks {
908c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kNeedsFlushBeforeDisable             = 1,
918c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kWantsNALFragments                   = 2,
928c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kRequiresLoadedToIdleAfterAllocation = 4,
938c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kRequiresAllocateBufferOnInputPorts  = 8,
948c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kRequiresFlushCompleteEmulation      = 16,
958c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kRequiresAllocateBufferOnOutputPorts = 32,
968c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kRequiresFlushBeforeShutdown         = 64,
978c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kDefersOutputBufferAllocation        = 128,
988c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        kDecoderLiesAboutNumberOfChannels    = 256,
998c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    };
1008c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1018c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    struct BufferInfo {
1028c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        IOMX::buffer_id mBuffer;
1038c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        bool mOwnedByComponent;
1048c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        sp<IMemory> mMem;
1058c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        size_t mSize;
1068c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        void *mData;
1078c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        MediaBuffer *mMediaBuffer;
1088c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    };
109cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
110cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    struct CodecSpecificData {
111cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        size_t mSize;
112cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran        uint8_t mData[1];
113cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    };
114cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
115cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    sp<IOMX> mOMX;
116cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mOMXLivesLocally;
117cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    IOMX::node_id mNode;
118cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    uint32_t mQuirks;
119cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mIsEncoder;
120cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    char *mMIME;
121cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    char *mComponentName;
122cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    sp<MetaData> mOutputFormat;
123cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    sp<MediaSource> mSource;
124cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    Vector<CodecSpecificData *> mCodecSpecificData;
125cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    size_t mCodecSpecificDataIndex;
126cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
127cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    sp<MemoryDealer> mDealer[2];
128cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
129cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    State mState;
130cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    Vector<BufferInfo> mPortBuffers[2];
131cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    PortStatus mPortStatus[2];
132cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mInitialBufferSubmit;
133cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mSignalledEOS;
134cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mNoMoreOutputData;
135cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool mOutputPortSettingsHaveChanged;
136cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    int64_t mSeekTimeUs;
137cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
138cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    Mutex mLock;
139cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    Condition mAsyncCompletion;
140cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
141cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // A list of indices into mPortStatus[kPortIndexOutput] filled with data.
142cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    List<size_t> mFilledBuffers;
143cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    Condition mBufferFilled;
144cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
145cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks,
146cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran             bool isEncoder, const char *mime, const char *componentName,
147cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran             const sp<MediaSource> &source);
148cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
149cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void addCodecSpecificData(const void *data, size_t size);
150cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void clearCodecSpecificData();
151cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
152cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setComponentRole();
153cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
154cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setAMRFormat(bool isWAMR);
155cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setAACFormat(int32_t numChannels, int32_t sampleRate);
156cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
157cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    status_t setVideoPortFormatType(
158cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            OMX_U32 portIndex,
159cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            OMX_VIDEO_CODINGTYPE compressionFormat,
160cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            OMX_COLOR_FORMATTYPE colorFormat);
161cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
162cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setVideoInputFormat(
163cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const char *mime, OMX_U32 width, OMX_U32 height);
1648c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
165cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    status_t setupMPEG4EncoderParameters();
166cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    status_t setupAVCEncoderParameters();
167cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
168cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setVideoOutputFormat(
169cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            const char *mime, OMX_U32 width, OMX_U32 height);
170cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
171cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setImageOutputFormat(
172cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran            OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);
1738c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1748c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    void setJPEGInputFormat(
1754b0f8e6fb707e19799011c1f4a5e4f54603e34b1Lorenzo Colitti            OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize);
1768c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1778c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    void setMinBufferSize(OMX_U32 portIndex, OMX_U32 size);
1788c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1798c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    void setRawAudioFormat(
1808c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti            OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
1818c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1828c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    status_t allocateBuffers();
1838c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    status_t allocateBuffersOnPort(OMX_U32 portIndex);
1848c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti
1858c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    status_t freeBuffersOnPort(
1868c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti            OMX_U32 portIndex, bool onlyThoseWeOwn = false);
187cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
188cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void drainInputBuffer(IOMX::buffer_id buffer);
189cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void fillOutputBuffer(IOMX::buffer_id buffer);
190cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void drainInputBuffer(BufferInfo *info);
191cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void fillOutputBuffer(BufferInfo *info);
192cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
193cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void drainInputBuffers();
194cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void fillOutputBuffers();
195cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
196cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // Returns true iff a flush was initiated and a completion event is
197cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // upcoming, false otherwise (A flush was not necessary as we own all
198cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // the buffers on that port).
199cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // This method will ONLY ever return false for a component with quirk
200cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    // "kRequiresFlushCompleteEmulation".
201cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    bool flushPortAsync(OMX_U32 portIndex);
202cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
203cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void disablePortAsync(OMX_U32 portIndex);
204cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void enablePortAsync(OMX_U32 portIndex);
205cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
206cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    static size_t countBuffersWeOwn(const Vector<BufferInfo> &buffers);
207cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    static bool isIntermediateState(State state);
208cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
209cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
210cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data);
211cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void onStateChange(OMX_STATETYPE newState);
212cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void onPortSettingsChanged(OMX_U32 portIndex);
213cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
214cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    void setState(State newState);
215cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran
216cc91c7b804a079f7b20404827277c61dd403805fSreeram Ramachandran    status_t init();
217    void initOutputFormat(const sp<MetaData> &inputFormat);
218
219    void dumpPortStatus(OMX_U32 portIndex);
220
221    static uint32_t getComponentQuirks(const char *componentName);
222
223    static void findMatchingCodecs(
224            const char *mime,
225            bool createEncoder, const char *matchComponentName,
226            uint32_t flags,
227            Vector<String8> *matchingCodecs);
228
229    OMXCodec(const OMXCodec &);
230    OMXCodec &operator=(const OMXCodec &);
231};
232
233struct CodecProfileLevel {
234    OMX_U32 mProfile;
235    OMX_U32 mLevel;
236};
237
238struct CodecCapabilities {
239    String8 mComponentName;
240    Vector<CodecProfileLevel> mProfileLevels;
241};
242
243// Return a vector of componentNames with supported profile/level pairs
244// supporting the given mime type, if queryDecoders==true, returns components
245// that decode content of the given type, otherwise returns components
246// that encode content of the given type.
247// profile and level indications only make sense for h.263, mpeg4 and avc
248// video.
249// The profile/level values correspond to
250// OMX_VIDEO_H263PROFILETYPE, OMX_VIDEO_MPEG4PROFILETYPE,
251// OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263LEVELTYPE, OMX_VIDEO_MPEG4LEVELTYPE
252// and OMX_VIDEO_AVCLEVELTYPE respectively.
253
254status_t QueryCodecs(
255        const sp<IOMX> &omx,
256        const char *mimeType, bool queryDecoders,
257        Vector<CodecCapabilities> *results);
258
259}  // namespace android
260
261#endif  // OMX_CODEC_H_
262