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