1318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber/*
2318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
4318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * you may not use this file except in compliance with the License.
6318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * You may obtain a copy of the License at
7318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
8318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
10318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Unless required by applicable law or agreed to in writing, software
11318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * See the License for the specific language governing permissions and
14318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * limitations under the License.
15318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber */
16318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
17318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#ifndef OMX_NODE_INSTANCE_H_
18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define OMX_NODE_INSTANCE_H_
20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
213e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim#include <atomic>
223e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim
23d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa#include <media/IOMX.h>
24318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/RefBase.h>
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/threads.h>
26d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa#include <utils/KeyedVector.h>
27d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa#include <utils/SortedVector.h>
28d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa#include "OmxNodeOwner.h"
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
30f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <android/hidl/memory/1.0/IMemory.h>
31f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
33bc1713d3b85d7ce656e032da6e4b6b342f14db03Mathias Agopianclass GraphicBuffer;
346d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangclass IOMXBufferSource;
35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberclass IOMXObserver;
36f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstruct OMXMaster;
373fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangclass OMXBuffer;
38f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasatypedef hidl::memory::V1_0::IMemory IHidlMemory;
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
40d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstruct OMXNodeInstance : public BnOMXNode {
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance(
42d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            OmxNodeOwner *owner, const sp<IOMXObserver> &observer, const char *name);
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
44d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    void setHandle(OMX_HANDLETYPE handle);
45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
46d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    OMX_HANDLETYPE handle();
47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IOMXObserver> observer();
48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
49d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    status_t freeNode() override;
50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param);
52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size);
53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t setParameter(
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_INDEXTYPE index, const void *params, size_t size);
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size);
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size);
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
60d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t setPortMode(OMX_U32 port_index, IOMX::PortMode mode);
61e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
62e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    status_t getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage);
63e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
6456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    status_t prepareForAdaptivePlayback(
6556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 portIndex, OMX_BOOL enable,
6656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight);
6756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    status_t configureVideoTunnelMode(
695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 portIndex, OMX_BOOL tunneled,
705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle);
715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
728f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    status_t setInputSurface(
73addf2cbb120346ae42e78fa739245a353db5edadChong Zhang            const sp<IOMXBufferSource> &bufferSource);
74d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
75a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    status_t allocateSecureBuffer(
76d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            OMX_U32 portIndex, size_t size, IOMX::buffer_id *buffer,
771b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar            void **buffer_data, sp<NativeHandle> *native_handle);
78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
793fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t useBuffer(
803fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, const OMXBuffer &omxBuf, buffer_id *buffer);
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
823fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t freeBuffer(
833fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, buffer_id buffer);
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t fillBuffer(
863fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd = -1);
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
883fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t emptyBuffer(
893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            buffer_id buffer, const OMXBuffer &omxBuf,
903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1);
917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    status_t getExtensionIndex(
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *parameterName, OMX_INDEXTYPE *index);
94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
9521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang    status_t setQuirks(OMX_U32 quirks);
9621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang
978dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    bool isSecure() const {
988dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia        return mIsSecure;
998dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    }
1008dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia
101d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    status_t dispatchMessage(const omx_message &msg) override;
102d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang
10326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // handles messages and removes them from the list
10426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    void onMessages(std::list<omx_message> &messages);
105d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    void onObserverDied();
1067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    void onEvent(OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2);
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    static OMX_CALLBACKTYPE kCallbacks;
109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
111d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    struct CallbackDispatcherThread;
112d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    struct CallbackDispatcher;
113d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex mLock;
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
116d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    OmxNodeOwner *mOwner;
117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_HANDLETYPE mHandle;
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IOMXObserver> mObserver;
119d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    sp<CallbackDispatcher> mDispatcher;
1203e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim    std::atomic_bool mDying;
121d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool mSailed;  // configuration is set (no more meta-mode changes)
122d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool mQueriedProhibitedExtensions;
123d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    SortedVector<OMX_INDEXTYPE> mProhibitedExtensions;
1248dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    bool mIsSecure;
12521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang    uint32_t mQuirks;
126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1276d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // Lock only covers mOMXBufferSource and mOMXOutputListener.  We can't always
1286d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // use mLock because of rare instances where we'd end up locking it recursively.
1296d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    Mutex mOMXBufferSourceLock;
1306d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // Access these through getBufferSource().
1316d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<IOMXBufferSource> mOMXBufferSource;
1327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
133d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    struct ActiveBuffer {
134d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 mPortIndex;
135d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa        IOMX::buffer_id mID;
136d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    };
137d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    Vector<ActiveBuffer> mActiveBuffers;
1382d6b6601743c3c6960c6511a2cb774ef902759f4Andy Hung    // for buffer ptr to buffer id translation
139609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex mBufferIDLock;
140609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    uint32_t mBufferIDCount;
141d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    KeyedVector<IOMX::buffer_id, OMX_BUFFERHEADERTYPE *> mBufferIDToBufferHeader;
142d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    KeyedVector<OMX_BUFFERHEADERTYPE *, IOMX::buffer_id> mBufferHeaderToBufferID;
143a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar
144d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    bool mLegacyAdaptiveExperiment;
145d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    IOMX::PortMode mPortMode[2];
146a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // metadata and secure buffer type tracking
147054219874873b41f1c815552987c10465c34ba2bLajos Molnar    MetadataBufferType mMetadataType[2];
148a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    enum SecureBufferType {
149a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        kSecureBufferTypeUnknown,
150a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        kSecureBufferTypeOpaque,
151a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar        kSecureBufferTypeNativeHandle,
152a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    };
153a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    SecureBufferType mSecureBufferType[2];
154d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1553604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    // Following are OMX parameters managed by us (instead of the component)
1563604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    // OMX_IndexParamMaxFrameDurationForBitrateControl
1576d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    KeyedVector<int64_t, int64_t> mOriginalTimeUs;
1586d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    bool mRestorePtsFailed;
1593604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    int64_t mMaxTimestampGapUs;
1603604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    int64_t mPrevOriginalTimeUs;
1613604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    int64_t mPrevModifiedTimeUs;
1626d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang
163f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // For debug support
164f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    char *mName;
165f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    int DEBUG;
166f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    size_t mNumPortBuffers[2];  // modified under mLock, read outside for debug
167f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    Mutex mDebugLock;
168f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    // following are modified and read under mDebugLock
169f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    int DEBUG_BUMP;
170f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    SortedVector<OMX_BUFFERHEADERTYPE *> mInputBuffersWithCodec, mOutputBuffersWithCodec;
171f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    size_t mDebugLevelBumpPendingBuffers[2];
172f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    void bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers);
173f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar    void unbumpDebugLevel_l(size_t portIndex);
174f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar
175318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    ~OMXNodeInstance();
176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
177d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    void addActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id);
178d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    void removeActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id);
179d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    void freeActiveBuffers();
180609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
181609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    // For buffer id management
182d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    IOMX::buffer_id makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
183d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    OMX_BUFFERHEADERTYPE *findBufferHeader(IOMX::buffer_id buffer, OMX_U32 portIndex);
184d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    IOMX::buffer_id findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader);
185d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa    void invalidateBufferID(IOMX::buffer_id buffer);
186609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
187d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar    bool isProhibitedIndex_l(OMX_INDEXTYPE index);
188d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar
1893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t useBuffer_l(
1903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, const sp<IMemory> &params,
191f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            const sp<IHidlMemory> &hParams, IOMX::buffer_id *buffer);
1923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
193d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t useGraphicBuffer_l(
1943fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
195d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id *buffer);
1963fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
1973fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t useGraphicBufferWithMetadata_l(
1983fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
199d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id *buffer);
2003fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
201c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    status_t useGraphicBuffer2_l(
202c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
203d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id *buffer);
2043fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
205d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t emptyBuffer_l(
206d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id buffer,
2073fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 rangeOffset, OMX_U32 rangeLength,
2083fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);
2093fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
210d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t emptyGraphicBuffer_l(
211d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer,
2123fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);
2133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
214d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t emptyNativeHandleBuffer_l(
215d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle,
2163fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);
2173fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
2183fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t emptyBuffer_l(
2193fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_BUFFERHEADERTYPE *header,
2203fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 flags, OMX_TICKS timestamp, intptr_t debugAddr, int fenceFd);
2213fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    static OMX_ERRORTYPE OnEvent(
223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_HANDLETYPE hComponent,
224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_PTR pAppData,
225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_EVENTTYPE eEvent,
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_U32 nData1,
227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_U32 nData2,
228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_PTR pEventData);
229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    static OMX_ERRORTYPE OnEmptyBufferDone(
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_HANDLETYPE hComponent,
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_PTR pAppData,
233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    static OMX_ERRORTYPE OnFillBufferDone(
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_HANDLETYPE hComponent,
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_PTR pAppData,
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
240d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    status_t enableNativeBuffers_l(
241d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang            OMX_U32 portIndex, OMX_BOOL graphic, OMX_BOOL enable);
242d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang
243512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar    status_t storeMetaDataInBuffers_l(
244054219874873b41f1c815552987c10465c34ba2bLajos Molnar            OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type);
2457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
24615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Stores fence into buffer if it is ANWBuffer type and has enough space.
24715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // otherwise, waits for the fence to signal.  Takes ownership of |fenceFd|.
24815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    status_t storeFenceInMeta_l(
24915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex);
25015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
25115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Retrieves the fence from buffer if ANWBuffer type and has enough space. Otherwise, returns -1
25215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int retrieveFenceFromMeta_l(
25315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex);
25415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
255e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // Updates the graphic buffer handle in the metadata buffer for |buffer| and |header| to
256e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // |graphicBuffer|'s handle. If |updateCodecBuffer| is true, the update will happen in
257e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // the actual codec buffer (use this if not using emptyBuffer (with no _l) later to
258e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // pass the buffer to the codec, as only emptyBuffer copies the backup buffer to the codec
259e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar    // buffer.)
260054219874873b41f1c815552987c10465c34ba2bLajos Molnar    status_t updateGraphicBufferInMeta_l(
261054219874873b41f1c815552987c10465c34ba2bLajos Molnar            OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer,
262d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);
263054219874873b41f1c815552987c10465c34ba2bLajos Molnar
2643fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang    status_t updateNativeHandleInMeta_l(
2653fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang            OMX_U32 portIndex, const sp<NativeHandle> &nativeHandle,
266d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa            IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header);
2673fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang
2686d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    sp<IOMXBufferSource> getBufferSource();
2696d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    void setBufferSource(const sp<IOMXBufferSource> &bufferSource);
2706d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // Called when omx_message::FILL_BUFFER_DONE is received. (Currently the
2716d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    // buffer source will fix timestamp in the header if needed.)
2726d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang    void codecBufferFilled(omx_message &msg);
2737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
27426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // Handles |msg|, and may modify it. Returns true iff completely handled it and
27526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // |msg| does not need to be sent to the event listener.
27626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    bool handleMessage(omx_message &msg);
27726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar
2786cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang    bool handleDataSpaceChanged(omx_message &msg);
2796cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang
2803604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    status_t setMaxPtsGapUs(const void *params, size_t size);
2813604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang    int64_t getCodecTimestamp(OMX_TICKS timestamp);
2823604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang
283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance(const OMXNodeInstance &);
284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance &operator=(const OMXNodeInstance &);
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#endif  // OMX_NODE_INSTANCE_H_
290