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;
401b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnarclass NativeHandle;
41f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface;
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface {
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMX);
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
47609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    typedef uint32_t buffer_id;
48609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    typedef uint32_t node_id;
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
50d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    // Given a node_id and the calling process' pid, returns true iff
517eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // the implementation of the OMX interface lives in the same
527eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // process.
53d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) = 0;
547eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
55134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct ComponentInfo {
56134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        String8 mName;
57134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        List<String8> mRoles;
58134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
59134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer,
6323858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen            sp<IBinder> *nodeBinder,
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id *node) = 0;
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) = 0;
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) = 0;
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) = 0;
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
81693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) = 0;
82693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
84693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) = 0;
86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
87b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
88b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) = 0;
89b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
90054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to previous metadata buffer type on OMX error (not on binder error), and
91054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // new metadata buffer type on success.
92e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
93054219874873b41f1c815552987c10465c34ba2bLajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type = NULL) = 0;
94e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
9556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    virtual status_t prepareForAdaptivePlayback(
9656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node_id node, OMX_U32 portIndex, OMX_BOOL enable,
9756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) = 0;
9856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
9915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    virtual status_t configureVideoTunnelMode(
1005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
1015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle) = 0;
1025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
103a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    virtual status_t enableNativeBuffers(
104a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) = 0;
10583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
106e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
107e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
108e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
109cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // Use |params| as an OMX buffer, but limit the size of the OMX buffer to |allottedSize|.
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
112cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize) = 0;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
11583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
11683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
11783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
118d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    virtual status_t updateGraphicBufferInMeta(
119d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node_id node, OMX_U32 port_index,
120d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0;
121d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
1227e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    virtual status_t updateNativeHandleInMeta(
1237e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            node_id node, OMX_U32 port_index,
1247e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            const sp<NativeHandle> &nativeHandle, buffer_id buffer) = 0;
1257e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
126054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to resulting metadata buffer type on OMX error (not on binder error) as
127054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // well as on success.
1287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
12957fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar            node_id node, OMX_U32 port_index, android_dataspace dataSpace,
130054219874873b41f1c815552987c10465c34ba2bLajos Molnar            sp<IGraphicBufferProducer> *bufferProducer,
131054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type = NULL) = 0;
1327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
133d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    virtual status_t createPersistentInputSurface(
134d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferProducer> *bufferProducer,
135d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferConsumer> *bufferConsumer) = 0;
136d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
137054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // This will set *type to resulting metadata buffer type on OMX error (not on binder error) as
138054219874873b41f1c815552987c10465c34ba2bLajos Molnar    // well as on success.
1398f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual status_t setInputSurface(
140d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            node_id node, OMX_U32 port_index,
141054219874873b41f1c815552987c10465c34ba2bLajos Molnar            const sp<IGraphicBufferConsumer> &bufferConsumer,
142054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type) = 0;
143d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node) = 0;
1457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
146a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // Allocate an opaque buffer as a native handle. If component supports returning native
147a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // handles, those are returned in *native_handle. Otherwise, the allocated buffer is
148a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // returned in *buffer_data. This clearly only makes sense if the caller lives in the
149a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // same process as the callee, i.e. is the media_server, as the returned "buffer_data"
150a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    // pointer is just that, a pointer into local address space.
151a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    virtual status_t allocateSecureBuffer(
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
1531b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar            buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) = 0;
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
155cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // Allocate an OMX buffer of size |allotedSize|. Use |params| as the backup buffer, which
156cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar    // may be larger.
157318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
159cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize) = 0;
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
161318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    enum {
16515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar        kFenceTimeoutMs = 1000
16615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    };
16715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Calls OMX_FillBuffer on buffer, and passes |fenceFd| to component if it supports
16815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // fences. Otherwise, it waits on |fenceFd| before calling OMX_FillBuffer.
16915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Takes ownership of |fenceFd| even if this call fails.
17015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    virtual status_t fillBuffer(node_id node, buffer_id buffer, int fenceFd = -1) = 0;
17115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar
17215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Calls OMX_EmptyBuffer on buffer (after updating buffer header with |range_offset|,
17315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // |range_length|, |flags| and |timestamp|). Passes |fenceFd| to component if it
17415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer.
17515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    // Takes ownership of |fenceFd| even if this call fails.
176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
18015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) = 0;
1818b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
183693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
184693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
185693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) = 0;
186e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
187e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    enum InternalOptionType {
188e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        INTERNAL_OPTION_SUSPEND,  // data is a bool
189a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber        INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY,  // data is an int64_t
19094ee4b708acfa941581160b267afb79192b1d816Chong Zhang        INTERNAL_OPTION_MAX_TIMESTAMP_GAP, // data is int64_t
19137b2b389139ed638831e49708c947863eef631efRonghua Wu        INTERNAL_OPTION_MAX_FPS, // data is float
19272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang        INTERNAL_OPTION_START_TIME, // data is an int64_t
1932c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang        INTERNAL_OPTION_TIME_LAPSE, // data is an int64_t[2]
194dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar        INTERNAL_OPTION_COLOR_ASPECTS, // data is ColorAspects
195e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    };
196e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    virtual status_t setInternalOption(
197e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            node_id node,
198e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            OMX_U32 port_index,
199e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            InternalOptionType type,
200e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const void *data,
201e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            size_t size) = 0;
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message {
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum {
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EVENT,
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EMPTY_BUFFER_DONE,
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        FILL_BUFFER_DONE,
20990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        FRAME_RENDERED,
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } type;
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
212693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    IOMX::node_id node;
21315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    int fenceFd; // used for EMPTY_BUFFER_DONE and FILL_BUFFER_DONE; client must close this
214693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    union {
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // if type == EVENT
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_EVENTTYPE event;
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data1;
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data2;
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } event_data;
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
223e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == EMPTY_BUFFER_DONE
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } buffer_data;
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
228e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == FILL_BUFFER_DONE
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset;
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length;
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags;
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp;
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } extended_buffer_data;
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        // if type == FRAME_RENDERED
23890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        struct {
23990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            OMX_TICKS timestamp;
24090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar            OMX_S64 nanoTime;
24190fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        } render_data;
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } u;
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface {
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    // Handle (list of) messages.
25026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar    virtual void onMessages(const std::list<omx_message> &messages) = 0;
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> {
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
2608dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia
2618dde7269a5356503d2b283234b6cb46d0c3f214eWei Jiaprotected:
2628dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    // check if the codec is secure.
2638dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    virtual bool isSecure(IOMX::node_id node) {
2648dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia        return false;
2658dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    }
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
275457116d3a01618acf9a875020ca5860551ba03a6James Dongstruct CodecProfileLevel {
276457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mProfile;
277457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mLevel;
278457116d3a01618acf9a875020ca5860551ba03a6James Dong};
279457116d3a01618acf9a875020ca5860551ba03a6James Dong
2803e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnarinline static const char *asString(MetadataBufferType i, const char *def = "??") {
281054219874873b41f1c815552987c10465c34ba2bLajos Molnar    using namespace android;
282054219874873b41f1c815552987c10465c34ba2bLajos Molnar    switch (i) {
283054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeCameraSource:   return "CameraSource";
284054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeGrallocSource:  return "GrallocSource";
285054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeANWBuffer:      return "ANWBuffer";
2863e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar        case kMetadataBufferTypeNativeHandleSource: return "NativeHandleSource";
287054219874873b41f1c815552987c10465c34ba2bLajos Molnar        case kMetadataBufferTypeInvalid:        return "Invalid";
288054219874873b41f1c815552987c10465c34ba2bLajos Molnar        default:                                return def;
289054219874873b41f1c815552987c10465c34ba2bLajos Molnar    }
290054219874873b41f1c815552987c10465c34ba2bLajos Molnar}
291054219874873b41f1c815552987c10465c34ba2bLajos Molnar
2923e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar}  // namespace android
2933e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_IOMX_H_
295