120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef ANDROID_IOMX_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define ANDROID_IOMX_H_
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IInterface.h>
227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <gui/IGraphicBufferProducer.h>
23d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#include <gui/IGraphicBufferConsumer.h>
2483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis#include <ui/GraphicBuffer.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar#include <list>
2926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar
30054219874873b41f1c815552987c10465c34ba2bLajos Molnar#include <media/hardware/MetadataBufferType.h>
31054219874873b41f1c815552987c10465c34ba2bLajos Molnar
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Core.h>
338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <OMX_Video.h>
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory;
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver;
398b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer;
40f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface;
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface {
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMX);
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    typedef uint32_t buffer_id;
47609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    typedef uint32_t node_id;
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    // Given a node_id and the calling process' pid, returns true iff
507eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // the implementation of the OMX interface lives in the same
517eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // process.
52d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) = 0;
537eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
54134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct ComponentInfo {
55134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        String8 mName;
56134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        List<String8> mRoles;
57134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
58134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer,
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id *node) = 0;
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) = 0;
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) = 0;
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) = 0;
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) = 0;
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
83693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) = 0;
84693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
85b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
86b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) = 0;
87b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
88054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to previous metadata buffer type on OMX error (not on binder error), and
89054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // new metadata buffer type on success.
90e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
91054219874873b41f1c815552987c10465c34ba2bLajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type = NULL) = 0;
92e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
9356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    virtual status_t prepareForAdaptivePlayback(
9456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node_id node, OMX_U32 portIndex, OMX_BOOL enable,
9556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) = 0;
9656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
9715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    virtual status_t configureVideoTunnelMode(
985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle) = 0;
1005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
10183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
10283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
10383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
104e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
105e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
106e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
107cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // Use |params| as an OMX buffer, but limit the size of the OMX buffer to |allottedSize|.
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
110cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize) = 0;
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
11383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
11483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
11583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
116d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    virtual status_t updateGraphicBufferInMeta(
117d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node_id node, OMX_U32 port_index,
118d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0;
119d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
120054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to resulting metadata buffer type on OMX error (not on binder error) as
121054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // well as on success.
1227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
1237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node_id node, OMX_U32 port_index,
124054219874873b41f1c815552987c10465c34ba2bLajos Molnar            sp<IGraphicBufferProducer> *bufferProducer,
125054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type = NULL) = 0;
1267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
127d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    virtual status_t createPersistentInputSurface(
128d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferProducer> *bufferProducer,
129d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferConsumer> *bufferConsumer) = 0;
130d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
131054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to resulting metadata buffer type on OMX error (not on binder error) as
132054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // well as on success.
1338f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual status_t setInputSurface(
134d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            node_id node, OMX_U32 port_index,
135054219874873b41f1c815552987c10465c34ba2bLajos Molnar            const sp<IGraphicBufferConsumer> &bufferConsumer,
136054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type) = 0;
137d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node) = 0;
1397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
140570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // This API clearly only makes sense if the caller lives in the
141570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // same process as the callee, i.e. is the media_server, as the
142570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // returned "buffer_data" pointer is just that, a pointer into local
143570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // address space.
144318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
146570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) = 0;
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
148cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // Allocate an OMX buffer of size |allotedSize|. Use |params| as the backup buffer, which
149cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // may be larger.
150318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
152cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize) = 0;
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
154318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    enum {
15815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        kFenceTimeoutMs = 1000
15915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    };
16015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Calls OMX_FillBuffer on buffer, and passes |fenceFd| to component if it supports
16115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // fences. Otherwise, it waits on |fenceFd| before calling OMX_FillBuffer.
16215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Takes ownership of |fenceFd| even if this call fails.
16315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    virtual status_t fillBuffer(node_id node, buffer_id buffer, int fenceFd = -1) = 0;
16415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
16515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Calls OMX_EmptyBuffer on buffer (after updating buffer header with |range_offset|,
16615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // |range_length|, |flags| and |timestamp|). Passes |fenceFd| to component if it
16715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer.
16815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Takes ownership of |fenceFd| even if this call fails.
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
17315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) = 0;
1748b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
175318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
176693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
177693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
178693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) = 0;
179e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
180e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    enum InternalOptionType {
181e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        INTERNAL_OPTION_SUSPEND,  // data is a bool
182a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber        INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY,  // data is an int64_t
18394ee4b708acfa941581160b267afb79192b1d816Chong Zhang        INTERNAL_OPTION_MAX_TIMESTAMP_GAP, // data is int64_t
18437b2b389139ed638831e49708c947863eef631efRonghua Wu        INTERNAL_OPTION_MAX_FPS, // data is float
18572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang        INTERNAL_OPTION_START_TIME, // data is an int64_t
1862c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang        INTERNAL_OPTION_TIME_LAPSE, // data is an int64_t[2]
187e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    };
188e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    virtual status_t setInternalOption(
189e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            node_id node,
190e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            OMX_U32 port_index,
191e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            InternalOptionType type,
192e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const void *data,
193e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            size_t size) = 0;
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message {
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum {
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EVENT,
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EMPTY_BUFFER_DONE,
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        FILL_BUFFER_DONE,
20190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        FRAME_RENDERED,
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } type;
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
204693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    IOMX::node_id node;
20515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int fenceFd; // used for EMPTY_BUFFER_DONE and FILL_BUFFER_DONE; client must close this
206693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    union {
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // if type == EVENT
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_EVENTTYPE event;
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data1;
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data2;
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } event_data;
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
215e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == EMPTY_BUFFER_DONE
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } buffer_data;
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
220e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == FILL_BUFFER_DONE
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset;
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length;
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags;
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp;
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } extended_buffer_data;
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        // if type == FRAME_RENDERED
23090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        struct {
23190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            OMX_TICKS timestamp;
23290fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            OMX_S64 nanoTime;
23390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        } render_data;
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } u;
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface {
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // Handle (list of) messages.
24226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    virtual void onMessages(const std::list<omx_message> &messages) = 0;
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> {
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
261457116d3a01618acf9a875020ca5860551ba03a6James Dongstruct CodecProfileLevel {
262457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mProfile;
263457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mLevel;
264457116d3a01618acf9a875020ca5860551ba03a6James Dong};
265457116d3a01618acf9a875020ca5860551ba03a6James Dong
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
268054219874873b41f1c815552987c10465c34ba2bLajos Molnarinline static const char *asString(android::MetadataBufferType i, const char *def = "??") {
269054219874873b41f1c815552987c10465c34ba2bLajos Molnar    using namespace android;
270054219874873b41f1c815552987c10465c34ba2bLajos Molnar    switch (i) {
271054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeCameraSource:   return "CameraSource";
272054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeGrallocSource:  return "GrallocSource";
273054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeANWBuffer:      return "ANWBuffer";
274054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeInvalid:        return "Invalid";
275054219874873b41f1c815552987c10465c34ba2bLajos Molnar        default:                                return def;
276054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
277054219874873b41f1c815552987c10465c34ba2bLajos Molnar}
278054219874873b41f1c815552987c10465c34ba2bLajos Molnar
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_IOMX_H_
280