IOMX.h revision 9f9afef3d5da3be6812192e60797b1c035445c3c
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
45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t list_nodes(List<String8> *list) = 0;
46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t allocate_node(const char *name, node_id *node) = 0;
48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t free_node(node_id node) = 0;
49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t send_command(
51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t get_parameter(
54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            void *params, size_t size) = 0;
56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t set_parameter(
58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            const void *params, size_t size) = 0;
60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
61be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t get_config(
62be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
63be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            void *params, size_t size) = 0;
64be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
65be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t set_config(
66be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
67be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const void *params, size_t size) = 0;
68be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t use_buffer(
70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t allocate_buffer(
74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t allocate_buffer_with_backup(
78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t free_buffer(
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t observe_node(
85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, const sp<IOMXObserver> &observer) = 0;
86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual void fill_buffer(node_id node, buffer_id buffer) = 0;
88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual void empty_buffer(
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node,
91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id buffer,
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
941de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
95be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    virtual status_t get_extension_index(
96be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node,
97be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *parameter_name,
98be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_INDEXTYPE *index) = 0;
99be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
1001de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual sp<IOMXRenderer> createRenderer(
1011de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const sp<ISurface> &surface,
1021de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const char *componentName,
1031de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1041de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1051de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t displayWidth, size_t displayHeight) = 0;
106ccf8b94169197875af6c89172015b9644919b064Andreas Huber
1079f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
108ccf8b94169197875af6c89172015b9644919b064Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1099f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // of the ISurface from a regular Surface or a java Surface object.
110ccf8b94169197875af6c89172015b9644919b064Andreas Huber    sp<IOMXRenderer> createRenderer(
111ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const sp<Surface> &surface,
112ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const char *componentName,
113ccf8b94169197875af6c89172015b9644919b064Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
114ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t encodedWidth, size_t encodedHeight,
115ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t displayWidth, size_t displayHeight);
1169f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
1179f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1189f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            JNIEnv *env, jobject javaSurface,
1199f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            const char *componentName,
1209f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1219f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1229f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t displayWidth, size_t displayHeight);
123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
124e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
126e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
133be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
134be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
138e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
143329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
148329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
155329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual void on_message(const omx_message &msg) = 0;
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1681de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface {
1691de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1701de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1711de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
1721de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1731de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1741de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
190e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1911de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
1921de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1931de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual status_t onTransact(
1941de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
1951de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t flags = 0);
1961de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1971de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
201