OMXCodec.h revision 1244eab2cea41df1db4eeb930fddbb9e67ff7691
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 { 33e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber enum CreationFlags { 34e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber kPreferSoftwareCodecs = 1, 35e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber }; 3691eb0354043842d96bf3ef201ce68046db70df74Andreas Huber static sp<MediaSource> Create( 37be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<IOMX> &omx, 38be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<MetaData> &meta, bool createEncoder, 39e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<MediaSource> &source, 40e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber const char *matchComponentName = NULL, 41e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber uint32_t flags = 0); 42e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 43e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber static void setComponentRole( 44e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<IOMX> &omx, IOMX::node_id node, bool isEncoder, 45e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const char *mime); 46be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 47be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t start(MetaData *params = NULL); 48be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t stop(); 49be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 50be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual sp<MetaData> getFormat(); 51be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 52be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t read( 53be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 54be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 55be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void on_message(const omx_message &msg); 56be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 57be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber // from MediaBufferObserver 58be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual void signalBufferReturned(MediaBuffer *buffer); 59be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 60be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprotected: 61be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual ~OMXCodec(); 62be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 63be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprivate: 64be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum State { 65be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DEAD, 66be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber LOADED, 67be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber LOADED_TO_IDLE, 68be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IDLE_TO_EXECUTING, 69be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber EXECUTING, 70be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber EXECUTING_TO_IDLE, 71be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IDLE_TO_LOADED, 72be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber RECONFIGURING, 73be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ERROR 74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum { 77be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber kPortIndexInput = 0, 78be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber kPortIndexOutput = 1 79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 81be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum PortStatus { 82be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ENABLED, 83be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DISABLING, 84be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DISABLED, 85be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ENABLING, 86be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber SHUTTING_DOWN, 87be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 88be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 89be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum Quirks { 90a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kNeedsFlushBeforeDisable = 1, 91a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kWantsNALFragments = 2, 92a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresLoadedToIdleAfterAllocation = 4, 93a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresAllocateBufferOnInputPorts = 8, 94a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresFlushCompleteEmulation = 16, 95a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresAllocateBufferOnOutputPorts = 32, 96a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresFlushBeforeShutdown = 64, 97a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kDefersOutputBufferAllocation = 128, 98a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kDecoderLiesAboutNumberOfChannels = 256, 99a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kInputBufferSizesAreBogus = 512, 100a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kSupportsMultipleFramesPerInputBuffer = 1024, 1014f501f0f2b71b69cadbdb96c71e83a06751e7f0eJames Dong kAvoidMemcopyInputRecordingFrames = 2048, 102be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 103be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 104be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber struct BufferInfo { 105be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::buffer_id mBuffer; 106be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mOwnedByComponent; 107be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<IMemory> mMem; 108c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber size_t mSize; 109c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber void *mData; 110be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber MediaBuffer *mMediaBuffer; 111be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 112be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 113be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber struct CodecSpecificData { 114be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber size_t mSize; 115be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber uint8_t mData[1]; 116be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 117be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 118be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<IOMX> mOMX; 119f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber bool mOMXLivesLocally; 120be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::node_id mNode; 121be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber uint32_t mQuirks; 122be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mIsEncoder; 123be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber char *mMIME; 124be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber char *mComponentName; 125be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<MetaData> mOutputFormat; 126be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<MediaSource> mSource; 127be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Vector<CodecSpecificData *> mCodecSpecificData; 128be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber size_t mCodecSpecificDataIndex; 129be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1305c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber sp<MemoryDealer> mDealer[2]; 131be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 132be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber State mState; 133be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Vector<BufferInfo> mPortBuffers[2]; 134be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber PortStatus mPortStatus[2]; 13542978e55fe438ecdc1b0bac5bf31c2aadbd9e78dAndreas Huber bool mInitialBufferSubmit; 136be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mSignalledEOS; 137d7d22eba3c1bb7212ccc566fedb16dbee44f51a2Andreas Huber status_t mFinalStatus; 138be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mNoMoreOutputData; 139cfd55579c2e20514b181809dfaf30bd6f7e04c7eAndreas Huber bool mOutputPortSettingsHaveChanged; 140be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber int64_t mSeekTimeUs; 141be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 142a4357addf609c4a88867c93db135d531b2c40352Andreas Huber MediaBuffer *mLeftOverBuffer; 143a4357addf609c4a88867c93db135d531b2c40352Andreas Huber 144be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Mutex mLock; 145be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Condition mAsyncCompletion; 146be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 147be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber // A list of indices into mPortStatus[kPortIndexOutput] filled with data. 148be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber List<size_t> mFilledBuffers; 149be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Condition mBufferFilled; 150be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 151be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks, 152be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool isEncoder, const char *mime, const char *componentName, 153be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<MediaSource> &source); 154be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 155be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void addCodecSpecificData(const void *data, size_t size); 156be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void clearCodecSpecificData(); 157be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1584c48342572503c7a92e5634ef8db3f1f9e541256Andreas Huber void setComponentRole(); 1594c48342572503c7a92e5634ef8db3f1f9e541256Andreas Huber 16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong void setAMRFormat(bool isWAMR, int32_t bitRate); 16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong void setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate); 162be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 163be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t setVideoPortFormatType( 164be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_U32 portIndex, 165be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 166be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_COLOR_FORMATTYPE colorFormat); 167be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 168be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setVideoInputFormat( 1691244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong const char *mime, const sp<MetaData>& meta); 170be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1711244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong status_t setupMPEG4EncoderParameters(const sp<MetaData>& meta); 1721244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong status_t setupAVCEncoderParameters(const sp<MetaData>& meta); 173b482ce8837a2d85a2a907d7ea89deaa6610a8333Andreas Huber 1742a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber status_t setVideoOutputFormat( 175be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height); 176be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 177be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setImageOutputFormat( 178be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height); 179be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1805c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber void setJPEGInputFormat( 1815c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize); 1825c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber 183da050cf206afff082f2a3693a8103a5df67df397Andreas Huber void setMinBufferSize(OMX_U32 portIndex, OMX_U32 size); 184da050cf206afff082f2a3693a8103a5df67df397Andreas Huber 185da050cf206afff082f2a3693a8103a5df67df397Andreas Huber void setRawAudioFormat( 186da050cf206afff082f2a3693a8103a5df67df397Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels); 187da050cf206afff082f2a3693a8103a5df67df397Andreas Huber 188be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t allocateBuffers(); 189be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t allocateBuffersOnPort(OMX_U32 portIndex); 190be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 191be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t freeBuffersOnPort( 192be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_U32 portIndex, bool onlyThoseWeOwn = false); 193be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 194be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void drainInputBuffer(IOMX::buffer_id buffer); 195be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffer(IOMX::buffer_id buffer); 196be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void drainInputBuffer(BufferInfo *info); 197be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffer(BufferInfo *info); 198be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 199be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void drainInputBuffers(); 200be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffers(); 201be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 202404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // Returns true iff a flush was initiated and a completion event is 203404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // upcoming, false otherwise (A flush was not necessary as we own all 204404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // the buffers on that port). 205404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // This method will ONLY ever return false for a component with quirk 206404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // "kRequiresFlushCompleteEmulation". 207404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber bool flushPortAsync(OMX_U32 portIndex); 208404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber 209be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void disablePortAsync(OMX_U32 portIndex); 210be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void enablePortAsync(OMX_U32 portIndex); 211be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 212be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber static size_t countBuffersWeOwn(const Vector<BufferInfo> &buffers); 213be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber static bool isIntermediateState(State state); 214be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 215be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 216be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data); 217be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onStateChange(OMX_STATETYPE newState); 218be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onPortSettingsChanged(OMX_U32 portIndex); 219be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 220be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setState(State newState); 221be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 222be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t init(); 223be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void initOutputFormat(const sp<MetaData> &inputFormat); 224be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 225be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void dumpPortStatus(OMX_U32 portIndex); 226be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 2272a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber status_t configureCodec(const sp<MetaData> &meta); 2282a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber 229e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber static uint32_t getComponentQuirks(const char *componentName); 230e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber 231e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber static void findMatchingCodecs( 232e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber const char *mime, 233e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber bool createEncoder, const char *matchComponentName, 234e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber uint32_t flags, 235e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber Vector<String8> *matchingCodecs); 236e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber 237be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMXCodec(const OMXCodec &); 238be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMXCodec &operator=(const OMXCodec &); 239be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber}; 240be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 241e6c409632f773e41f33188272a0072be9fcb783fAndreas Huberstruct CodecProfileLevel { 242e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber OMX_U32 mProfile; 243e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber OMX_U32 mLevel; 244e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber}; 245e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 246e6c409632f773e41f33188272a0072be9fcb783fAndreas Huberstruct CodecCapabilities { 247e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber String8 mComponentName; 248e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber Vector<CodecProfileLevel> mProfileLevels; 249e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber}; 250e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 251e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// Return a vector of componentNames with supported profile/level pairs 252e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// supporting the given mime type, if queryDecoders==true, returns components 253e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// that decode content of the given type, otherwise returns components 254e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// that encode content of the given type. 255e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// profile and level indications only make sense for h.263, mpeg4 and avc 256e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// video. 257e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// The profile/level values correspond to 258e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// OMX_VIDEO_H263PROFILETYPE, OMX_VIDEO_MPEG4PROFILETYPE, 259e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263LEVELTYPE, OMX_VIDEO_MPEG4LEVELTYPE 260e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// and OMX_VIDEO_AVCLEVELTYPE respectively. 261e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 262e6c409632f773e41f33188272a0072be9fcb783fAndreas Huberstatus_t QueryCodecs( 263e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<IOMX> &omx, 264e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const char *mimeType, bool queryDecoders, 265e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber Vector<CodecCapabilities> *results); 266e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 267be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber} // namespace android 268be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 269be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#endif // OMX_CODEC_H_ 270