IOMX.h revision 2ea14e231945afb6581fa8f54015b33bc74a19e5
1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/*
2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License.
6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at
7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and
14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License.
15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */
16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef ANDROID_IOMX_H_
18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define ANDROID_IOMX_H_
20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <binder/IInterface.h>
22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h>
23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String8.h>
24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Core.h>
261de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber#include <OMX_Video.h>
27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
289f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber#include "jni.h"
299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory;
33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver;
341de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer;
351de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass ISurface;
36ccf8b94169197875af6c89172015b9644919b064Andreas Huberclass Surface;
37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMX : public IInterface {
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMX);
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *buffer_id;
43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *node_id;
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
452ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    struct ComponentInfo {
462ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        String8 mName;
472ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        List<String8> mRoles;
482ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    };
492ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateNode(
52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            const char *name, const sp<IOMXObserver> &observer,
53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            node_id *node) = 0;
54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeNode(node_id node) = 0;
56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t sendCommand(
58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getParameter(
61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            void *params, size_t size) = 0;
63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setParameter(
65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            const void *params, size_t size) = 0;
67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getConfig(
69be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
70be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            void *params, size_t size) = 0;
71be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setConfig(
73be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const void *params, size_t size) = 0;
75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t useBuffer(
77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBuffer(
81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBufferWithBackup(
85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeBuffer(
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t emptyBuffer(
94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node,
95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id buffer,
96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
981de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getExtensionIndex(
100be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node,
101be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *parameter_name,
102be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_INDEXTYPE *index) = 0;
103be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
1041de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual sp<IOMXRenderer> createRenderer(
1051de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const sp<ISurface> &surface,
1061de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const char *componentName,
1071de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1081de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1091de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t displayWidth, size_t displayHeight) = 0;
110ccf8b94169197875af6c89172015b9644919b064Andreas Huber
1119f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
112ccf8b94169197875af6c89172015b9644919b064Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1139f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // of the ISurface from a regular Surface or a java Surface object.
114ccf8b94169197875af6c89172015b9644919b064Andreas Huber    sp<IOMXRenderer> createRenderer(
115ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const sp<Surface> &surface,
116ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const char *componentName,
117ccf8b94169197875af6c89172015b9644919b064Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
118ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t encodedWidth, size_t encodedHeight,
119ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t displayWidth, size_t displayHeight);
1209f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
1219f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1229f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            JNIEnv *env, jobject javaSurface,
1239f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            const char *componentName,
1249f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1259f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1269f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t displayWidth, size_t displayHeight);
127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
137be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
138be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
147329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
152329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
159329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
169784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual void onMessage(const omx_message &msg) = 0;
170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1721de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface {
1731de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1741de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1751de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
1761de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1771de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1781de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
190e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
191e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1951de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
1961de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1971de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual status_t onTransact(
1981de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
1991de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t flags = 0);
2001de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
2011de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
205