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