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