IOMX.h revision d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3
1db0e15ae3e2b5e180541eec35e2bce54359ca7d8Zhongxing Xu/*
261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * Copyright (C) 2009 The Android Open Source Project
361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek *
461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * you may not use this file except in compliance with the License.
661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * You may obtain a copy of the License at
761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek *
861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek *      http://www.apache.org/licenses/LICENSE-2.0
961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek *
1061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * Unless required by applicable law or agreed to in writing, software
114adc81e540b874bafa15715fd2c5cb662463debdTed Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
1261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * See the License for the specific language governing permissions and
1461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek * limitations under the License.
155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis */
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#ifndef ANDROID_IOMX_H_
18d2f642b56e87493edfc3b0dab359b5e32d5f8a5eTed Kremenek
199b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#define ANDROID_IOMX_H_
201b431023814196f87515a540ebcb9e9f1a9176a1Ted Kremenek
211b431023814196f87515a540ebcb9e9f1a9176a1Ted Kremenek#include <binder/IInterface.h>
221b431023814196f87515a540ebcb9e9f1a9176a1Ted Kremenek#include <ui/GraphicBuffer.h>
23f377fc85488f4799ced714ac60e65a0e3f8f69cbTed Kremenek#include <utils/List.h>
24e207558e9dbed963eebf5cf31fdb02616f1545a3Ted Kremenek#include <utils/String8.h>
25e207558e9dbed963eebf5cf31fdb02616f1545a3Ted Kremenek
2661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#include <OMX_Core.h>
271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include <OMX_Video.h>
285a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include "jni.h"
305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
315a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisnamespace android {
325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
339ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekclass IMemory;
345a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisclass IOMXObserver;
3561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass IOMXRenderer;
3661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass Surface;
3761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
385e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerclass IOMX : public IInterface {
395e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramerpublic:
4050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek    DECLARE_META_INTERFACE(OMX);
418966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek
42d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    typedef void *buffer_id;
434adc81e540b874bafa15715fd2c5cb662463debdTed Kremenek    typedef void *node_id;
44cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Given a node_id and the calling process' pid, returns true iff
46cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    // the implementation of the OMX interface lives in the same
47cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    // process.
48cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    virtual bool livesLocally(node_id node, pid_t pid) = 0;
498966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek
501b431023814196f87515a540ebcb9e9f1a9176a1Ted Kremenek    struct ComponentInfo {
518966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek        String8 mName;
528966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek        List<String8> mRoles;
539c378f705405d37f49795d5e915989de774fe11fTed Kremenek    };
549c378f705405d37f49795d5e915989de774fe11fTed Kremenek    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
559c378f705405d37f49795d5e915989de774fe11fTed Kremenek
561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t allocateNode(
578966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek            const char *name, const sp<IOMXObserver> &observer,
581b431023814196f87515a540ebcb9e9f1a9176a1Ted Kremenek            node_id *node) = 0;
598966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t freeNode(node_id node) = 0;
61cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
628966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek    virtual status_t sendCommand(
637a9bb52171f962d51ab13c1e012d2236feb9558dTed Kremenek            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
64cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
65d49967f8764135ae65658e354b6d38e3637c9de3Ted Kremenek    virtual status_t getParameter(
66cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            node_id node, OMX_INDEXTYPE index,
67212f6d3b5fb3fa55ba1e40671cfc336430abc8ddTom Care            void *params, size_t size) = 0;
68640ccf071076e684713cc3c3276bb51982bff607Argyrios Kyrtzidis
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t setParameter(
70cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            node_id node, OMX_INDEXTYPE index,
71cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            const void *params, size_t size) = 0;
72cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
73cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    virtual status_t getConfig(
74cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            node_id node, OMX_INDEXTYPE index,
75404fc3ad6bd844bf8ce70cbf9974ab297704a122Argyrios Kyrtzidis            void *params, size_t size) = 0;
76cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
771a0c8b9183fde84982aea9190a55fde1541c432dTed Kremenek    virtual status_t setConfig(
78072192bcbb05a0fee7ec3061750b27e8d2004952Ted Kremenek            node_id node, OMX_INDEXTYPE index,
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            const void *params, size_t size) = 0;
8050a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
81fe9e543a2a363df7fcaa899367d3b2580b63b27cTed Kremenek    virtual status_t getState(
82fe9e543a2a363df7fcaa899367d3b2580b63b27cTed Kremenek            node_id node, OMX_STATETYPE* state) = 0;
83fe9e543a2a363df7fcaa899367d3b2580b63b27cTed Kremenek
84c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    virtual status_t storeMetaDataInBuffers(
859c378f705405d37f49795d5e915989de774fe11fTed Kremenek            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
86fe9e543a2a363df7fcaa899367d3b2580b63b27cTed Kremenek
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t enableGraphicBuffers(
88686775deca8b8685eb90801495880e3abdd844c2Chris Lattner            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
89212f6d3b5fb3fa55ba1e40671cfc336430abc8ddTom Care
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t getGraphicBufferUsage(
91686775deca8b8685eb90801495880e3abdd844c2Chris Lattner            node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
92212f6d3b5fb3fa55ba1e40671cfc336430abc8ddTom Care
93212f6d3b5fb3fa55ba1e40671cfc336430abc8ddTom Care    virtual status_t useBuffer(
94212f6d3b5fb3fa55ba1e40671cfc336430abc8ddTom Care            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
95d49967f8764135ae65658e354b6d38e3637c9de3Ted Kremenek            buffer_id *buffer) = 0;
9650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t useGraphicBuffer(
988966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek            node_id node, OMX_U32 port_index,
99cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
100cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
101cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    // This API clearly only makes sense if the caller lives in the
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // same process as the callee, i.e. is the media_server, as the
103cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    // returned "buffer_data" pointer is just that, a pointer into local
1049c378f705405d37f49795d5e915989de774fe11fTed Kremenek    // address space.
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    virtual status_t allocateBuffer(
106cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            node_id node, OMX_U32 port_index, size_t size,
107cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            buffer_id *buffer, void **buffer_data) = 0;
1088966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek
1098966bc1c8ce271c09936c0eaf6c841aef4a0af1bTed Kremenek    virtual status_t allocateBufferWithBackup(
1109c378f705405d37f49795d5e915989de774fe11fTed Kremenek            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            buffer_id *buffer) = 0;
112686775deca8b8685eb90801495880e3abdd844c2Chris Lattner
113d49967f8764135ae65658e354b6d38e3637c9de3Ted Kremenek    virtual status_t freeBuffer(
114686775deca8b8685eb90801495880e3abdd844c2Chris Lattner            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
115d49967f8764135ae65658e354b6d38e3637c9de3Ted Kremenek
116d49967f8764135ae65658e354b6d38e3637c9de3Ted Kremenek    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
118cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    virtual status_t emptyBuffer(
119072192bcbb05a0fee7ec3061750b27e8d2004952Ted Kremenek            node_id node,
120cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            buffer_id buffer,
121072192bcbb05a0fee7ec3061750b27e8d2004952Ted Kremenek            OMX_U32 range_offset, OMX_U32 range_length,
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            OMX_U32 flags, OMX_TICKS timestamp) = 0;
123cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
1249c378f705405d37f49795d5e915989de774fe11fTed Kremenek    virtual status_t getExtensionIndex(
1259c378f705405d37f49795d5e915989de774fe11fTed Kremenek            node_id node,
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            const char *parameter_name,
127cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_INDEXTYPE *index) = 0;
128cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek};
129fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner
130cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenekstruct omx_message {
131cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    enum {
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        EVENT,
133640ccf071076e684713cc3c3276bb51982bff607Argyrios Kyrtzidis        EMPTY_BUFFER_DONE,
134640ccf071076e684713cc3c3276bb51982bff607Argyrios Kyrtzidis        FILL_BUFFER_DONE,
135cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
136640ccf071076e684713cc3c3276bb51982bff607Argyrios Kyrtzidis    } type;
137cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
1389c378f705405d37f49795d5e915989de774fe11fTed Kremenek    IOMX::node_id node;
1399c378f705405d37f49795d5e915989de774fe11fTed Kremenek
1409c378f705405d37f49795d5e915989de774fe11fTed Kremenek    union {
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // if type == EVENT
1429c378f705405d37f49795d5e915989de774fe11fTed Kremenek        struct {
1439c378f705405d37f49795d5e915989de774fe11fTed Kremenek            OMX_EVENTTYPE event;
1446837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek            OMX_U32 data1;
145cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_U32 data2;
146cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        } event_data;
147cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
148cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        // if type == EMPTY_BUFFER_DONE
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        struct {
150cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            IOMX::buffer_id buffer;
151cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        } buffer_data;
152cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        // if type == FILL_BUFFER_DONE
154cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        struct {
155cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            IOMX::buffer_id buffer;
156cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_U32 range_offset;
157cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_U32 range_length;
158cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_U32 flags;
159cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_TICKS timestamp;
160cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_PTR platform_private;
161cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            OMX_PTR data_ptr;
162cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        } extended_buffer_data;
163cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
164cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    } u;
165cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek};
166cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
167cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenekclass IOMXObserver : public IInterface {
168cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenekpublic:
1699c378f705405d37f49795d5e915989de774fe11fTed Kremenek    DECLARE_META_INTERFACE(OMXObserver);
1709c378f705405d37f49795d5e915989de774fe11fTed Kremenek
1719c378f705405d37f49795d5e915989de774fe11fTed Kremenek    virtual void onMessage(const omx_message &msg) = 0;
172cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek};
173cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
174cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek////////////////////////////////////////////////////////////////////////////////
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1763aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenekclass BnOMX : public BnInterface<IOMX> {
1773aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenekpublic:
1783aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenek    virtual status_t onTransact(
1793aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenek            uint32_t code, const Parcel &data, Parcel *reply,
1809c378f705405d37f49795d5e915989de774fe11fTed Kremenek            uint32_t flags = 0);
1819c378f705405d37f49795d5e915989de774fe11fTed Kremenek};
1829c378f705405d37f49795d5e915989de774fe11fTed Kremenek
1833aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenekclass BnOMXObserver : public BnInterface<IOMXObserver> {
1843aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenekpublic:
1853aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenek    virtual status_t onTransact(
1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            uint32_t code, const Parcel &data, Parcel *reply,
187cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            uint32_t flags = 0);
188cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek};
1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1903aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenekstruct CodecProfileLevel {
1913aa1ab27c14d16c853ccb61f17a4a75d8e366806Ted Kremenek    OMX_U32 mProfile;
192cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    OMX_U32 mLevel;
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek}  // namespace android
196cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
197cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#endif  // ANDROID_IOMX_H_
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump