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 MEDIA_AVCODEC_DESCRIPTION_H
17#define MEDIA_AVCODEC_DESCRIPTION_H
18
19#include "meta/format.h"
20
21namespace OHOS {
22namespace MediaAVCodec {
23/**
24 * @brief Provides the uniform key for storing the media description.
25 */
26using MediaDescription = Media::Format;
27
28/**
29 * @brief Provides the key's definition for MediaDescription.
30 */
31class MediaDescriptionKey {
32public:
33    /**
34     * Key for track index, value type is uint32_t
35     */
36    static constexpr std::string_view MD_KEY_TRACK_INDEX = "track_index";
37
38    /**
39     * Key for track type, value type is uint8_t, see {link @MediaTrackType}
40     */
41    static constexpr std::string_view MD_KEY_TRACK_TYPE = "track_type";
42
43    /**
44     * Key for codec mime type, value type is string
45     */
46    static constexpr std::string_view MD_KEY_CODEC_MIME = "codec_mime";
47
48    /**
49     * Key for codec name, value type is string
50     */
51    static constexpr std::string_view MD_KEY_CODEC_NAME = "codec_name";
52
53    /**
54     * Key for duration, value type is int64_t
55     */
56    static constexpr std::string_view MD_KEY_DURATION = "duration";
57
58    /**
59     * Key for bitrate, value type is int64_t
60     */
61    static constexpr std::string_view MD_KEY_BITRATE = "bitrate";
62
63    /**
64     * Key for max input size, value type is uint32_t
65     */
66    static constexpr std::string_view MD_KEY_MAX_INPUT_SIZE = "max_input_size";
67
68    /**
69     * Key for max input buffer count, value type is int32_t
70     */
71    static constexpr std::string_view MD_KEY_MAX_INPUT_BUFFER_COUNT = "max_input_buffer_count";
72
73    /**
74     * Key for max output buffer count, value type is int32_t
75     */
76    static constexpr std::string_view MD_KEY_MAX_OUTPUT_BUFFER_COUNT = "max_output_buffer_count";
77
78    /**
79     * Key for video width, value type is int32_t
80     */
81    static constexpr std::string_view MD_KEY_WIDTH = "width";
82
83    /**
84     * Key for video height, value type is int32_t
85     */
86    static constexpr std::string_view MD_KEY_HEIGHT = "height";
87
88    /**
89     * Key for video pixelformat, value type is int32_t, see {link @MediaPixelFormat}
90     */
91    static constexpr std::string_view MD_KEY_PIXEL_FORMAT = "pixel_format";
92
93    /**
94     * Key for video scale type, value type is int32_t
95     */
96    static constexpr std::string_view MD_KEY_SCALE_TYPE = "scale_type";
97
98    /**
99     * Key for video rotation angle, value type is int32_t
100     */
101    static constexpr std::string_view MD_KEY_ROTATION_ANGLE = "rotation_angle";
102
103    /**
104     * Key for video frame rate, value type is double.
105     */
106    static constexpr std::string_view MD_KEY_FRAME_RATE = "frame_rate";
107
108    /**
109     * Key for video capture rate, value type is double
110     */
111    static constexpr std::string_view MD_KEY_CAPTURE_RATE = "capture_rate";
112
113    /**
114     * Key for the interval of key frame. value type is int32_t, the unit is milliseconds.
115     * A negative value means no key frames are requested after the first frame. A zero
116     * value means a stream containing all key frames is requested.
117     */
118    static constexpr std::string_view MD_KEY_I_FRAME_INTERVAL = "i_frame_interval";
119
120    /**
121     * Key for the request a I-Frame immediately. value type is boolean
122     */
123    static constexpr std::string_view MD_KEY_REQUEST_I_FRAME = "req_i_frame";
124
125    /**
126     * Key for video YUV value range flag, value type is bool
127     */
128    static constexpr std::string_view MD_KEY_RANGE_FLAG = "range_flag";
129
130    /**
131     * Key for video color primaries, value type is int32_t, see {link @ColorPrimary}
132     */
133    static constexpr std::string_view MD_KEY_COLOR_PRIMARIES = "color_primaries";
134
135    /**
136     * Key for video transfer characteristics, value type is int32_t, see {link @TransferCharacteristic}
137     */
138    static constexpr std::string_view MD_KEY_TRANSFER_CHARACTERISTICS = "transfer_characteristics";
139
140    /**
141     * Key for video maxtrix coefficients, value type is int32_t, see {link @MaxtrixCoefficient}
142     */
143    static constexpr std::string_view MD_KEY_MATRIX_COEFFICIENTS = "matrix_coefficients";
144
145    /**
146     * Key for video encode bitrate mode, the value type is int32_t, see {link @VideoEncodeBitrateMode}
147     */
148    static constexpr std::string_view MD_KEY_VIDEO_ENCODE_BITRATE_MODE = "video_encode_bitrate_mode";
149
150    /**
151     * Key for video encode temporal scalability, the value type is int32_t
152     */
153    static constexpr std::string_view OH_MD_KEY_VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY =
154        "video_encoder_enable_temporal_scalability";
155
156    /**
157     * Key for encode profile, the value type is int32_t
158     */
159    static constexpr std::string_view MD_KEY_PROFILE = "codec_profile";
160
161    /**
162     * key for the desired encoding quality, the value type is uint32_t, this key is only supported for encoders that
163     * are configured in constant quality mode
164     */
165    static constexpr std::string_view MD_KEY_QUALITY = "quality";
166
167    /**
168     * Key for audio channel count, value type is uint32_t
169     */
170    static constexpr std::string_view MD_KEY_CHANNEL_COUNT = "channel_count";
171
172    /**
173     * Key for audio sample rate, value type is uint32_t
174     */
175    static constexpr std::string_view MD_KEY_SAMPLE_RATE = "sample_rate";
176
177    /**
178     * Key for track count, value type is uint32_t
179     */
180    static constexpr std::string_view MD_KEY_TRACK_COUNT = "track_count";
181
182    /**
183     * custom key prefix, media service will pass through to HAL.
184     */
185    static constexpr std::string_view MD_KEY_CUSTOM_PREFIX = "vendor.custom";
186
187    /**
188     * Key for codec specific data buffer, vlaue type is uint8_t*
189     */
190    static constexpr std::string_view MD_KEY_CODEC_CONFIG = "codec_config";
191
192    /**
193     * Key for audio channel layout, value type is int64_t
194     */
195    static constexpr std::string_view MD_KEY_CHANNEL_LAYOUT = "channel_layout";
196
197    /**
198     * Key for audio sample format, value type is uint32_t
199     */
200    static constexpr std::string_view MD_KEY_AUDIO_SAMPLE_FORMAT = "audio_sample_format";
201
202    /**
203     * Key for the number of bits used to encode each sample, value type is uint32_t
204     */
205    static constexpr std::string_view MD_KEY_BITS_PER_CODED_SAMPLE = "bits_per_coded_sample";
206
207    /**
208     * Key for aac type, value type is uint32_t
209     */
210    static constexpr std::string_view MD_KEY_AAC_IS_ADTS = "aac_is_adts";
211
212    /**
213     * Key for aac sbr, value type is uint32_t
214     */
215    static constexpr std::string_view MD_KEY_SBR = "sbr";
216
217    /**
218     * Key for compliance level, value type is int32_t
219     */
220    static constexpr std::string_view MD_KEY_COMPLIANCE_LEVEL = "compliance_level";
221
222    /**
223     * Key for vorbis identification header, value type is uint8_t*
224     */
225    static constexpr std::string_view MD_KEY_IDENTIFICATION_HEADER = "identification_header";
226
227    /**
228     * Key for vorbis setup header, value type is uint8_t*
229     */
230    static constexpr std::string_view MD_KEY_SETUP_HEADER = "setup_header";
231
232    /**
233     * Key for audio frame size, means samples per frame, value type is int32_t*
234     */
235    static constexpr std::string_view MD_KEY_AUDIO_SAMPLES_PER_FRAME = "audio_samples_per_frame";
236
237    /**
238     * Key for Number of delayed video frames, value type is uint32_t
239     */
240    static constexpr std::string_view MD_KEY_VIDEO_DELAY = "video_delay";
241
242    /**
243     * Key for codec compression leve, value type is uint32_t
244     */
245    static constexpr std::string_view MD_KEY_COMPRESSION_LEVEL = "audio_compression_level";
246
247    /**
248     * Key for encode level, value type is int32_t
249     */
250    static constexpr std::string_view MD_KEY_LEVEL = "codec_level";
251
252    /**
253     * Key for video chroma location, value type is int32_t
254     */
255    static constexpr std::string_view MD_KEY_CHROMA_LOCATION = "chroma_location";
256
257    /**
258     * Key for cover of file, value type is uint8_t pointer
259     */
260    static constexpr std::string_view MD_KEY_COVER = "cover";
261
262    /**
263     * Key for video is hdr vivid, value type is bool
264     */
265    static constexpr std::string_view MD_KEY_VIDEO_IS_HDR_VIVID = "video_is_hdr_vivid";
266
267    /**
268     * Key for hdr vivid video cuvv configuration box, value type is uint8_t*
269     */
270    static constexpr std::string_view MD_KEY_VIDEO_CUVV_CONFIG_BOX = "cuvv_config_box";
271
272    /**
273     * Key for timed metadata track data type, value type is string
274     */
275    static constexpr std::string_view MD_KEY_TIMED_METADATA_KEY = "timed_metadata_key";
276
277    /**
278     * Key for timed metadata source track id, value type is int32_t
279     */
280    static constexpr std::string_view MD_KEY_TIMED_METADATA_SRC_TRACK_ID = "timed_metadata_track_id";
281
282    /**
283     * Key for video color space of the video decoder output, value type is int32_t. See OH_NativeBuffer_ColorSpace for
284     * value, and only OH_COLORSPACE_BT709_LIMIT is valid.
285     */
286    static constexpr std::string_view MD_KEY_VIDEO_DECODER_OUTPUT_COLOR_SPACE = "video_decoder_output_colorspace";
287private:
288    MediaDescriptionKey() = delete;
289    ~MediaDescriptionKey() = delete;
290};
291
292/**
293 * @brief
294 *
295 * @since 4.0
296 * @version 4.0
297 */
298enum ColorPrimary : int32_t {
299    COLOR_PRIMARY_BT709 = 1,
300    COLOR_PRIMARY_UNSPECIFIED = 2,
301    COLOR_PRIMARY_BT470_M = 4,
302    COLOR_PRIMARY_BT601_625 = 5,
303    COLOR_PRIMARY_BT601_525 = 6,
304    COLOR_PRIMARY_SMPTE_ST240 = 7,
305    COLOR_PRIMARY_GENERIC_FILM = 8,
306    COLOR_PRIMARY_BT2020 = 9,
307    COLOR_PRIMARY_SMPTE_ST428 = 10,
308    COLOR_PRIMARY_P3DCI = 11,
309    COLOR_PRIMARY_P3D65 = 12,
310};
311
312/**
313 * @brief
314 *
315 * @since 4.0
316 * @version 4.0
317 */
318enum TransferCharacteristic : int32_t {
319    TRANSFER_CHARACTERISTIC_BT709 = 1,
320    TRANSFER_CHARACTERISTIC_UNSPECIFIED = 2,
321    TRANSFER_CHARACTERISTIC_GAMMA_2_2 = 4,
322    TRANSFER_CHARACTERISTIC_GAMMA_2_8 = 5,
323    TRANSFER_CHARACTERISTIC_BT601 = 6,
324    TRANSFER_CHARACTERISTIC_SMPTE_ST240 = 7,
325    TRANSFER_CHARACTERISTIC_LINEAR = 8,
326    TRANSFER_CHARACTERISTIC_LOG = 9,
327    TRANSFER_CHARACTERISTIC_LOG_SQRT = 10,
328    TRANSFER_CHARACTERISTIC_IEC_61966_2_4 = 11,
329    TRANSFER_CHARACTERISTIC_BT1361 = 12,
330    TRANSFER_CHARACTERISTIC_IEC_61966_2_1 = 13,
331    TRANSFER_CHARACTERISTIC_BT2020_10BIT = 14,
332    TRANSFER_CHARACTERISTIC_BT2020_12BIT = 15,
333    TRANSFER_CHARACTERISTIC_PQ = 16,
334    TRANSFER_CHARACTERISTIC_SMPTE_ST428 = 17,
335    TRANSFER_CHARACTERISTIC_HLG = 18,
336};
337
338/**
339 * @brief
340 *
341 * @since 4.0
342 * @version 4.0
343 */
344enum MatrixCoefficient : int32_t {
345    MATRIX_COEFFICIENT_IDENTITY = 0,
346    MATRIX_COEFFICIENT_BT709 = 1,
347    MATRIX_COEFFICIENT_UNSPECIFIED = 2,
348    MATRIX_COEFFICIENT_FCC = 4,
349    MATRIX_COEFFICIENT_BT601_625 = 5,
350    MATRIX_COEFFICIENT_BT601_525 = 6,
351    MATRIX_COEFFICIENT_SMPTE_ST240 = 7,
352    MATRIX_COEFFICIENT_YCGCO = 8,
353    MATRIX_COEFFICIENT_BT2020_NCL = 9,
354    MATRIX_COEFFICIENT_BT2020_CL = 10,
355    MATRIX_COEFFICIENT_SMPTE_ST2085 = 11,
356    MATRIX_COEFFICIENT_CHROMATICITY_NCL = 12,
357    MATRIX_COEFFICIENT_CHROMATICITY_CL = 13,
358    MATRIX_COEFFICIENT_ICTCP = 14,
359};
360
361/**
362 * @brief
363 *
364 * @since 4.0
365 * @version 4.0
366 */
367enum ChromaLocation {
368    CHROMA_LOC_UNSPECIFIED = 0,
369    CHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0
370    CHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0
371    CHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2
372    CHROMA_LOC_TOP = 4,
373    CHROMA_LOC_BOTTOMLEFT = 5,
374    CHROMA_LOC_BOTTOM = 6,
375};
376} // namespace MediaAVCodec
377} // namespace OHOS
378#endif // MEDIA_AVCODEC_DESCRIPTION_H
379