1/*
2 * Copyright (c) 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 OHOS_HISTREAMER_ABILITY_PARSER_H
17#define OHOS_HISTREAMER_ABILITY_PARSER_H
18
19#include <cstdint>
20#include <string>
21#include <vector>
22
23#include "cJSON.h"
24
25#ifndef API_EXPORT
26#define API_EXPORT __attribute__((visibility("default")))
27#endif
28
29namespace OHOS {
30namespace DistributedHardware {
31
32/**
33 * @enum Audio AAC Profile。
34 *
35 * AAC mode type.  Note that the term profile is used with the MPEG-2
36 * standard and the term object type and profile is used with MPEG-4
37 *
38 * @since 1.0
39 * @version 1.0
40 */
41enum struct AudioAacProfile : uint8_t {
42    NONE = 0,           ///< Null, not used
43    MAIN = 1,           ///< AAC Main object
44    LC,                 ///< AAC Low Complexity object (AAC profile)
45    SSR,                ///< AAC Scalable Sample Rate object
46    LTP,                ///< AAC Long Term Prediction object
47    HE,                 ///< AAC High Efficiency (object type SBR, HE-AAC profile)
48    SCALABLE,           ///< AAC Scalable object
49    ERLC = 17,          ///< ER AAC Low Complexity object (Error Resilient AAC-LC)
50    ER_SCALABLE = 20,   ///< ER AAC scalable object
51    LD = 23,            ///< AAC Low Delay object (Error Resilient)
52    HE_PS = 29,         ///< AAC High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS)
53    ELD = 39,           ///< AAC Enhanced Low Delay. NOTE: Pending Khronos standardization
54    XHE = 42,           ///< extended High Efficiency AAC. NOTE: Pending Khronos standardization
55};
56
57/**
58 * @enum Audio AAC Stream Format
59 *
60 * @since 1.0
61 * @version 1.0
62 */
63enum struct AudioAacStreamFormat : uint8_t {
64    MP2ADTS = 0,        ///< AAC Audio Data Transport Stream 2 format
65    MP4ADTS,            ///< AAC Audio Data Transport Stream 4 format
66    MP4LOAS,            ///< AAC Low Overhead Audio Stream format
67    MP4LATM,            ///< AAC Low overhead Audio Transport Multiplex
68    ADIF,               ///< AAC Audio Data Interchange Format
69    MP4FF,              ///< AAC inside MPEG-4/ISO File Format
70    RAW,                ///< AAC Raw Format
71};
72
73/**
74 * @enum Audio Channel Masks
75 *
76 * A 64-bit integer with bits set for each channel.
77 *
78 * @since 1.0
79 * @version 1.0
80 */
81enum AudioChannelMasks : uint64_t {
82    FRONT_LEFT              = 1ULL << 0U,
83    FRONT_RIGHT             = 1ULL << 1U,
84    FRONT_CENTER            = 1ULL << 2U,
85    LOW_FREQUENCY           = 1ULL << 3U,
86    BACK_LEFT               = 1ULL << 4U,
87    BACK_RIGHT              = 1ULL << 5U,
88    FRONT_LEFT_OF_CENTER    = 1ULL << 6U,
89    FRONT_RIGHT_OF_CENTER   = 1ULL << 7U,
90    BACK_CENTER             = 1ULL << 8U,
91    SIDE_LEFT               = 1ULL << 9U,
92    SIDE_RIGHT              = 1ULL << 10U,
93    TOP_CENTER              = 1ULL << 11U,
94    TOP_FRONT_LEFT          = 1ULL << 12U,
95    TOP_FRONT_CENTER        = 1ULL << 13U,
96    TOP_FRONT_RIGHT         = 1ULL << 14U,
97    TOP_BACK_LEFT           = 1ULL << 15U,
98    TOP_BACK_CENTER         = 1ULL << 16U,
99    TOP_BACK_RIGHT          = 1ULL << 17U,
100    STEREO_LEFT             = 1ULL << 29U,
101    STEREO_RIGHT            = 1ULL << 30U,
102    WIDE_LEFT               = 1ULL << 31U,
103    WIDE_RIGHT              = 1ULL << 32U,
104    SURROUND_DIRECT_LEFT    = 1ULL << 33U,
105    SURROUND_DIRECT_RIGHT   = 1ULL << 34U,
106    LOW_FREQUENCY_2         = 1ULL << 35U,
107    TOP_SIDE_LEFT           = 1ULL << 36U,
108    TOP_SIDE_RIGHT          = 1ULL << 37U,
109    BOTTOM_FRONT_CENTER     = 1ULL << 38U,
110    BOTTOM_FRONT_LEFT       = 1ULL << 39U,
111    BOTTOM_FRONT_RIGHT      = 1ULL << 40U,
112};
113
114/**
115 * @enum Audio Channel Layout
116 *
117 * Indicates that the channel order in which the user requests decoder output
118 * is the native codec channel order.
119 *
120 * @since 1.0
121 * @version 1.0
122 */
123enum struct AudioChannelLayout : uint64_t {
124    UNKNOWN                 = 0,
125    MONO                    = (AudioChannelMasks::FRONT_CENTER),
126    STEREO                  = (AudioChannelMasks::FRONT_LEFT | AudioChannelMasks::FRONT_RIGHT),
127    CH_2POINT1              = (STEREO | AudioChannelMasks::LOW_FREQUENCY),
128    CH_2_1                  = (STEREO | AudioChannelMasks::BACK_CENTER),
129    SURROUND                = (STEREO | AudioChannelMasks::FRONT_CENTER),
130    CH_3POINT1              = (SURROUND | AudioChannelMasks::LOW_FREQUENCY),
131    CH_4POINT0              = (SURROUND | AudioChannelMasks::BACK_CENTER),
132    CH_4POINT1              = (CH_4POINT0 | AudioChannelMasks::LOW_FREQUENCY),
133    CH_2_2                  = (STEREO | AudioChannelMasks::SIDE_LEFT | AudioChannelMasks::SIDE_RIGHT),
134    QUAD                    = (STEREO | AudioChannelMasks::BACK_LEFT | AudioChannelMasks::BACK_RIGHT),
135    CH_5POINT0              = (SURROUND | AudioChannelMasks::SIDE_LEFT | AudioChannelMasks::SIDE_RIGHT),
136    CH_5POINT1              = (CH_5POINT0 | AudioChannelMasks::LOW_FREQUENCY),
137    CH_5POINT0_BACK         = (SURROUND | AudioChannelMasks::BACK_LEFT | AudioChannelMasks::BACK_RIGHT),
138    CH_5POINT1_BACK         = (CH_5POINT0_BACK | AudioChannelMasks::LOW_FREQUENCY),
139    CH_6POINT0              = (CH_5POINT0 | AudioChannelMasks::BACK_CENTER),
140    CH_6POINT0_FRONT        = (CH_2_2 | AudioChannelMasks::FRONT_LEFT_OF_CENTER |
141                                AudioChannelMasks::FRONT_RIGHT_OF_CENTER),
142    HEXAGONAL               = (CH_5POINT0_BACK | AudioChannelMasks::BACK_CENTER),
143    CH_6POINT1              = (CH_5POINT1 | AudioChannelMasks::BACK_CENTER),
144    CH_6POINT1_BACK         = (CH_5POINT1_BACK | AudioChannelMasks::BACK_CENTER),
145    CH_6POINT1_FRONT        = (CH_6POINT0_FRONT | AudioChannelMasks::LOW_FREQUENCY),
146    CH_7POINT0              = (CH_5POINT0 | AudioChannelMasks::BACK_LEFT | AudioChannelMasks::BACK_RIGHT),
147    CH_7POINT0_FRONT        = (CH_5POINT0 | AudioChannelMasks::FRONT_LEFT_OF_CENTER |
148                                AudioChannelMasks::FRONT_RIGHT_OF_CENTER),
149    CH_7POINT1              = (CH_5POINT1 | AudioChannelMasks::BACK_LEFT | AudioChannelMasks::BACK_RIGHT),
150    CH_7POINT1_WIDE         = (CH_5POINT1 | AudioChannelMasks::FRONT_LEFT_OF_CENTER |
151                                AudioChannelMasks::FRONT_RIGHT_OF_CENTER),
152    CH_7POINT1WIDE_BACK    = (CH_5POINT1_BACK | AudioChannelMasks::FRONT_LEFT_OF_CENTER |
153                                AudioChannelMasks::FRONT_RIGHT_OF_CENTER),
154    CH_3POINT1POINT2        = (CH_3POINT1 | AudioChannelMasks::TOP_FRONT_LEFT | AudioChannelMasks::TOP_FRONT_RIGHT),
155    CH_5POINT1POINT2        = (CH_5POINT1 | AudioChannelMasks::TOP_SIDE_LEFT | AudioChannelMasks::TOP_SIDE_RIGHT),
156    CH_5POINT1POINT4        = (CH_5POINT1 | AudioChannelMasks::TOP_FRONT_LEFT | AudioChannelMasks::TOP_FRONT_RIGHT |
157                                AudioChannelMasks::TOP_BACK_LEFT | AudioChannelMasks::TOP_BACK_RIGHT),
158    CH_7POINT1POINT2        = (CH_7POINT1 | AudioChannelMasks::TOP_SIDE_LEFT | AudioChannelMasks::TOP_SIDE_RIGHT),
159    CH_7POINT1POINT4        = (CH_7POINT1 | AudioChannelMasks::TOP_FRONT_LEFT | AudioChannelMasks::TOP_FRONT_RIGHT |
160                                AudioChannelMasks::TOP_BACK_LEFT | AudioChannelMasks::TOP_BACK_RIGHT),
161    CH_9POINT1POINT4        = (CH_7POINT1POINT4 | AudioChannelMasks::WIDE_LEFT |
162                                AudioChannelMasks::WIDE_RIGHT),
163    CH_9POINT1POINT6        = (CH_9POINT1POINT4 | AudioChannelMasks::TOP_SIDE_LEFT | AudioChannelMasks::TOP_SIDE_RIGHT),
164    CH_10POINT2             = (AudioChannelMasks::FRONT_LEFT | AudioChannelMasks::FRONT_RIGHT |
165                                AudioChannelMasks::FRONT_CENTER | AudioChannelMasks::TOP_FRONT_LEFT |
166                                AudioChannelMasks::TOP_FRONT_RIGHT | AudioChannelMasks::BACK_LEFT |
167                                AudioChannelMasks::BACK_RIGHT | AudioChannelMasks::BACK_CENTER |
168                                AudioChannelMasks::SIDE_LEFT | AudioChannelMasks::SIDE_RIGHT |
169                                AudioChannelMasks::WIDE_LEFT | AudioChannelMasks::WIDE_RIGHT),
170    CH_22POINT2             = (CH_7POINT1POINT4 | AudioChannelMasks::FRONT_LEFT_OF_CENTER |
171                                AudioChannelMasks::FRONT_RIGHT_OF_CENTER | AudioChannelMasks::BACK_CENTER |
172                                AudioChannelMasks::TOP_CENTER | AudioChannelMasks::TOP_FRONT_CENTER |
173                                AudioChannelMasks::TOP_BACK_CENTER | AudioChannelMasks::TOP_SIDE_LEFT |
174                                AudioChannelMasks::TOP_SIDE_RIGHT | AudioChannelMasks::BOTTOM_FRONT_LEFT |
175                                AudioChannelMasks::BOTTOM_FRONT_RIGHT | AudioChannelMasks::BOTTOM_FRONT_CENTER |
176                                AudioChannelMasks::LOW_FREQUENCY_2),
177    OCTAGONAL               = (CH_5POINT0 | AudioChannelMasks::BACK_LEFT | AudioChannelMasks::BACK_CENTER |
178                                AudioChannelMasks::BACK_RIGHT),
179    HEXADECAGONAL           = (OCTAGONAL | AudioChannelMasks::WIDE_LEFT | AudioChannelMasks::WIDE_RIGHT |
180                                AudioChannelMasks::TOP_BACK_LEFT | AudioChannelMasks::TOP_BACK_RIGHT |
181                                AudioChannelMasks::TOP_BACK_CENTER | AudioChannelMasks::TOP_FRONT_CENTER |
182                                AudioChannelMasks::TOP_FRONT_LEFT | AudioChannelMasks::TOP_FRONT_RIGHT),
183    STEREO_DOWNMIX          = (AudioChannelMasks::STEREO_LEFT | AudioChannelMasks::STEREO_RIGHT),
184};
185
186/**
187 * @enum Audio sample formats
188 *
189 * 'S' is signed, 'U' is unsigned, and 'F' is a floating-point number.
190 * 'P' is planes, default is interleaved.
191 *
192 * @since 1.0
193 * @version 1.0
194 */
195enum struct AudioSampleFormat : uint8_t {
196    NONE,
197    /* 8 bit */
198    S8, U8, S8P, U8P,
199    /* 16 bit */
200    S16, U16, S16P, U16P,
201    /* 24 bit */
202    S24, U24, S24P, U24P,
203    /* 32 bit */
204    S32, U32, S32P, U32P,
205    /* 64 bit */
206    S64, U64, S64P, U64P,
207    /* float double */
208    F32, F32P, F64, F64P,
209};
210
211/**
212 * @enum Video Pixel Format.
213 *
214 * @since 1.0
215 * @version 1.0
216 */
217enum struct VideoPixelFormat : uint32_t {
218    UNKNOWN,
219    YUV410P,   ///< planar YUV 4:1:0, 1 Cr & Cb sample per 4x4 Y samples
220    YUV411P,   ///< planar YUV 4:1:1, 1 Cr & Cb sample per 4x1 Y samples
221    YUV420P,   ///< planar YUV 4:2:0, 1 Cr & Cb sample per 2x2 Y samples
222    NV12,      ///< semi-planar YUV 4:2:0, UVUV...
223    NV21,      ///< semi-planar YUV 4:2:0, VUVU...
224    YUYV422,   ///< packed YUV 4:2:2, Y0 Cb Y1 Cr
225    YUV422P,   ///< planar YUV 4:2:2, 1 Cr & Cb sample per 2x1 Y samples
226    YUV444P,   ///< planar YUV 4:4:4, 1 Cr & Cb sample per 1x1 Y samples
227    RGBA,      ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
228    ARGB,      ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
229    ABGR,      ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
230    BGRA,      ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
231    RGB24,     ///< packed RGB 8:8:8, RGBRGB...
232    BGR24,     ///< packed RGB 8:8:8, BGRBGR...
233    PAL8,      ///< 8 bit with AV_PIX_FMT_RGB32 palette
234    GRAY8,     ///< Y
235    MONOWHITE, ///< Y, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
236    MONOBLACK, ///< Y, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
237    YUVJ420P,  ///< planar YUV 4:2:0, 12bpp, full scale (JPEG)
238    YUVJ422P,  ///< planar YUV 4:2:2, 16bpp, full scale (JPEG)
239    YUVJ444P,  ///< planar YUV 4:4:4, 24bpp, full scale (JPEG)
240};
241
242/**
243 * @enum Video Bit Stream format.
244 *
245 * @since 1.0
246 * @version 1.0
247 */
248enum struct VideoBitStreamFormat : uint32_t {
249    UNKNOWN,
250    AVC1,  // H264 bit stream format
251    HEVC,  // H265 bit stream format
252    ANNEXB, // H264, H265 bit stream format
253};
254
255static const std::string AUDIO_ENCODERS = "audioEncoders";
256static const std::string AUDIO_DECODERS = "audioDecoders";
257static const std::string VIDEO_ENCODERS = "videoEncoders";
258static const std::string VIDEO_DECODERS = "videoDecoders";
259
260/******************* AudioEncoder Begin *****************/
261struct AudioEncoderIn {
262    std::string mime;
263    std::vector<uint32_t> sample_rate;
264};
265
266struct AudioEncoderOut {
267    std::string mime;
268    uint32_t ad_mpeg_ver;
269    AudioAacProfile aac_profile;
270    AudioAacStreamFormat aac_stm_fmt;
271};
272
273struct AudioEncoder {
274    std::string name;
275    std::vector<AudioEncoderIn> ins;
276    std::vector<AudioEncoderOut> outs;
277};
278
279void FromJson(const cJSON *jsonObject, AudioEncoderIn &audioEncoderIn);
280void FromJson(const cJSON *jsonObject, AudioEncoderOut &audioEncoderOut);
281void FromJson(const cJSON *jsonObject, AudioEncoder &audioEncoder);
282/******************* AudioEncoder End *******************/
283
284/******************* AudioDecoder Begin *****************/
285struct AudioDecoderIn {
286    std::string mime;
287    std::vector<AudioChannelLayout> channel_layout;
288};
289
290struct AudioDecoderOut {
291    std::string mime;
292    std::vector<AudioSampleFormat> sample_fmt;
293};
294
295struct AudioDecoder {
296    std::string name;
297    std::vector<AudioDecoderIn> ins;
298    std::vector<AudioDecoderOut> outs;
299};
300
301void FromJson(const cJSON *jsonObject, AudioDecoderIn &audioDecoderIn);
302void FromJson(const cJSON *jsonObject, AudioDecoderOut &audioDecoderOut);
303void FromJson(const cJSON *jsonObject, AudioDecoder &audioDecoder);
304/******************* AudioDecoder End *******************/
305
306/******************* VideoEncoder Begin *****************/
307struct VideoEncoderIn {
308    std::string mime;
309    std::vector<VideoPixelFormat> pixel_fmt;
310};
311
312struct VideoEncoderOut {
313    std::string mime;
314};
315
316struct VideoEncoder {
317    std::string name;
318    std::vector<VideoEncoderIn> ins;
319    std::vector<VideoEncoderOut> outs;
320};
321
322void FromJson(const cJSON *jsonObject, VideoEncoderIn &videoEncoderIn);
323void FromJson(const cJSON *jsonObject, VideoEncoderOut &videoEncoderOut);
324void FromJson(const cJSON *jsonObject, VideoEncoder &videoEncoder);
325/******************* VideoEncoder End *******************/
326
327/******************* VideoDecoder Begin *****************/
328struct VideoDecoderIn {
329    std::string mime;
330    std::vector<VideoBitStreamFormat> vd_bit_stream_fmt;
331};
332
333struct VideoDecoderOut {
334    std::string mime;
335    std::vector<VideoPixelFormat> pixel_fmt;
336};
337
338struct VideoDecoder {
339    std::string name;
340    std::vector<VideoDecoderIn> ins;
341    std::vector<VideoDecoderOut> outs;
342};
343
344void FromJson(const cJSON *jsonObject, VideoDecoderIn &videoDecoderIn);
345void FromJson(const cJSON *jsonObject, VideoDecoderOut &videoDecoderOut);
346void FromJson(const cJSON *jsonObject, VideoDecoder &videoDecoder);
347/******************* VideoDecoder End *******************/
348template<typename T>
349API_EXPORT void FromJson(const std::string &key, const cJSON *jsonObject, std::vector<T> &objs);
350}
351}
352#endif