1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package [email protected];
18
19import IOmx;
20
21/**
22 * Ref: frameworks/av/include/media/IOMX.h: IOMX
23 *
24 * There will be two instances of IOmxStore: "platform" and "vendor".
25 *
26 * The IOmxStore service provided by the platform must present "platform" as the
27 * interface name.
28 *
29 * The IOmxStore service provided by the vendor must present "vendor" as the
30 * instance name.
31 */
32interface IOmxStore {
33
34    /**
35     * Attribute is a key-value pair of strings. The `value` member is generally
36     * a stringified value of the following:
37     *   enum<v1,v2,...,vn>:    v1 | v2 | ... | vn
38     *   num:                   0 | [1-9][0-9]*
39     *   string:                arbitrary string
40     *   size:                  <num>x<num>
41     *   ratio:                 <num>:<num>
42     *   range<type>:           <type> | <type>-<type>
43     *   list<type>:            <type> | <type>,<list<type>>
44     */
45    struct Attribute {
46        string key;
47        string value;
48    };
49
50    /**
51     * Service attribute
52     *
53     * Optional service attributes:
54     *   key: 'max-video-encoder-input-buffers', value-type: num
55     *   key: 'supports-multiple-secure-codecs', value-type: enum<0,1>
56     *   key: 'supports-secure-with-non-secure-codec', value-type: enum<0,1>
57     *
58     * For keys with prefix 'supports-', the value of 0 means "no" (not
59     * supported) while the value of 1 means "yes" (supported).
60     */
61    typedef Attribute ServiceAttribute;
62
63    /**
64     * List attributes that are service-specific (not node-specific).
65     *
66     * @return attributes The list of `Attribute`s that are specific to this
67     *                    service.
68     */
69    listServiceAttributes(
70        ) generates (
71            Status status,
72            vec<ServiceAttribute> attributes
73        );
74
75    /**
76     * Node attribute
77     *
78     * Optional node attributes to describe supported values:
79     *   key: 'bitrate-range', value-type: range<num>
80     *   key: 'max-concurrent-instances', value-type: num
81     *   key: 'max-supported-instances', value-type: num
82     *
83     * Optional node attributes for audio nodes to describe supported values:
84     *   key: 'max-channel-count', value-type: num
85     *   key: 'sample-rate-ranges', value-type: list<range<num>>
86     *
87     * Optional node attributes for video nodes to describe supported values:
88     *   key: 'alignment', value-type: size
89     *   key: 'block-aspect-ratio-range', value-type: range<ratio>
90     *   key: 'block-count-range', value-type: range<num>
91     *   key: 'block-size', value-type: size
92     *   key: 'blocks-per-second-range', value-type: range<num>
93     *   key: 'feature-can-swap-width-height', value-type: enum<0,1>
94     *   key: 'frame-rate-range', value-type: range<num>
95     *   key: 'pixel-aspect-ratio-range', value-type: range<ratio>
96     *   key: 'size-range', value-type: range<size>
97     *
98     * Required node attributes for video nodes that are required by Android to
99     * describe measured values for this device:
100     *   key: 'measured-frame-rate-<width>x<height>-range',
101     *     value-type: range<num>; where width: num, height: num
102     *
103     * Optional node attributes for decoders to describe supported values:
104     *   key: 'feature-adaptive-playback', value: enum<0,1>
105     *   key: 'feature-secure-playback', value: enum<0,1>
106     *   key: 'feature-tunneled-playback', value: enum<0,1>
107     *
108     * Optional node attributes for video decoders to describe supported values:
109     *   key: 'feature-partial-frame', value: enum<0,1>
110     *
111     * Optional node attributes for encoders to describe supported values:
112     *   key: 'complexity-default', value-type: num
113     *   key: 'complexity-range', value-type: range<num>
114     *   key: 'feature-bitrate-modes', value-type: list<enum<VBR,CBR,CQ>>
115     *   key: 'feature-intra-refresh', value-type: enum<0,1>
116     *   key: 'quality-default', value-type: num
117     *   key: 'quality-range', value-type: range<num>
118     *   key: 'quality-scale', value-type: string
119     *
120     * For keys with prefix 'feature-' and value type enum<0,1>, the value of 0
121     * means "optional", while the value of 1 means "required".
122     */
123    typedef Attribute NodeAttribute;
124
125    /**
126     * Information for an IOmxNode node.
127     */
128    struct NodeInfo {
129        /**
130         * Name of this node.
131         *
132         * `name` can be supplied to `IOmx::allocateNode` of a
133         * corresponding `IOmx` instance to create the node.
134         */
135        string name;
136        /**
137         * Name of the `IOmx` instance that can create this node.
138         *
139         * To obtain the `IOmx` instance, call `getOmx(owner)`.
140         */
141        string owner;
142        /**
143         * List of node attributes.
144         */
145        vec<NodeAttribute> attributes;
146    };
147
148    /**
149     * Information about nodes provided for a supported node role
150     */
151    struct RoleInfo {
152        /**
153         * Standard OMX node role.
154         */
155        string role;
156        /**
157         * Corresponding media type (as defined in MediaFormat.MIMETYPE_*
158         * constants for types required by Android).
159         */
160        string type;
161        /**
162         * Whether this role is for an encoder or a decoder.
163         */
164        bool isEncoder;
165        /**
166         * Whether to prefer platform nodes for this role.
167         */
168        bool preferPlatformNodes;
169        /**
170         * List of nodes that support this role, ordered by preference.
171         */
172        vec<NodeInfo> nodes;
173    };
174
175    /**
176     * Return the prefix of names of supported nodes.
177     *
178     * @return prefix The prefix of the names of all nodes supported by this
179     *                service.
180     */
181    getNodePrefix(
182        ) generates (
183            string prefix
184        );
185
186    /**
187     * List roles of supported nodes.
188     *
189     * The name of each node inside `NodeInfo` must start with the prefix
190     * returned by `getNodePrefix()`.
191     *
192     * @return roleList The list of `RoleInfo`s.
193     *
194     * @see RoleInfo
195     */
196    listRoles(
197        ) generates (
198            vec<RoleInfo> roleList
199        );
200
201    /**
202     * Obtain an `IOmx` instance with a specified name.
203     *
204     * @param name The name of the instance.
205     * @return omx The `IOmx` interface associated with `name`. This must be
206     * null if the name is not found.
207     */
208    getOmx(
209            string name
210        ) generates (
211            IOmx omx
212        );
213
214};
215
216