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 2158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis#include <android/native_window.h> 22be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/IOMX.h> 23be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/stagefright/MediaBuffer.h> 24be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <media/stagefright/MediaSource.h> 25be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#include <utils/threads.h> 26be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 27be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Hubernamespace android { 28be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 29be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberclass MemoryDealer; 30be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberstruct OMXCodecObserver; 3181c929a684aefd7e18e04bcfd54407235b89a37dJames Dongstruct CodecProfileLevel; 32be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 33be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberstruct OMXCodec : public MediaSource, 34be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber public MediaBufferObserver { 35e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber enum CreationFlags { 364c19bf9833f59f58a9aaea566f0eb98a7fb7e2eaAndreas Huber kPreferSoftwareCodecs = 1, 375a40e394f1e6b0511542e171eaf4c3e5927efc13Andreas Huber kIgnoreCodecSpecificData = 2, 385a40e394f1e6b0511542e171eaf4c3e5927efc13Andreas Huber 395a40e394f1e6b0511542e171eaf4c3e5927efc13Andreas Huber // The client wants to access the output buffer's video 405a40e394f1e6b0511542e171eaf4c3e5927efc13Andreas Huber // data for example for thumbnail extraction. 415a40e394f1e6b0511542e171eaf4c3e5927efc13Andreas Huber kClientNeedsFramebuffer = 4, 42170a929648b9f5c6efbf6dcbec4f1bc73593cbdeJames Dong 43170a929648b9f5c6efbf6dcbec4f1bc73593cbdeJames Dong // Request for software or hardware codecs. If request 44170a929648b9f5c6efbf6dcbec4f1bc73593cbdeJames Dong // can not be fullfilled, Create() returns NULL. 45170a929648b9f5c6efbf6dcbec4f1bc73593cbdeJames Dong kSoftwareCodecsOnly = 8, 46170a929648b9f5c6efbf6dcbec4f1bc73593cbdeJames Dong kHardwareCodecsOnly = 16, 4705c2fd50d2030e20d6a4cacc6931e453cd2de5c4James Dong 4805c2fd50d2030e20d6a4cacc6931e453cd2de5c4James Dong // Store meta data in video buffers 4905c2fd50d2030e20d6a4cacc6931e453cd2de5c4James Dong kStoreMetaDataInVideoBuffers = 32, 505f3ab06e90365ad6c4865e2cab358a20e12ce0ebJames Dong 515f3ab06e90365ad6c4865e2cab358a20e12ce0ebJames Dong // Only submit one input buffer at one time. 525f3ab06e90365ad6c4865e2cab358a20e12ce0ebJames Dong kOnlySubmitOneInputBufferAtOneTime = 64, 53b8763f60b488ea4e233c9ebed8208599edb36da3Glenn Kasten 54b8763f60b488ea4e233c9ebed8208599edb36da3Glenn Kasten // Enable GRALLOC_USAGE_PROTECTED for output buffers from native window 55b8763f60b488ea4e233c9ebed8208599edb36da3Glenn Kasten kEnableGrallocUsageProtected = 128, 5642fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber 5742fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber // Secure decoding mode 5842fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber kUseSecureInputBuffers = 256, 59e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber }; 6091eb0354043842d96bf3ef201ce68046db70df74Andreas Huber static sp<MediaSource> Create( 61be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<IOMX> &omx, 62be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<MetaData> &meta, bool createEncoder, 63e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<MediaSource> &source, 64e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber const char *matchComponentName = NULL, 6558a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis uint32_t flags = 0, 6658a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis const sp<ANativeWindow> &nativeWindow = NULL); 67e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 68e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber static void setComponentRole( 69e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<IOMX> &omx, IOMX::node_id node, bool isEncoder, 70e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const char *mime); 71be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 72be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t start(MetaData *params = NULL); 73be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t stop(); 74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual sp<MetaData> getFormat(); 76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 77be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual status_t read( 78be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL); 79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 801f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber virtual status_t pause(); 811f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber 82be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber // from MediaBufferObserver 83be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual void signalBufferReturned(MediaBuffer *buffer); 84be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 85e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber // for use by ACodec 86e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber static void findMatchingCodecs( 87e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber const char *mime, 88e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber bool createEncoder, const char *matchComponentName, 89e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber uint32_t flags, 90e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber Vector<String8> *matchingCodecs); 91e366f52b1520f13306d5fef1c3c8a2b2c653d935Andreas Huber 92be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprotected: 93be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual ~OMXCodec(); 94be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 95be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprivate: 96681e89c08264af948735d00552c4bd08180b06b4James Dong 97681e89c08264af948735d00552c4bd08180b06b4James Dong // Make sure mLock is accessible to OMXCodecObserver 98681e89c08264af948735d00552c4bd08180b06b4James Dong friend class OMXCodecObserver; 99681e89c08264af948735d00552c4bd08180b06b4James Dong 100681e89c08264af948735d00552c4bd08180b06b4James Dong // Call this with mLock hold 101681e89c08264af948735d00552c4bd08180b06b4James Dong void on_message(const omx_message &msg); 102681e89c08264af948735d00552c4bd08180b06b4James Dong 103be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum State { 104be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DEAD, 105be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber LOADED, 106be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber LOADED_TO_IDLE, 107be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IDLE_TO_EXECUTING, 108be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber EXECUTING, 109be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber EXECUTING_TO_IDLE, 110be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IDLE_TO_LOADED, 111be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber RECONFIGURING, 112be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ERROR 113be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 114be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 115be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum { 116be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber kPortIndexInput = 0, 117be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber kPortIndexOutput = 1 118be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 119be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 120be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum PortStatus { 121be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ENABLED, 122be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DISABLING, 123be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber DISABLED, 124be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber ENABLING, 125be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber SHUTTING_DOWN, 126be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 127be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 128be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber enum Quirks { 129a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kNeedsFlushBeforeDisable = 1, 130a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kWantsNALFragments = 2, 131a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresLoadedToIdleAfterAllocation = 4, 132a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresAllocateBufferOnInputPorts = 8, 133a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresFlushCompleteEmulation = 16, 134a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresAllocateBufferOnOutputPorts = 32, 135a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kRequiresFlushBeforeShutdown = 64, 136a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kDefersOutputBufferAllocation = 128, 137a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kDecoderLiesAboutNumberOfChannels = 256, 138a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kInputBufferSizesAreBogus = 512, 139a4357addf609c4a88867c93db135d531b2c40352Andreas Huber kSupportsMultipleFramesPerInputBuffer = 1024, 1404f501f0f2b71b69cadbdb96c71e83a06751e7f0eJames Dong kAvoidMemcopyInputRecordingFrames = 2048, 14190862e2a8b3ea522cf1dace5e93dcec109a1aa85James Dong kRequiresLargerEncoderOutputBuffer = 4096, 1421e1941638398e5e3e1d7b9ad88e66f574576bcfaAndreas Huber kOutputBuffersAreUnreadable = 8192, 143be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 144be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 145bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber enum BufferStatus { 146bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber OWNED_BY_US, 147bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber OWNED_BY_COMPONENT, 148bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber OWNED_BY_NATIVE_WINDOW, 149bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber OWNED_BY_CLIENT, 150bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber }; 151bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber 152be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber struct BufferInfo { 153be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::buffer_id mBuffer; 154bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber BufferStatus mStatus; 155be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<IMemory> mMem; 156c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber size_t mSize; 157c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber void *mData; 158be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber MediaBuffer *mMediaBuffer; 159be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 160be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 161be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber struct CodecSpecificData { 162be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber size_t mSize; 163be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber uint8_t mData[1]; 164be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber }; 165be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 166be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<IOMX> mOMX; 167f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber bool mOMXLivesLocally; 168be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber IOMX::node_id mNode; 169be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber uint32_t mQuirks; 17042fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber 17142fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber // Flags specified in the creation of the codec. 17242fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber uint32_t mFlags; 17342fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber 174be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mIsEncoder; 175be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber char *mMIME; 176be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber char *mComponentName; 177be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<MetaData> mOutputFormat; 178be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<MediaSource> mSource; 179be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Vector<CodecSpecificData *> mCodecSpecificData; 180be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber size_t mCodecSpecificDataIndex; 181be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 1825c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber sp<MemoryDealer> mDealer[2]; 183be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 184be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber State mState; 185be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Vector<BufferInfo> mPortBuffers[2]; 186be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber PortStatus mPortStatus[2]; 18742978e55fe438ecdc1b0bac5bf31c2aadbd9e78dAndreas Huber bool mInitialBufferSubmit; 188be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mSignalledEOS; 189d7d22eba3c1bb7212ccc566fedb16dbee44f51a2Andreas Huber status_t mFinalStatus; 190be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool mNoMoreOutputData; 191cfd55579c2e20514b181809dfaf30bd6f7e04c7eAndreas Huber bool mOutputPortSettingsHaveChanged; 192be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber int64_t mSeekTimeUs; 1936624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber ReadOptions::SeekMode mSeekMode; 1946624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber int64_t mTargetTimeUs; 195b9289833341ec19e016891d0ca9638f0973b9647Andreas Huber bool mOutputPortSettingsChangedPending; 196be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 197a4357addf609c4a88867c93db135d531b2c40352Andreas Huber MediaBuffer *mLeftOverBuffer; 198a4357addf609c4a88867c93db135d531b2c40352Andreas Huber 199be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Mutex mLock; 200be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Condition mAsyncCompletion; 201be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 2021f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber bool mPaused; 2031f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber 20458a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis sp<ANativeWindow> mNativeWindow; 20558a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 20658a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis // The index in each of the mPortBuffers arrays of the buffer that will be 20758a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis // submitted to OMX next. This only applies when using buffers from a 20858a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis // native window. 20958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis size_t mNextNativeBufferIndex[2]; 21058a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 211be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber // A list of indices into mPortStatus[kPortIndexOutput] filled with data. 212be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber List<size_t> mFilledBuffers; 213be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber Condition mBufferFilled; 214be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 2154108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong // Used to record the decoding time for an output picture from 2164108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong // a video encoder. 2174108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong List<int64_t> mDecodingTimeList; 2184108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong 21942fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, 22042fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber uint32_t quirks, uint32_t flags, 221be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber bool isEncoder, const char *mime, const char *componentName, 22258a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis const sp<MediaSource> &source, 22358a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis const sp<ANativeWindow> &nativeWindow); 224be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 225be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void addCodecSpecificData(const void *data, size_t size); 226be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void clearCodecSpecificData(); 227be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 2284c48342572503c7a92e5634ef8db3f1f9e541256Andreas Huber void setComponentRole(); 2294c48342572503c7a92e5634ef8db3f1f9e541256Andreas Huber 23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong void setAMRFormat(bool isWAMR, int32_t bitRate); 2319a6ed36ba55a206934937cfafca7e797e8c6ea00Gilles-Arnaud Bleu-Laine status_t setAACFormat(int32_t numChannels, int32_t sampleRate, int32_t bitRate); 2324b3913a3e43d3180b21d77cc2f717b446350354fAndreas Huber void setG711Format(int32_t numChannels); 233be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 234be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t setVideoPortFormatType( 235be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_U32 portIndex, 236be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 237be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_COLOR_FORMATTYPE colorFormat); 238be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 239be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setVideoInputFormat( 2401244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong const char *mime, const sp<MetaData>& meta); 241be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 242c0ab2a64589b4cd49734a122b6ef976c7ef530e5James Dong status_t setupBitRate(int32_t bitRate); 243c0ab2a64589b4cd49734a122b6ef976c7ef530e5James Dong status_t setupErrorCorrectionParameters(); 244c0ab2a64589b4cd49734a122b6ef976c7ef530e5James Dong status_t setupH263EncoderParameters(const sp<MetaData>& meta); 2451244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong status_t setupMPEG4EncoderParameters(const sp<MetaData>& meta); 2461244eab2cea41df1db4eeb930fddbb9e67ff7691James Dong status_t setupAVCEncoderParameters(const sp<MetaData>& meta); 247afd97e82cf28d72048c44f78c211a3e9ac6e11e5James Dong status_t findTargetColorFormat( 248afd97e82cf28d72048c44f78c211a3e9ac6e11e5James Dong const sp<MetaData>& meta, OMX_COLOR_FORMATTYPE *colorFormat); 249afd97e82cf28d72048c44f78c211a3e9ac6e11e5James Dong 250afd97e82cf28d72048c44f78c211a3e9ac6e11e5James Dong status_t isColorFormatSupported( 251afd97e82cf28d72048c44f78c211a3e9ac6e11e5James Dong OMX_COLOR_FORMATTYPE colorFormat, int portIndex); 252b482ce8837a2d85a2a907d7ea89deaa6610a8333Andreas Huber 25381c929a684aefd7e18e04bcfd54407235b89a37dJames Dong // If profile/level is set in the meta data, its value in the meta 25481c929a684aefd7e18e04bcfd54407235b89a37dJames Dong // data will be used; otherwise, the default value will be used. 25581c929a684aefd7e18e04bcfd54407235b89a37dJames Dong status_t getVideoProfileLevel(const sp<MetaData>& meta, 25681c929a684aefd7e18e04bcfd54407235b89a37dJames Dong const CodecProfileLevel& defaultProfileLevel, 25781c929a684aefd7e18e04bcfd54407235b89a37dJames Dong CodecProfileLevel& profileLevel); 25881c929a684aefd7e18e04bcfd54407235b89a37dJames Dong 2592a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber status_t setVideoOutputFormat( 260be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const char *mime, OMX_U32 width, OMX_U32 height); 261be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 262be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setImageOutputFormat( 263be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height); 264be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 2655c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber void setJPEGInputFormat( 2665c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize); 2675c0a9133d2e8049f8952a190df91febf6b92064cAndreas Huber 268da050cf206afff082f2a3693a8103a5df67df397Andreas Huber void setMinBufferSize(OMX_U32 portIndex, OMX_U32 size); 269da050cf206afff082f2a3693a8103a5df67df397Andreas Huber 270da050cf206afff082f2a3693a8103a5df67df397Andreas Huber void setRawAudioFormat( 271da050cf206afff082f2a3693a8103a5df67df397Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels); 272da050cf206afff082f2a3693a8103a5df67df397Andreas Huber 273be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t allocateBuffers(); 274be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t allocateBuffersOnPort(OMX_U32 portIndex); 27558a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis status_t allocateOutputBuffersFromNativeWindow(); 27658a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis 27758a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis status_t queueBufferToNativeWindow(BufferInfo *info); 27858a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis status_t cancelBufferToNativeWindow(BufferInfo *info); 27958a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis BufferInfo* dequeueBufferFromNativeWindow(); 280c0e4293794e9658da1ce9849a42c66ce19ef5f07Jamie Gennis status_t pushBlankBuffersToNativeWindow(); 281be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 282be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t freeBuffersOnPort( 283be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMX_U32 portIndex, bool onlyThoseWeOwn = false); 284be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 285f0c5c1e8ce765c66d24bc9d00904fd350b99d16aJamie Gennis status_t freeBuffer(OMX_U32 portIndex, size_t bufIndex); 286f0c5c1e8ce765c66d24bc9d00904fd350b99d16aJamie Gennis 287bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber bool drainInputBuffer(IOMX::buffer_id buffer); 288be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffer(IOMX::buffer_id buffer); 289bbbcf65532c905b71f5c731551b15e9bd2fc26e0Andreas Huber bool drainInputBuffer(BufferInfo *info); 290be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffer(BufferInfo *info); 291be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 292be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void drainInputBuffers(); 293be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void fillOutputBuffers(); 294be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 29542fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber bool drainAnyInputBuffer(); 29642fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber BufferInfo *findInputBufferByDataPointer(void *ptr); 29742fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber BufferInfo *findEmptyInputBuffer(); 29842fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber 299404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // Returns true iff a flush was initiated and a completion event is 300404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // upcoming, false otherwise (A flush was not necessary as we own all 301404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // the buffers on that port). 302404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // This method will ONLY ever return false for a component with quirk 303404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber // "kRequiresFlushCompleteEmulation". 304404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber bool flushPortAsync(OMX_U32 portIndex); 305404cc418be3eeaef93729fab51a0124ed65e1adcAndreas Huber 306be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void disablePortAsync(OMX_U32 portIndex); 3070209da1cb177888af6c58e9bcc13c5d9665d6354James Dong status_t enablePortAsync(OMX_U32 portIndex); 308be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 309be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber static size_t countBuffersWeOwn(const Vector<BufferInfo> &buffers); 310be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber static bool isIntermediateState(State state); 311be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 312be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 313be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data); 314be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onStateChange(OMX_STATETYPE newState); 315be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void onPortSettingsChanged(OMX_U32 portIndex); 316be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 317be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void setState(State newState); 318be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 319be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber status_t init(); 320be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void initOutputFormat(const sp<MetaData> &inputFormat); 32158a36adac1bb3294cd9f2d516d52c6358987687aJamie Gennis status_t initNativeWindow(); 322be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 323db62a245f968159ea5ff8ad99afb4cd035e2304dLakshman Gowda void initNativeWindowCrop(); 324db62a245f968159ea5ff8ad99afb4cd035e2304dLakshman Gowda 325be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber void dumpPortStatus(OMX_U32 portIndex); 326be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 32742fb5d64b9a4f4be5163c67374cca5eaa7226791Andreas Huber status_t configureCodec(const sp<MetaData> &meta); 3282a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber 3291e1941638398e5e3e1d7b9ad88e66f574576bcfaAndreas Huber static uint32_t getComponentQuirks( 3301e1941638398e5e3e1d7b9ad88e66f574576bcfaAndreas Huber const char *componentName, bool isEncoder); 331e13526ad926bfee99778a4f21ea5e4f8a6c8984fAndreas Huber 33231b9375f45e19c1408f45af497286b795604c9ecJames Dong void restorePatchedDataPointer(BufferInfo *info); 33331b9375f45e19c1408f45af497286b795604c9ecJames Dong 3345e9dc94a3c7a42d77ab454b77e1350b6fa5d2c26Andreas Huber status_t applyRotation(); 335d9ac621f590c51bdc38b46d5aabba2dbc84cbd58James Dong status_t waitForBufferFilled_l(); 3365e9dc94a3c7a42d77ab454b77e1350b6fa5d2c26Andreas Huber 3374108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong int64_t retrieveDecodingTimeUs(bool isCodecSpecific); 3384108b1edc61ef91c63bc94a699f9a95e65c3e684James Dong 3390ba8660ea6d88a1809508c31bd3b1da8e8dfabd3Andreas Huber status_t parseAVCCodecSpecificData( 3400ba8660ea6d88a1809508c31bd3b1da8e8dfabd3Andreas Huber const void *data, size_t size, 3410ba8660ea6d88a1809508c31bd3b1da8e8dfabd3Andreas Huber unsigned *profile, unsigned *level); 3420ba8660ea6d88a1809508c31bd3b1da8e8dfabd3Andreas Huber 343be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMXCodec(const OMXCodec &); 344be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber OMXCodec &operator=(const OMXCodec &); 345be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber}; 346be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 347e6c409632f773e41f33188272a0072be9fcb783fAndreas Huberstruct CodecCapabilities { 348e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber String8 mComponentName; 349e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber Vector<CodecProfileLevel> mProfileLevels; 350d781089731127bd9199d47f53b170895868b8750James Dong Vector<OMX_U32> mColorFormats; 351e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber}; 352e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 353e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// Return a vector of componentNames with supported profile/level pairs 354e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// supporting the given mime type, if queryDecoders==true, returns components 355e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// that decode content of the given type, otherwise returns components 356e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// that encode content of the given type. 357e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// profile and level indications only make sense for h.263, mpeg4 and avc 358e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// video. 359a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi// If hwCodecOnly==true, only returns hardware-based components, software and 360a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi// hardware otherwise. 361e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// The profile/level values correspond to 362e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// OMX_VIDEO_H263PROFILETYPE, OMX_VIDEO_MPEG4PROFILETYPE, 363e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263LEVELTYPE, OMX_VIDEO_MPEG4LEVELTYPE 364e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber// and OMX_VIDEO_AVCLEVELTYPE respectively. 365e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 366e6c409632f773e41f33188272a0072be9fcb783fAndreas Huberstatus_t QueryCodecs( 367e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber const sp<IOMX> &omx, 36856a37b052912d09c310f43ab1215ccc93f2dbda5Jean-Michel Trivi const char *mimeType, bool queryDecoders, bool hwCodecOnly, 369e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber Vector<CodecCapabilities> *results); 370e6c409632f773e41f33188272a0072be9fcb783fAndreas Huber 371a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivistatus_t QueryCodecs( 372a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi const sp<IOMX> &omx, 373a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi const char *mimeType, bool queryDecoders, 374a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi Vector<CodecCapabilities> *results); 375a05f099301ca9d5efd4db549295401ee00b439a0Jean-Michel Trivi 376be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber} // namespace android 377be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 378be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber#endif // OMX_CODEC_H_ 379