1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef CODEC_OMX_EXT_H
17 #define CODEC_OMX_EXT_H
18 #include <OMX_IVCommon.h>
19 #include <OMX_Video.h>
20 #include <stdbool.h>
21 #ifdef __cplusplus
22 #if __cplusplus
23 extern "C" {
24 #endif
25 #endif /* __cplusplus */
26 
27 #define PROCESS_NAME_LEN 50
28 
29 /**
30  * @brief Enumerates the extended AVC profile.
31  */
32 enum CodecAVCProfileExt {
33     OMX_VIDEO_AVC_LEVEL52  = 0x10000,  /**< Level 5.2 */
34     OMX_VIDEO_AVC_LEVEL6   = 0x20000,  /**< Level 6 */
35     OMX_VIDEO_AVC_LEVEL61  = 0x40000,  /**< Level 6.1 */
36     OMX_VIDEO_AVC_LEVEL62  = 0x80000,  /**< Level 6.2 */
37 };
38 
39 /**
40  * @brief Enumerates the extended codec codingtyps.
41  */
42 enum CodecVideoExType {
43     CODEC_OMX_VIDEO_CodingVP9  = 10, /** VP9 Index in Codec HDI */
44     CODEC_OMX_VIDEO_CodingHEVC = 11, /** HEVC Index in Codec HDI */
45     CODEC_OMX_VIDEO_CodingVVC = 12, /** VVC Index in Codec HDI */
46 };
47 
48 /**
49  * @brief Enumerates the extended HEVC profile.
50  */
51 enum CodecHevcProfile {
52     CODEC_HEVC_PROFILE_INVALID = 0x0,
53     CODEC_HEVC_PROFILE_MAIN = 0x1,
54     CODEC_HEVC_PROFILE_MAIN10 = 0x2,
55     CODEC_HEVC_PROFILE_MAIN_STILL = 0x3,
56     // main_10 profile with HDR SEI support.
57     CODEC_HEVC_PROFILE_MAIN10_HDR10 = 0x1000,
58     CODEC_HEVC_PROFILE_MAIN10_HDR10_PLUS = 0x2000,
59     CODEC_HEVC_PROFILE_MAX = 0x7FFFFFFF
60 };
61 
62 /**
63  * @brief Enumerates the extended HEVC level.
64  */
65 enum CodecHevcLevel {
66     CODEC_HEVC_LEVEL_INVALID = 0x0,
67     CODEC_HEVC_MAIN_TIER_LEVEL1 = 0x1,
68     CODEC_HEVC_HIGH_TIER_LEVEL1 = 0x2,
69     CODEC_HEVC_MAIN_TIER_LEVEL2 = 0x4,
70     CODEC_HEVC_HIGH_TIER_LEVEL2 = 0x8,
71     CODEC_HEVC_MAIN_TIER_LEVEL21 = 0x10,
72     CODEC_HEVC_HIGH_TIER_LEVEL21 = 0x20,
73     CODEC_HEVC_MAIN_TIER_LEVEL3 = 0x40,
74     CODEC_HEVC_HIGH_TIER_LEVEL3 = 0x80,
75     CODEC_HEVC_MAIN_TIER_LEVEL31 = 0x100,
76     CODEC_HEVC_HIGH_TIER_LEVEL31 = 0x200,
77     CODEC_HEVC_MAIN_TIER_LEVEL4 = 0x400,
78     CODEC_HEVC_HIGH_TIER_LEVEL4 = 0x800,
79     CODEC_HEVC_MAIN_TIER_LEVEL41 = 0x1000,
80     CODEC_HEVC_HIGH_TIER_LEVEL41 = 0x2000,
81     CODEC_HEVC_MAIN_TIER_LEVEL5 = 0x4000,
82     CODEC_HEVC_HIGH_TIER_LEVEL5 = 0x8000,
83     CODEC_HEVC_MAIN_TIER_LEVEL51 = 0x10000,
84     CODEC_HEVC_HIGH_TIER_LEVEL51 = 0x20000,
85     CODEC_HEVC_MAIN_TIER_LEVEL52 = 0x40000,
86     CODEC_HEVC_HIGH_TIER_LEVEL52 = 0x80000,
87     CODEC_HEVC_MAIN_TIER_LEVEL6 = 0x100000,
88     CODEC_HEVC_HIGH_TIER_LEVEL6 = 0x200000,
89     CODEC_HEVC_MAIN_TIER_LEVEL61 = 0x400000,
90     CODEC_HEVC_HIGH_TIER_LEVEL61 = 0x800000,
91     CODEC_HEVC_MAIN_TIER_LEVEL62 = 0x1000000,
92     CODEC_HEVC_HIGH_TIER_LEVEL62 = 0x2000000,
93     CODEC_HEVC_HIGH_TIER_MAX = 0x7FFFFFFF
94 };
95 
96 /**
97  * @brief Enumerates the extended codec color format.
98  */
99 enum CodecColorFormatExt {
100     CODEC_COLOR_FORMAT_RGBA8888 = OMX_COLOR_FormatVendorStartUnused + 100,
101 };
102 
103 /**
104  * @brief Enumerates the buffer types.
105  */
106 enum CodecBufferType {
107     /** Invalid buffer type. */
108     CODEC_BUFFER_TYPE_INVALID = 0,
109     /** Virtual address type. */
110     CODEC_BUFFER_TYPE_VIRTUAL_ADDR = 0x1,
111     /** Shared memory. */
112     CODEC_BUFFER_TYPE_AVSHARE_MEM_FD = 0x2,
113     /** Handle. */
114     CODEC_BUFFER_TYPE_HANDLE = 0x4,
115     /** Dynamic handle. */
116     CODEC_BUFFER_TYPE_DYNAMIC_HANDLE = 0x8,
117     /** DMA memory. */
118     CODEC_BUFFER_TYPE_DMA_MEM_FD = 0x10,
119 };
120 
121 /**
122  * @brief Defines the <b>SupportBuffer</b>.
123  */
124 struct SupportBufferType {
125     uint32_t size;                 /** Size of the structure */
126     union OMX_VERSIONTYPE version; /** Component version */
127     uint32_t portIndex;            /** Port index */
128     uint32_t bufferTypes;          /** Supported buffer types */
129 };
130 
131 /**
132  * @brief Define the <b>UseBuffer</b>.
133  */
134 struct UseBufferType {
135     uint32_t size;                 /** Size of the structure */
136     union OMX_VERSIONTYPE version; /** Component version */
137     uint32_t portIndex;            /** Port index */
138     uint32_t bufferType;           /** Buffer type */
139 };
140 
141 /**
142  * @brief Defines the <b>BufferHandleUsage</b>.
143  */
144 struct GetBufferHandleUsageParams {
145     uint32_t size;                 /** Size of the structure */
146     union OMX_VERSIONTYPE version; /** Component version */
147     uint32_t portIndex;            /** Port index */
148     uint64_t usage;                /** Usage */
149 };
150 
151 /**
152  * @brief Defines the <b>CodecVideoPortFormatParam</b>.
153  */
154 struct CodecVideoPortFormatParam {
155     uint32_t size;                                         /** Size of the structure */
156     union OMX_VERSIONTYPE version;                         /** Component version */
157     uint32_t portIndex;                                    /** Port index */
158     uint32_t codecColorIndex;                              /** Color format index */
159     uint32_t codecColorFormat;                             /** Color format defined in Display */
160     uint32_t codecCompressFormat;                          /** See  */
161     uint32_t framerate;                                    /** Q16 format */
162 };
163 
164 /**
165  * @brief Defines the <b>ControlRateConstantQuality</b>.
166  */
167 struct ControlRateConstantQuality {
168     uint32_t size;                                         /** Size of the structure */
169     union OMX_VERSIONTYPE version;                         /** Component version */
170     uint32_t portIndex;                                    /** Port index */
171     uint32_t qualityValue;                                 /** Control rate constant quality */
172 };
173 
174 /**
175  * @brief Defines the <b>PassthroughParam</b>.
176  */
177 struct PassthroughParam {
178     int32_t key;   /**< Parameter type index */
179     void *val;     /**< Pointer to the parameter value */
180     int size;      /**< Parameter value size */
181 };
182 
183 /**
184  * @brief Defines the <b>WorkingFrequencyParam</b>.
185  */
186 struct WorkingFrequencyParam {
187     uint32_t size;                    /** Size of the structure */
188     union OMX_VERSIONTYPE version;    /** Component version */
189     uint32_t level;                   /** Working Frequency level */
190 };
191 
192  /**
193  * @brief Defines the <b>ProcessNameParam</b>.
194  */
195 struct ProcessNameParam {
196     uint32_t size;                         /** Size of the structure */
197     union OMX_VERSIONTYPE version;         /** Component version */
198     char processName[PROCESS_NAME_LEN];    /** Process name array */
199 };
200 
201 /**
202  * @brief Defines the <b>AudioCodecParam</b>.
203  */
204 struct AudioCodecParam {
205     uint32_t size;                 /** Size of the structure */
206     union OMX_VERSIONTYPE version; /** Component version */
207     uint32_t sampleRate;           /** Sample Rate */
208     uint32_t sampleFormat;         /** Sample Format */
209     uint32_t channels;             /** Channels */
210     uint32_t bitRate;              /** Bit Rate */
211     uint32_t reserved;             /** reserved word */
212 };
213 
214 /**
215  * @brief Enumerates the extended codec indexes.
216  */
217 enum OmxIndexCodecExType {
218     /** Extended BufferType index */
219     OMX_IndexExtBufferTypeStartUnused = OMX_IndexKhronosExtensions + 0x00a00000,
220     /** SupportBuffer */
221     OMX_IndexParamSupportBufferType,
222     /** UseBuffer */
223     OMX_IndexParamUseBufferType,
224     /** GetBufferHandleUsage */
225     OMX_IndexParamGetBufferHandleUsage,
226     /** CodecVideoPortFormatParam */
227     OMX_IndexCodecVideoPortFormat,
228     /** ControlRateConstantQuality */
229     OMX_IndexParamControlRateConstantQuality,
230     /** PassthroughParam */
231     OMX_IndexParamPassthrough,
232     /** OMX_IndexParamVideoHevc */
233     OMX_IndexParamVideoHevc,
234     /** range/primary/transfer/matrix */
235     OMX_IndexColorAspects,
236     /** WorkingFrequencyParam */
237     OMX_IndexParamWorkingFrequency,
238     /** ProcessNameParam */
239     OMX_IndexParamProcessName,
240     /** AudioCodecParam */
241     OMX_IndexParamAudioCodec,
242     /** CodecParamOverlayBuffer */
243     OMX_IndexParamOverlayBuffer,
244     /** CodecLTRParam/CodecLTRPerFrameParam */
245     OMX_IndexParamLTR,
246     /** CodecQPRangeParam */
247     OMX_IndexParamQPRange,
248     /** OMX_CONFIG_BOOLEANTYPE */
249     OMX_IndexParamLowLatency,
250     /** WirelessLowDelay */
251     OMX_IndexParamWirelessLowDelay,
252     /** OMX_S32 */
253     OMX_IndexParamEncOutQp,
254     /** double */
255     OMX_IndexParamEncOutMse,
256     /** CodecEncOutLTRParam */
257     OMX_IndexParamEncOutLTR,
258     /** CodecTemperalLayerParam */
259     OMX_IndexParamTemperalLayer,
260     /** OMX_CONFIG_BOOLEANTYPE */
261     OMX_IndexParamEncParamsFeedback,
262     /** OMX_S32 */
263     OMX_IndexParamEncOutFrameLayer,
264     /** OMX_S32 */
265     OMX_IndexParamQPStsart,
266     /** OMX_BOOL */
267     OMX_IndexParamSkipFrame,
268     /** OMX_S32 */
269     OMX_IndexParamEncOutRealBitrate,
270     /** CodecEncOutMadParam */
271     OMX_IndexParamEncOutMad,
272     /** OMX_S32 */
273     OMX_IndexParamEncOutIRatio,
274     /** OMX_S32 */
275     OMX_IndexParamEncOutFrameQp,
276     /** OMX_CONFIG_BOOLEANTYPE */
277     OMX_IndexParamSupportPackInput,
278     /** OMX_CONFIG_BOOLEANTYPE */
279     OMX_IndexParamIsMvUpload,
280 };
281 
282 /**
283  * @brief Enumerates the Other Control Rate Type.
284  */
285 typedef enum OmxVideoControlRateVendorExtType {
286     /** constant bit rate mode with Rlambda */
287     OMX_Video_ControlRateConstantWithRlambda = OMX_Video_ControlRateVendorStartUnused + 0x1,
288 } OmxVideoControlRateVendorExtType;
289 
290 /**
291  * @brief Enumerates the Other extended codec indexes.
292  */
293 enum OmxIndexCodecOtherExtType {
294     /** Extended Config AutoFramerate Conversion */
295     OMX_IndexCodecExtConfigAutoFramerateConversion = OMX_IndexOtherStartUnused + 0x1,
296     /** Extended Config Priority */
297     OMX_IndexCodecExtConfigPriority,
298     /** Extended Config OperatingRate index */
299     OMX_IndexCodecExtConfigOperatingRate,
300 };
301 
302 enum OmxIndexCodecVendorExtType {
303     /** Extended Channel Attributes index */
304     OMX_IndexCodecExtChannelAttributes = OMX_IndexVendorStartUnused + 0x1,
305     /** CodecEnableNativeBufferParams */
306     OMX_IndexCodecExtEnableNativeBuffer,
307 };
308 
309 /**
310  * @brief Structure for controlling HEVC video encoding
311  */
312 struct CodecVideoParamHevc {
313     uint32_t size;                        /** Size of the structure */
314     union OMX_VERSIONTYPE version;        /** Component version */
315     uint32_t portIndex;                   /** Port index */
316     enum CodecHevcProfile profile;        /** Hevc profile. For details,  see {@link CodecHevcProfile}. */
317     enum CodecHevcLevel level;            /** Hevc level. For details,  see {@link CodecHevcLevel}. */
318     uint32_t keyFrameInterval;            /** Distance between consecutive I-frames (including one of the I frams).
319                                               0 means interval is unspecified and can be freely chosen by the codec.
320                                               1 means a stream of only I frams. other  means the real value. */
321 };
322 
323 /**
324  * @brief Defines the <b>CodecEnableNativeBufferParams</b>.
325  */
326 struct CodecEnableNativeBufferParams {
327     uint32_t size;                  /** Size of the structure */
328     union OMX_VERSIONTYPE version;  /** Component version */
329     uint32_t portIndex;             /** Port index */
330     bool enable;                    /** Enable NativeBuffer */
331 };
332 
333 struct ColorAspects {
334     bool range;
335     uint8_t primaries;
336     uint8_t transfer;
337     uint8_t matrixCoeffs;
338 };
339 
340 /**
341  * @brief Structure for controlling color space
342 */
343 struct CodecVideoColorspace {
344     uint32_t size;                        /** Size of the structure */
345     union OMX_VERSIONTYPE version;        /** Component version */
346     uint32_t portIndex;                   /** Port index */
347     uint32_t requestingDataSpace;
348     uint32_t dataSpaceChanged;
349     uint32_t pixeFormat;
350     uint32_t dataSpace;
351     struct ColorAspects aspects;
352 };
353 
354 /**
355  * @brief Structure for pAppPrivate data of OMX_BUFFERHEADERTYPE
356 */
357 struct OMXBufferAppPrivateData {
358     int32_t fd;                          /** dma fd or secure dma fd allocated by vender */
359     uint32_t sizeOfParam;
360     void *param;
361 };
362 
363 struct CodecLTRParam {
364     uint32_t size;                               /** Size of the structure */
365     union OMX_VERSIONTYPE version;               /** Component version */
366     uint32_t ltrFrameListLen;
367 };
368 
369 struct CodecLTRPerFrameParam {
370     bool markAsLTR;
371     bool useLTR;
372     uint32_t useLTRPoc;
373 };
374 
375 struct CodecEncOutLTRParam {
376     bool isLTR;
377     uint32_t poc;
378 };
379 
380 struct CodecQPRangeParam {
381     uint32_t size;                               /** Size of the structure */
382     union OMX_VERSIONTYPE version;               /** Component version */
383     uint32_t minQp;
384     uint32_t maxQp;
385 };
386 
387 struct CodecTemperalLayerParam {
388     uint32_t size;                               /** Size of the structure */
389     union OMX_VERSIONTYPE version;               /** Component version */
390     uint32_t layerCnt;
391 };
392 
393 struct CodecParamOverlayBuffer {
394     uint32_t size;                               /** Size of the structure */
395     union OMX_VERSIONTYPE version;               /** Component version */
396     bool enable;
397     uint32_t dstX;
398     uint32_t dstY;
399     uint32_t dstW;
400     uint32_t dstH;
401     void* bufferHandle;
402 };
403 
404 struct CodecEncOutMadParam {
405     int32_t frameMadi;
406     int32_t frameMadp;
407     int32_t sumMadi;
408 };
409 
410 #ifdef __cplusplus
411 #if __cplusplus
412 }
413 #endif
414 #endif /* __cplusplus */
415 
416 #endif  // CODEC_OMX_EXT_H