1 /*
2  * Copyright (C) 2016 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 
17 #ifndef C2CONFIG_H_
18 #define C2CONFIG_H_
19 
20 #include <C2Component.h>
21 #include <C2Enum.h>
22 #include <C2ParamDef.h>
23 
24 /// \defgroup config Component configuration
25 /// @{
26 
27 /**
28  * Enumerated boolean.
29  */
30 C2ENUM(c2_bool_t, uint32_t,
31     C2_FALSE, ///< true
32     C2_TRUE,  ///< false
33 )
34 
35 typedef C2SimpleValueStruct<c2_bool_t> C2BoolValue;
36 
37 typedef C2SimpleValueStruct<C2EasyEnum<c2_bool_t>> C2EasyBoolValue;
38 
39 /**
40  * Enumerated set tri-state.
41  *
42  * Used for optional configurations to distinguish between values set by the client,
43  * default values set by the component, or unset values.
44  */
45 C2ENUM(c2_set_t, uint32_t,
46     C2_UNSET,   // parameter is unset and has no value
47     C2_SET,     // parameter is/has been set by the client
48     C2_DEFAULT, // parameter has not been set by the client, but is set by the component
49 )
50 
51 /** Enumerations used by configuration parameters */
52 struct C2Config {
53     enum aac_packaging_t : uint32_t;        ///< AAC packaging (RAW vs ADTS)
54     enum api_feature_t : uint64_t;          ///< API features
55     enum api_level_t : uint32_t;            ///< API level
56     enum bitrate_mode_t : uint32_t;         ///< bitrate control mode
57     enum intra_refresh_mode_t : uint32_t;   ///< intra refresh modes
58     enum level_t : uint32_t;                ///< coding level
59     enum ordinal_key_t : uint32_t;          ///< work ordering keys
60     enum pcm_encoding_t : uint32_t;         ///< PCM encoding
61     enum picture_type_t : uint32_t;         ///< picture types
62     enum platform_feature_t : uint64_t;     ///< platform features
63     enum platform_level_t : uint32_t;       ///< platform level
64     enum prepend_header_mode_t : uint32_t;  ///< prepend header operational modes
65     enum profile_t : uint32_t;              ///< coding profile
66     enum scaling_method_t : uint32_t;       ///< scaling methods
67     enum scan_order_t : uint32_t;           ///< scan orders
68     enum secure_mode_t : uint32_t;          ///< secure/protected modes
69     enum supplemental_info_t : uint32_t;    ///< supplemental information types
70     enum tiling_mode_t : uint32_t;          ///< tiling modes
71 };
72 
73 namespace {
74 
75 enum C2ParamIndexKind : C2Param::type_index_t {
76     C2_PARAM_INDEX_INVALID             = 0x0,    ///< do not use
77     C2_PARAM_INDEX_STRUCT_START        = 0x1,    ///< struct only indices
78     C2_PARAM_INDEX_PARAM_START         = 0x800,  ///< regular parameters
79     C2_PARAM_INDEX_CODER_PARAM_START   = 0x1000, ///< en/transcoder parameters
80     C2_PARAM_INDEX_PICTURE_PARAM_START = 0x1800, ///< image/video parameters
81     C2_PARAM_INDEX_VIDEO_PARAM_START   = 0x2000, ///< video parameters
82     C2_PARAM_INDEX_IMAGE_PARAM_START   = 0x2800, ///< image parameters
83     C2_PARAM_INDEX_AUDIO_PARAM_START   = 0x3000, ///< image parameters
84     C2_PARAM_INDEX_PLATFORM_START      = 0x4000, ///< platform-defined parameters
85 
86     /* =================================== structure indices =================================== */
87 
88     kParamIndexColorXy = C2_PARAM_INDEX_STRUCT_START,
89     kParamIndexMasteringDisplayColorVolume,
90     kParamIndexChromaOffset,
91     kParamIndexGopLayer,
92 
93     /* =================================== parameter indices =================================== */
94 
95     kParamIndexApiLevel = C2_PARAM_INDEX_PARAM_START,
96     kParamIndexApiFeatures,
97 
98     /* ------------------------------------ all components ------------------------------------ */
99 
100     /* generic component characteristics */
101     kParamIndexName,
102     kParamIndexAliases,
103     kParamIndexKind,
104     kParamIndexDomain,
105     kParamIndexAttributes,
106     kParamIndexTimeStretch,
107 
108     /* coding characteristics */
109     kParamIndexProfileLevel,
110     kParamIndexInitData,
111     kParamIndexSupplementalData,
112     kParamIndexSubscribedSupplementalData,
113 
114     /* pipeline characteristics */
115     kParamIndexMediaType,
116     kParamIndexDelayRequest,
117     kParamIndexDelay,
118     kParamIndexMaxReferenceAge,
119     kParamIndexMaxReferenceCount,
120     kParamIndexReorderBufferDepth,
121     kParamIndexReorderKey,
122     kParamIndexStreamCount,
123     kParamIndexSubscribedParamIndices,
124     kParamIndexSuggestedBufferCount,
125     kParamIndexBatchSize,
126     kParamIndexCurrentWork,
127     kParamIndexLastWorkQueued,
128 
129     /* memory allocation */
130     kParamIndexAllocators,
131     kParamIndexBlockPools,
132     kParamIndexBufferType,
133     kParamIndexUsage,
134     kParamIndexOutOfMemory,
135     kParamIndexMaxBufferSize,
136 
137     /* misc. state */
138     kParamIndexTripped,
139     kParamIndexConfigCounter,
140 
141     /* resources */
142     kParamIndexResourcesNeeded,
143     kParamIndexResourcesReserved,
144     kParamIndexOperatingRate,
145     kParamIndexRealTimePriority,
146 
147     /* protected content */
148     kParamIndexSecureMode,
149 
150     /* ------------------------------------ (trans/en)coders ------------------------------------ */
151 
152     kParamIndexBitrate = C2_PARAM_INDEX_CODER_PARAM_START,
153     kParamIndexBitrateMode,
154     kParamIndexQuality,
155     kParamIndexComplexity,
156     kParamIndexPrependHeaderMode,
157 
158     /* --------------------------------- image/video components --------------------------------- */
159 
160     kParamIndexPictureSize = C2_PARAM_INDEX_PICTURE_PARAM_START,
161     kParamIndexCropRect,
162     kParamIndexPixelFormat,
163     kParamIndexRotation,
164     kParamIndexPixelAspectRatio,
165     kParamIndexScaledPictureSize,
166     kParamIndexScaledCropRect,
167     kParamIndexScalingMethod,
168     kParamIndexColorInfo,
169     kParamIndexColorAspects,
170     kParamIndexHdrStaticMetadata,
171     kParamIndexDefaultColorAspects,
172 
173     kParamIndexBlockSize,
174     kParamIndexBlockCount,
175     kParamIndexBlockRate,
176 
177     kParamIndexPictureTypeMask,
178     kParamIndexPictureType,
179 
180     /* ------------------------------------ video components ------------------------------------ */
181 
182     kParamIndexFrameRate = C2_PARAM_INDEX_VIDEO_PARAM_START,
183     kParamIndexMaxBitrate,
184     kParamIndexMaxFrameRate,
185     kParamIndexMaxPictureSize,
186     kParamIndexGop,
187     kParamIndexSyncFramePeriod,
188     kParamIndexRequestSyncFrame,
189     kParamIndexTemporalLayering,
190     kParamIndexLayerIndex,
191     kParamIndexLayerCount,
192     kParamIndexIntraRefresh,
193 
194     /* ------------------------------------ image components ------------------------------------ */
195 
196     kParamIndexTileLayout = C2_PARAM_INDEX_IMAGE_PARAM_START,
197     kParamIndexTileHandling,
198 
199     /* ------------------------------------ audio components ------------------------------------ */
200 
201     kParamIndexSampleRate = C2_PARAM_INDEX_AUDIO_PARAM_START,
202     kParamIndexChannelCount,
203     kParamIndexPcmEncoding,
204     kParamIndexAacPackaging,
205 
206     /* ============================== platform-defined parameters ============================== */
207 
208     kParamIndexPlatformLevel = C2_PARAM_INDEX_PLATFORM_START, // all, u32
209     kParamIndexPlatformFeatures, // all, u64 mask
210     kParamIndexStoreIonUsage, // store, struct
211     kParamIndexAspectsToDataSpace, // store, struct
212     kParamIndexDataSpaceToAspects, // store, struct
213     kParamIndexDataSpace, // u32
214     kParamIndexSurfaceScaling, // u32
215 
216     // input surface
217     kParamIndexInputSurfaceEos, // input-surface, eos
218     kParamIndexStartAt, // input-surface, u64
219     kParamIndexSuspendAt, // input-surface, u64
220     kParamIndexResumeAt, // input-surface, u64
221     kParamIndexStopAt, // input-surface, u64
222     kParamIndexTimeOffset, // input-surface, u64
223     kParamIndexMinFrameRate, // input-surface, float
224 
225     // deprecated indices due to renaming
226     kParamIndexAacStreamFormat = kParamIndexAacPackaging,
227     kParamIndexCsd = kParamIndexInitData,
228     kParamIndexMaxVideoSizeHint = kParamIndexMaxPictureSize,
229     kParamIndexMime = kParamIndexMediaType,
230     kParamIndexRequestedInfos = kParamIndexSubscribedParamIndices,
231 
232 
233     // deprecated indices due to removal
234     kParamIndexSupportedParams = 0xDEAD0000,
235     kParamIndexReadOnlyParams,
236     kParamIndexTemporal,
237 };
238 
239 }
240 
241 /**
242  * Codec 2.0 parameter types follow the following naming convention:
243  *
244  * C2<group><domain><index><type>
245  *
246  * E.g. C2StreamPictureSizeInfo: group="" domain="Stream" index="PictureSize" type="Info".
247  * Group is somewhat arbitrary, but denotes kind of objects the parameter is defined.
248  * At this point we use Component and Store to distinguish basic component/store parameters.
249  *
250  * Parameter keys are named C2_PARAMKEY_[<group>_]<domain>_<index> as type is not expected
251  * to distinguish parameters. E.g. a component could change the type of the parameter and it
252  * is not expected users would need to change the key.
253  */
254 
255 /* ----------------------------------------- API level ----------------------------------------- */
256 
257 enum C2Config::api_level_t : uint32_t {
258     API_L0_1 = 0,   ///< support for API level 0.1
259 };
260 
261 // read-only
262 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_level_t>, kParamIndexApiLevel>
263         C2ApiLevelSetting;
264 constexpr char C2_PARAMKEY_API_LEVEL[] = "api.level";
265 
266 enum C2Config::api_feature_t : uint64_t {
267     API_REFLECTION       = (1U << 0),  ///< ability to list supported parameters
268     API_VALUES           = (1U << 1),  ///< ability to list supported values for each parameter
269     API_CURRENT_VALUES   = (1U << 2),  ///< ability to list currently supported values for each parameter
270     API_DEPENDENCY       = (1U << 3),  ///< have a defined parameter dependency
271 
272     API_STREAMS          = (1ULL << 32),  ///< supporting variable number of streams
273 
274     API_TUNNELING        = (1ULL << 48),  ///< tunneling API
275 };
276 
277 // read-only
278 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_feature_t>, kParamIndexApiFeatures>
279         C2ApiFeaturesSetting;
280 constexpr char C2_PARAMKEY_API_FEATURES[] = "api.features";
281 
282 /* ----------------------------- generic component characteristics ----------------------------- */
283 
284 /**
285  * The name of the component.
286  *
287  * This must contain only alphanumeric characters or dot '.', hyphen '-', plus '+', or
288  * underline '_'. The name of each component must be unique.
289  *
290  * For Android: Component names must start with 'c2.' followed by the company name or abbreviation
291  * and another dot, e.g. 'c2.android.'. Use of lowercase is preferred but not required.
292  */
293 // read-only
294 typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexName> C2ComponentNameSetting;
295 constexpr char C2_PARAMKEY_COMPONENT_NAME[]  = "component.name";
296 
297 /**
298  * Alternate names (aliases) of the component.
299  *
300  * This is a comma ',' separated list of alternate component names. Unlike component names that
301  * must be unique, multiple components can have the same alias.
302  */
303 // read-only
304 typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexAliases> C2ComponentAliasesSetting;
305 constexpr char C2_PARAMKEY_COMPONENT_ALIASES[]  = "component.aliases";
306 
307 /**
308  * Component kind.
309  */
310 // read-only
311 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::kind_t>, kParamIndexKind>
312         C2ComponentKindSetting;
313 constexpr char C2_PARAMKEY_COMPONENT_KIND[]  = "component.kind";
314 
315 /**
316  * Component domain.
317  */
318 // read-only
319 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::domain_t>, kParamIndexDomain>
320         C2ComponentDomainSetting;
321 typedef C2ComponentDomainSetting C2ComponentDomainInfo; // deprecated
322 typedef C2Component::domain_t C2DomainKind; // deprecated
323 constexpr char C2_PARAMKEY_COMPONENT_DOMAIN[]  = "component.domain";
324 
325 constexpr C2Component::domain_t C2DomainAudio = C2Component::DOMAIN_AUDIO; // deprecated
326 constexpr C2Component::domain_t C2DomainOther = C2Component::DOMAIN_OTHER; // deprecate
327 constexpr C2Component::domain_t C2DomainVideo = C2Component::DOMAIN_VIDEO; // deprecate
328 
329 /**
330  * Component attributes.
331  *
332  * These are a set of flags provided by the component characterizing its processing algorithm.
333  */
334 C2ENUM(C2Component::attrib_t, uint64_t,
335     ATTRIB_IS_TEMPORAL = 1u << 0, ///< component input ordering matters for processing
336 )
337 
338 // read-only
339 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::attrib_t>, kParamIndexAttributes>
340         C2ComponentAttributesSetting;
341 constexpr char C2_PARAMKEY_COMPONENT_ATTRIBUTES[] = "component.attributes";
342 
343 // deprecated
344 typedef C2ComponentAttributesSetting C2ComponentTemporalInfo;
345 
346 /**
347  * Time stretching.
348  *
349  * This is the ratio between the rate of the input timestamp, and the rate of the output timestamp.
350  * E.g. if this is 4.0, for every 4 seconds of input timestamp difference, the output shall differ
351  * by 1 seconds.
352  */
353 typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexTimeStretch> C2ComponentTimeStretchTuning;
354 constexpr char C2_PARAMKEY_TIME_STRETCH[]  = "algo.time-stretch";
355 
356 /* ----------------------------------- coding characteristics ----------------------------------- */
357 
358 /**
359  * Profile and level.
360  *
361  * Profile determines the tools used by the component.
362  * Level determines the level of resources used by the component.
363  */
364 
365 namespace {
366 
367 enum : uint32_t {
368     _C2_PL_MP2V_BASE = 0x1000,
369     _C2_PL_AAC_BASE  = 0x2000,
370     _C2_PL_H263_BASE = 0x3000,
371     _C2_PL_MP4V_BASE = 0x4000,
372     _C2_PL_AVC_BASE  = 0x5000,
373     _C2_PL_HEVC_BASE = 0x6000,
374     _C2_PL_VP9_BASE  = 0x7000,
375     _C2_PL_DV_BASE   = 0x8000,
376 
377     C2_PROFILE_LEVEL_VENDOR_START = 0x70000000,
378 };
379 
380 }
381 
382 enum C2Config::profile_t : uint32_t {
383     PROFILE_UNUSED = 0,                         ///< profile is not used by this media type
384 
385     // AAC (MPEG-2 Part 7 and MPEG-4 Part 3) profiles
386     PROFILE_AAC_LC = _C2_PL_AAC_BASE,           ///< AAC Low-Complexity
387     PROFILE_AAC_MAIN,                           ///< AAC Main
388     PROFILE_AAC_SSR,                            ///< AAC Scalable Sampling Rate
389     PROFILE_AAC_LTP,                            ///< AAC Long Term Prediction
390     PROFILE_AAC_HE,                             ///< AAC High-Efficiency
391     PROFILE_AAC_SCALABLE,                       ///< AAC Scalable
392     PROFILE_AAC_ER_LC,                          ///< AAC Error Resilient Low-Complexity
393     PROFILE_AAC_ER_SCALABLE,                    ///< AAC Error Resilient Scalable
394     PROFILE_AAC_LD,                             ///< AAC Low Delay
395     PROFILE_AAC_HE_PS,                          ///< AAC High-Efficiency Parametric Stereo
396     PROFILE_AAC_ELD,                            ///< AAC Enhanced Low Delay
397     PROFILE_AAC_XHE,                            ///< AAC Extended High-Efficiency
398 
399     // MPEG-2 Video profiles
400     PROFILE_MP2V_SIMPLE = _C2_PL_MP2V_BASE,     ///< MPEG-2 Video (H.262) Simple
401     PROFILE_MP2V_MAIN,                          ///< MPEG-2 Video (H.262) Main
402     PROFILE_MP2V_SNR_SCALABLE,                  ///< MPEG-2 Video (H.262) SNR Scalable
403     PROFILE_MP2V_SPATIALLY_SCALABLE,            ///< MPEG-2 Video (H.262) Spatially Scalable
404     PROFILE_MP2V_HIGH,                          ///< MPEG-2 Video (H.262) High
405     PROFILE_MP2V_422,                           ///< MPEG-2 Video (H.262) 4:2:2
406     PROFILE_MP2V_MULTIVIEW,                     ///< MPEG-2 Video (H.262) Multi-view
407 
408     // H.263 profiles
409     PROFILE_H263_BASELINE = _C2_PL_H263_BASE,   ///< H.263 Baseline (Profile 0)
410     PROFILE_H263_H320,                          ///< H.263 H.320 Coding Efficiency Version 2 Backward-Compatibility (Profile 1)
411     PROFILE_H263_V1BC,                          ///< H.263 Version 1 Backward-Compatibility (Profile 2)
412     PROFILE_H263_ISWV2,                         ///< H.263 Version 2 Interactive and Streaming Wireless (Profile 3)
413     PROFILE_H263_ISWV3,                         ///< H.263 Version 3 Interactive and Streaming Wireless (Profile 4)
414     PROFILE_H263_HIGH_COMPRESSION,              ///< H.263 Conversational High Compression (Profile 5)
415     PROFILE_H263_INTERNET,                      ///< H.263 Conversational Internet (Profile 6)
416     PROFILE_H263_INTERLACE,                     ///< H.263 Conversational Interlace (Profile 7)
417     PROFILE_H263_HIGH_LATENCY,                  ///< H.263 High Latency (Profile 8)
418 
419     // MPEG-4 Part 2 (Video) Natural Visual Profiles
420     PROFILE_MP4V_SIMPLE,                        ///< MPEG-4 Video Simple
421     PROFILE_MP4V_SIMPLE_SCALABLE,               ///< MPEG-4 Video Simple Scalable
422     PROFILE_MP4V_CORE,                          ///< MPEG-4 Video Core
423     PROFILE_MP4V_MAIN,                          ///< MPEG-4 Video Main
424     PROFILE_MP4V_NBIT,                          ///< MPEG-4 Video N-Bit
425     PROFILE_MP4V_ARTS,                          ///< MPEG-4 Video Advanced Realtime Simple
426     PROFILE_MP4V_CORE_SCALABLE,                 ///< MPEG-4 Video Core Scalable
427     PROFILE_MP4V_ACE,                           ///< MPEG-4 Video Advanced Coding Efficiency
428     PROFILE_MP4V_ADVANCED_CORE,                 ///< MPEG-4 Video Advanced Core
429     PROFILE_MP4V_SIMPLE_STUDIO,                 ///< MPEG-4 Video Simple Studio
430     PROFILE_MP4V_CORE_STUDIO,                   ///< MPEG-4 Video Core Studio
431     PROFILE_MP4V_ADVANCED_SIMPLE,               ///< MPEG-4 Video Advanced Simple
432     PROFILE_MP4V_FGS,                           ///< MPEG-4 Video Fine Granularity Scalable
433 
434     // AVC / MPEG-4 Part 10 (H.264) profiles
435     PROFILE_AVC_BASELINE = _C2_PL_AVC_BASE,     ///< AVC (H.264) Baseline
436     PROFILE_AVC_CONSTRAINED_BASELINE,           ///< AVC (H.264) Constrained Baseline
437     PROFILE_AVC_MAIN,                           ///< AVC (H.264) Main
438     PROFILE_AVC_EXTENDED,                       ///< AVC (H.264) Extended
439     PROFILE_AVC_HIGH,                           ///< AVC (H.264) High
440     PROFILE_AVC_PROGRESSIVE_HIGH,               ///< AVC (H.264) Progressive High
441     PROFILE_AVC_CONSTRAINED_HIGH,               ///< AVC (H.264) Constrained High
442     PROFILE_AVC_HIGH_10,                        ///< AVC (H.264) High 10
443     PROFILE_AVC_PROGRESSIVE_HIGH_10,            ///< AVC (H.264) Progressive High 10
444     PROFILE_AVC_HIGH_422,                       ///< AVC (H.264) High 4:2:2
445     PROFILE_AVC_HIGH_444_PREDICTIVE,            ///< AVC (H.264) High 4:4:4 Predictive
446     PROFILE_AVC_HIGH_10_INTRA,                  ///< AVC (H.264) High 10 Intra
447     PROFILE_AVC_HIGH_422_INTRA,                 ///< AVC (H.264) High 4:2:2 Intra
448     PROFILE_AVC_HIGH_444_INTRA,                 ///< AVC (H.264) High 4:4:4 Intra
449     PROFILE_AVC_CAVLC_444_INTRA,                ///< AVC (H.264) CAVLC 4:4:4 Intra
450     PROFILE_AVC_SCALABLE_BASELINE = _C2_PL_AVC_BASE + 0x100,  ///< AVC (H.264) Scalable Baseline
451     PROFILE_AVC_SCALABLE_CONSTRAINED_BASELINE,  ///< AVC (H.264) Scalable Constrained Baseline
452     PROFILE_AVC_SCALABLE_HIGH,                  ///< AVC (H.264) Scalable High
453     PROFILE_AVC_SCALABLE_CONSTRAINED_HIGH,      ///< AVC (H.264) Scalable Constrained High
454     PROFILE_AVC_SCALABLE_HIGH_INTRA,            ///< AVC (H.264) Scalable High Intra
455     PROFILE_AVC_MULTIVIEW_HIGH = _C2_PL_AVC_BASE + 0x200,  ///< AVC (H.264) Multiview High
456     PROFILE_AVC_STEREO_HIGH,                    ///< AVC (H.264) Stereo High
457     PROFILE_AVC_MFC_HIGH,                       ///< AVC (H.264) MFC High
458     PROFILE_AVC_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x300,  ///< AVC (H.264) Multiview Depth High
459     PROFILE_AVC_MFC_DEPTH_HIGH,                 ///< AVC (H.264) MFC Depth High
460     PROFILE_AVC_ENHANCED_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x400,  ///< AVC (H.264) Enhanced Multiview Depth High
461 
462     // HEVC profiles
463     PROFILE_HEVC_MAIN = _C2_PL_HEVC_BASE,       ///< HEVC (H.265) Main
464     PROFILE_HEVC_MAIN_10,                       ///< HEVC (H.265) Main 10
465     PROFILE_HEVC_MAIN_STILL,                    ///< HEVC (H.265) Main Still Picture
466     PROFILE_HEVC_MONO = _C2_PL_HEVC_BASE + 0x100,  ///< HEVC (H.265) Monochrome
467     PROFILE_HEVC_MONO_12,                       ///< HEVC (H.265) Monochrome 12
468     PROFILE_HEVC_MONO_16,                       ///< HEVC (H.265) Monochrome 16
469     PROFILE_HEVC_MAIN_12,                       ///< HEVC (H.265) Main 12
470     PROFILE_HEVC_MAIN_422_10,                   ///< HEVC (H.265) Main 4:2:2 10
471     PROFILE_HEVC_MAIN_422_12,                   ///< HEVC (H.265) Main 4:2:2 12
472     PROFILE_HEVC_MAIN_444,                      ///< HEVC (H.265) Main 4:4:4
473     PROFILE_HEVC_MAIN_444_10,                   ///< HEVC (H.265) Main 4:4:4 10
474     PROFILE_HEVC_MAIN_444_12,                   ///< HEVC (H.265) Main 4:4:4 12
475     PROFILE_HEVC_MAIN_INTRA,                    ///< HEVC (H.265) Main Intra
476     PROFILE_HEVC_MAIN_10_INTRA,                 ///< HEVC (H.265) Main 10 Intra
477     PROFILE_HEVC_MAIN_12_INTRA,                 ///< HEVC (H.265) Main 12 Intra
478     PROFILE_HEVC_MAIN_422_10_INTRA,             ///< HEVC (H.265) Main 4:2:2 10 Intra
479     PROFILE_HEVC_MAIN_422_12_INTRA,             ///< HEVC (H.265) Main 4:2:2 12 Intra
480     PROFILE_HEVC_MAIN_444_INTRA,                ///< HEVC (H.265) Main 4:4:4 Intra
481     PROFILE_HEVC_MAIN_444_10_INTRA,             ///< HEVC (H.265) Main 4:4:4 10 Intra
482     PROFILE_HEVC_MAIN_444_12_INTRA,             ///< HEVC (H.265) Main 4:4:4 12 Intra
483     PROFILE_HEVC_MAIN_444_16_INTRA,             ///< HEVC (H.265) Main 4:4:4 16 Intra
484     PROFILE_HEVC_MAIN_444_STILL,                ///< HEVC (H.265) Main 4:4:4 Still Picture
485     PROFILE_HEVC_MAIN_444_16_STILL,             ///< HEVC (H.265) Main 4:4:4 16 Still Picture
486     PROFILE_HEVC_HIGH_444 = _C2_PL_HEVC_BASE + 0x200,  ///< HEVC (H.265) High Throughput 4:4:4
487     PROFILE_HEVC_HIGH_444_10,                   ///< HEVC (H.265) High Throughput 4:4:4 10
488     PROFILE_HEVC_HIGH_444_14,                   ///< HEVC (H.265) High Throughput 4:4:4 14
489     PROFILE_HEVC_HIGH_444_16_INTRA,             ///< HEVC (H.265) High Throughput 4:4:4 16 Intra
490     PROFILE_HEVC_SX_MAIN = _C2_PL_HEVC_BASE + 0x300,  ///< HEVC (H.265) Screen-Extended Main
491     PROFILE_HEVC_SX_MAIN_10,                    ///< HEVC (H.265) Screen-Extended Main 10
492     PROFILE_HEVC_SX_MAIN_444,                   ///< HEVC (H.265) Screen-Extended Main 4:4:4
493     PROFILE_HEVC_SX_MAIN_444_10,                ///< HEVC (H.265) Screen-Extended Main 4:4:4 10
494     PROFILE_HEVC_SX_HIGH_444,                   ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4
495     PROFILE_HEVC_SX_HIGH_444_10,                ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 10
496     PROFILE_HEVC_SX_HIGH_444_14,                ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 14
497     PROFILE_HEVC_MULTIVIEW_MAIN = _C2_PL_HEVC_BASE + 0x400,  ///< HEVC (H.265) Multiview Main
498     PROFILE_HEVC_SCALABLE_MAIN = _C2_PL_HEVC_BASE + 0x500,  ///< HEVC (H.265) Scalable Main
499     PROFILE_HEVC_SCALABLE_MAIN_10,              ///< HEVC (H.265) Scalable Main 10
500     PROFILE_HEVC_SCALABLE_MONO = _C2_PL_HEVC_BASE + 0x600,  ///< HEVC (H.265) Scalable Monochrome
501     PROFILE_HEVC_SCALABLE_MONO_12,              ///< HEVC (H.265) Scalable Monochrome 12
502     PROFILE_HEVC_SCALABLE_MONO_16,              ///< HEVC (H.265) Scalable Monochrome 16
503     PROFILE_HEVC_SCALABLE_MAIN_444,             ///< HEVC (H.265) Scalable Main 4:4:4
504     PROFILE_HEVC_3D_MAIN = _C2_PL_HEVC_BASE + 0x700,  ///< HEVC (H.265) 3D Main
505 
506     // VP9 profiles
507     PROFILE_VP9_0 = _C2_PL_VP9_BASE,            ///< VP9 Profile 0 (4:2:0)
508     PROFILE_VP9_1,                              ///< VP9 Profile 1 (4:2:2 or 4:4:4)
509     PROFILE_VP9_2,                              ///< VP9 Profile 2 (4:2:0, 10 or 12 bit)
510     PROFILE_VP9_3,                              ///< VP9 Profile 3 (4:2:2 or 4:4:4, 10 or 12 bit)
511 
512     // Dolby Vision profiles
513     PROFILE_DV_AV_PER = _C2_PL_DV_BASE + 0,     ///< Dolby Vision dvav.per profile (deprecated)
514     PROFILE_DV_AV_PEN,                          ///< Dolby Vision dvav.pen profile (deprecated)
515     PROFILE_DV_HE_DER,                          ///< Dolby Vision dvhe.der profile (deprecated)
516     PROFILE_DV_HE_DEN,                          ///< Dolby Vision dvhe.den profile (deprecated)
517     PROFILE_DV_HE_04 = _C2_PL_DV_BASE + 4,      ///< Dolby Vision dvhe.04 profile
518     PROFILE_DV_HE_05 = _C2_PL_DV_BASE + 5,      ///< Dolby Vision dvhe.05 profile
519     PROFILE_DV_HE_DTH,                          ///< Dolby Vision dvhe.dth profile (deprecated)
520     PROFILE_DV_HE_07 = _C2_PL_DV_BASE + 7,      ///< Dolby Vision dvhe.07 profile
521     PROFILE_DV_HE_08 = _C2_PL_DV_BASE + 8,      ///< Dolby Vision dvhe.08 profile
522     PROFILE_DV_AV_09 = _C2_PL_DV_BASE + 9,      ///< Dolby Vision dvav.09 profile
523 };
524 
525 enum C2Config::level_t : uint32_t {
526     LEVEL_UNUSED = 0,                           ///< level is not used by this media type
527 
528     // MPEG-2 Video levels
529     LEVEL_MP2V_LOW = _C2_PL_MP2V_BASE,          ///< MPEG-2 Video (H.262) Low Level
530     LEVEL_MP2V_MAIN,                            ///< MPEG-2 Video (H.262) Main Level
531     LEVEL_MP2V_HIGH_1440,                       ///< MPEG-2 Video (H.262) High 1440 Level
532     LEVEL_MP2V_HIGH,                            ///< MPEG-2 Video (H.262) High Level
533     LEVEL_MP2V_HIGHP,                           ///< MPEG-2 Video (H.262) HighP Level
534 
535     // H.263 levels
536     LEVEL_H263_10 = _C2_PL_H263_BASE,           ///< H.263 Level 10
537     LEVEL_H263_20,                              ///< H.263 Level 20
538     LEVEL_H263_30,                              ///< H.263 Level 30
539     LEVEL_H263_40,                              ///< H.263 Level 40
540     LEVEL_H263_45,                              ///< H.263 Level 45
541     LEVEL_H263_50,                              ///< H.263 Level 50
542     LEVEL_H263_60,                              ///< H.263 Level 60
543     LEVEL_H263_70,                              ///< H.263 Level 70
544 
545     // MPEG-4 Part 2 (Video) levels
546     LEVEL_MP4V_0 = _C2_PL_MP4V_BASE,            ///< MPEG-4 Video Level 0
547     LEVEL_MP4V_0B,                              ///< MPEG-4 Video Level 0b
548     LEVEL_MP4V_1,                               ///< MPEG-4 Video Level 1
549     LEVEL_MP4V_2,                               ///< MPEG-4 Video Level 2
550     LEVEL_MP4V_3,                               ///< MPEG-4 Video Level 3
551     LEVEL_MP4V_3B,                              ///< MPEG-4 Video Level 3b
552     LEVEL_MP4V_4,                               ///< MPEG-4 Video Level 4
553     LEVEL_MP4V_4A,                              ///< MPEG-4 Video Level 4a
554     LEVEL_MP4V_5,                               ///< MPEG-4 Video Level 5
555     LEVEL_MP4V_6,                               ///< MPEG-4 Video Level 6
556 
557     // AVC / MPEG-4 Part 10 (H.264) levels
558     LEVEL_AVC_1 = _C2_PL_AVC_BASE,              ///< AVC (H.264) Level 1
559     LEVEL_AVC_1B,                               ///< AVC (H.264) Level 1b
560     LEVEL_AVC_1_1,                              ///< AVC (H.264) Level 1.1
561     LEVEL_AVC_1_2,                              ///< AVC (H.264) Level 1.2
562     LEVEL_AVC_1_3,                              ///< AVC (H.264) Level 1.3
563     LEVEL_AVC_2,                                ///< AVC (H.264) Level 2
564     LEVEL_AVC_2_1,                              ///< AVC (H.264) Level 2.1
565     LEVEL_AVC_2_2,                              ///< AVC (H.264) Level 2.2
566     LEVEL_AVC_3,                                ///< AVC (H.264) Level 3
567     LEVEL_AVC_3_1,                              ///< AVC (H.264) Level 3.1
568     LEVEL_AVC_3_2,                              ///< AVC (H.264) Level 3.2
569     LEVEL_AVC_4,                                ///< AVC (H.264) Level 4
570     LEVEL_AVC_4_1,                              ///< AVC (H.264) Level 4.1
571     LEVEL_AVC_4_2,                              ///< AVC (H.264) Level 4.2
572     LEVEL_AVC_5,                                ///< AVC (H.264) Level 5
573     LEVEL_AVC_5_1,                              ///< AVC (H.264) Level 5.1
574     LEVEL_AVC_5_2,                              ///< AVC (H.264) Level 5.2
575 
576     // HEVC (H.265) tiers and levels
577     LEVEL_HEVC_MAIN_1 = _C2_PL_HEVC_BASE,       ///< HEVC (H.265) Main Tier Level 1
578     LEVEL_HEVC_MAIN_2,                          ///< HEVC (H.265) Main Tier Level 2
579     LEVEL_HEVC_MAIN_2_1,                        ///< HEVC (H.265) Main Tier Level 2.1
580     LEVEL_HEVC_MAIN_3,                          ///< HEVC (H.265) Main Tier Level 3
581     LEVEL_HEVC_MAIN_3_1,                        ///< HEVC (H.265) Main Tier Level 3.1
582     LEVEL_HEVC_MAIN_4,                          ///< HEVC (H.265) Main Tier Level 4
583     LEVEL_HEVC_MAIN_4_1,                        ///< HEVC (H.265) Main Tier Level 4.1
584     LEVEL_HEVC_MAIN_5,                          ///< HEVC (H.265) Main Tier Level 5
585     LEVEL_HEVC_MAIN_5_1,                        ///< HEVC (H.265) Main Tier Level 5.1
586     LEVEL_HEVC_MAIN_5_2,                        ///< HEVC (H.265) Main Tier Level 5.2
587     LEVEL_HEVC_MAIN_6,                          ///< HEVC (H.265) Main Tier Level 6
588     LEVEL_HEVC_MAIN_6_1,                        ///< HEVC (H.265) Main Tier Level 6.1
589     LEVEL_HEVC_MAIN_6_2,                        ///< HEVC (H.265) Main Tier Level 6.2
590 
591     LEVEL_HEVC_HIGH_4 = _C2_PL_HEVC_BASE + 0x100,  ///< HEVC (H.265) High Tier Level 4
592     LEVEL_HEVC_HIGH_4_1,                        ///< HEVC (H.265) High Tier Level 4.1
593     LEVEL_HEVC_HIGH_5,                          ///< HEVC (H.265) High Tier Level 5
594     LEVEL_HEVC_HIGH_5_1,                        ///< HEVC (H.265) High Tier Level 5.1
595     LEVEL_HEVC_HIGH_5_2,                        ///< HEVC (H.265) High Tier Level 5.2
596     LEVEL_HEVC_HIGH_6,                          ///< HEVC (H.265) High Tier Level 6
597     LEVEL_HEVC_HIGH_6_1,                        ///< HEVC (H.265) High Tier Level 6.1
598     LEVEL_HEVC_HIGH_6_2,                        ///< HEVC (H.265) High Tier Level 6.2
599 
600     // VP9 levels
601     LEVEL_VP9_1 = _C2_PL_VP9_BASE,              ///< VP9 Level 1
602     LEVEL_VP9_1_1,                              ///< VP9 Level 1.1
603     LEVEL_VP9_2,                                ///< VP9 Level 2
604     LEVEL_VP9_2_1,                              ///< VP9 Level 2.1
605     LEVEL_VP9_3,                                ///< VP9 Level 3
606     LEVEL_VP9_3_1,                              ///< VP9 Level 3.1
607     LEVEL_VP9_4,                                ///< VP9 Level 4
608     LEVEL_VP9_4_1,                              ///< VP9 Level 4.1
609     LEVEL_VP9_5,                                ///< VP9 Level 5
610     LEVEL_VP9_5_1,                              ///< VP9 Level 5.1
611     LEVEL_VP9_5_2,                              ///< VP9 Level 5.2
612     LEVEL_VP9_6,                                ///< VP9 Level 6
613     LEVEL_VP9_6_1,                              ///< VP9 Level 6.1
614     LEVEL_VP9_6_2,                              ///< VP9 Level 6.2
615 
616     // Dolby Vision level
617     LEVEL_DV_MAIN_HD_24 = _C2_PL_DV_BASE,       ///< Dolby Vision main tier hd24
618     LEVEL_DV_MAIN_HD_30,                        ///< Dolby Vision main tier hd30
619     LEVEL_DV_MAIN_FHD_24,                       ///< Dolby Vision main tier fhd24
620     LEVEL_DV_MAIN_FHD_30,                       ///< Dolby Vision main tier fhd30
621     LEVEL_DV_MAIN_FHD_60,                       ///< Dolby Vision main tier fhd60
622     LEVEL_DV_MAIN_UHD_24,                       ///< Dolby Vision main tier uhd24
623     LEVEL_DV_MAIN_UHD_30,                       ///< Dolby Vision main tier uhd30
624     LEVEL_DV_MAIN_UHD_48,                       ///< Dolby Vision main tier uhd48
625     LEVEL_DV_MAIN_UHD_60,                       ///< Dolby Vision main tier uhd60
626 
627     LEVEL_DV_HIGH_HD_24 = _C2_PL_DV_BASE + 0x100,  ///< Dolby Vision high tier hd24
628     LEVEL_DV_HIGH_HD_30,                        ///< Dolby Vision high tier hd30
629     LEVEL_DV_HIGH_FHD_24,                       ///< Dolby Vision high tier fhd24
630     LEVEL_DV_HIGH_FHD_30,                       ///< Dolby Vision high tier fhd30
631     LEVEL_DV_HIGH_FHD_60,                       ///< Dolby Vision high tier fhd60
632     LEVEL_DV_HIGH_UHD_24,                       ///< Dolby Vision high tier uhd24
633     LEVEL_DV_HIGH_UHD_30,                       ///< Dolby Vision high tier uhd30
634     LEVEL_DV_HIGH_UHD_48,                       ///< Dolby Vision high tier uhd48
635     LEVEL_DV_HIGH_UHD_60,                       ///< Dolby Vision high tier uhd60
636 };
637 
638 struct C2ProfileLevelStruct {
639     C2Config::profile_t profile;  ///< coding profile
640     C2Config::level_t   level;    ///< coding level
641 
642     C2ProfileLevelStruct(
643             C2Config::profile_t profile_ = C2Config::PROFILE_UNUSED,
644             C2Config::level_t level_ = C2Config::LEVEL_UNUSED)
profileC2ProfileLevelStruct645         : profile(profile_), level(level_) { }
646 
647     DEFINE_AND_DESCRIBE_C2STRUCT(ProfileLevel)
648     C2FIELD(profile, "profile")
649     C2FIELD(level,   "level")
650 };
651 
652 // TODO: may need to make this explicit (have .set member)
653 typedef C2StreamParam<C2Info, C2ProfileLevelStruct, kParamIndexProfileLevel>
654         C2StreamProfileLevelInfo;
655 constexpr char C2_PARAMKEY_PROFILE_LEVEL[] = "coded.pl";
656 #define C2_PARAMKEY_STREAM_PROFILE_LEVEL C2_PARAMKEY_PROFILE_LEVEL
657 
658 /**
659  * Codec-specific initialization data.
660  *
661  * This is initialization data for the codec.
662  *
663  * For AVC/HEVC, these are the concatenated SPS/PPS/VPS NALs.
664  *
665  * TODO: define for other codecs.
666  */
667 typedef C2StreamParam<C2Info, C2BlobValue, kParamIndexInitData> C2StreamInitDataInfo;
668 typedef C2StreamInitDataInfo C2StreamCsdInfo; // deprecated
669 constexpr char C2_PARAMKEY_INIT_DATA[] = "coded.init-data";
670 #define C2_PARAMKEY_STREAM_INIT_DATA C2_PARAMKEY_INIT_DATA
671 
672 /**
673  * Supplemental Data.
674  *
675  * This is coding-specific supplemental informational data, e.g. SEI for AVC/HEVC.
676  * This structure is not a configuration so it does not have a parameter key.
677  * This structure shall be returned in the configuration update, and can be repeated as needed
678  * in the same update.
679  */
680 C2ENUM(C2Config::supplemental_info_t, uint32_t,
681     INFO_PREFIX_SEI_UNIT = 0x10000, ///< prefix SEI payload types add this flag
682     INFO_SUFFIX_SEI_UNIT = 0x20000, ///< suffix SEI payload types add this flag
683 
684     INFO_SEI_USER_DATA = INFO_PREFIX_SEI_UNIT | 4,    ///< closed-captioning data (ITU-T T35)
685     INFO_SEI_MDCV      = INFO_PREFIX_SEI_UNIT | 137,  ///< mastering display color volume
686     INFO_SET_USER_DATA_SFX = INFO_SUFFIX_SEI_UNIT | 4, ///< closed-captioning data (ITU-T T35)
687 
688     INFO_VENDOR_START = 0x70000000
689 )
690 
691 struct C2SupplementalDataStruct {
692     C2SupplementalDataStruct() = default;
693 
694     C2Config::supplemental_info_t type;
695     uint8_t data[];
696 
697     DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(SupplementalData, data)
698     C2FIELD(type, "type")
699     C2FIELD(data, "data")
700 };
701 typedef C2StreamParam<C2Info, C2SupplementalDataStruct, kParamIndexSupplementalData>
702         C2StreamSupplementalDataInfo;
703 
704 /**
705  * Supplemental Data Subscription
706  */
707 typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2Config::supplemental_info_t>,
708                 kParamIndexSubscribedSupplementalData>
709         C2StreamSubscribedSupplementalDataTuning;
710 constexpr char C2_PARAMKEY_SUBSCRIBED_SUPPLEMENTAL_DATA[] = "output.subscribed-supplemental";
711 
712 /* ---------------------------------- pipeline characteristics ---------------------------------- */
713 
714 /**
715  * Media-type.
716  *
717  * This is defined for both port and stream, but stream media type may be a subtype of the
718  * port media type.
719  */
720 typedef C2PortParam<C2Setting, C2StringValue, kParamIndexMediaType> C2PortMediaTypeSetting;
721 typedef C2PortMediaTypeSetting C2PortMimeConfig; // deprecated
722 constexpr char C2_PARAMKEY_INPUT_MEDIA_TYPE[] = "input.media-type";
723 constexpr char C2_PARAMKEY_OUTPUT_MEDIA_TYPE[] = "output.media-type";
724 #define C2_NAME_INPUT_PORT_MIME_SETTING C2_PARAMKEY_INPUT_MEDIA_TYPE
725 #define C2_NAME_OUTPUT_PORT_MIME_SETTING C2_PARAMKEY_OUTPUT_MEDIA_TYPE
726 
727 typedef C2StreamParam<C2Setting, C2StringValue, kParamIndexMediaType> C2StreamMediaTypeSetting;
728 
729 /**
730  * Pipeline delays.
731  *
732  * Input delay is the number of additional input frames requested by the component to process
733  * an input frame.
734  *
735  * Output delay is the number of additional output frames that need to be generated before an
736  * output can be released by the component.
737  *
738  * Pipeline delay is the number of additional frames that are processed at one time by the
739  * component.
740  *
741  * As these may vary from frame to frame, the number is the maximum required value. E.g. if
742  * input delay is 0, the component is expected to consume each frame queued even if no further
743  * frames are queued. Similarly, if input delay is 1, as long as there are always exactly 2
744  * outstanding input frames queued to the component, it shall produce output.
745  */
746 
747 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelayRequest> C2PortRequestedDelayTuning;
748 typedef C2PortRequestedDelayTuning C2PortRequestedLatencyTuning; // deprecated
749 constexpr char C2_PARAMKEY_INPUT_DELAY_REQUEST[] = "input.delay.requested";
750 constexpr char C2_PARAMKEY_OUTPUT_DELAY_REQUEST[] = "output.delay.requested";
751 
752 typedef C2GlobalParam<C2Tuning, C2Uint32Value, kParamIndexDelayRequest>
753         C2RequestedPipelineDelayTuning;
754 typedef C2RequestedPipelineDelayTuning C2ComponentRequestedLatencyTuning; // deprecated
755 constexpr char C2_PARAMKEY_PIPELINE_DELAY_REQUEST[] = "pipeline-delay.requested";
756 
757 // read-only
758 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2PortActualDelayTuning;
759 typedef C2PortActualDelayTuning C2PortLatencyInfo; // deprecated
760 constexpr char C2_PARAMKEY_INPUT_DELAY[] = "input.delay.actual";
761 constexpr char C2_PARAMKEY_OUTPUT_DELAY[] = "output.delay.actual";
762 
763 // read-only
764 typedef C2GlobalParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2ActualPipelineDelayTuning;
765 typedef C2ActualPipelineDelayTuning C2ComponentLatencyInfo; // deprecated
766 constexpr char C2_PARAMKEY_PIPELINE_DELAY[] = "algo.delay.actual";
767 
768 /**
769  * Reference characteristics.
770  *
771  * The component may hold onto input and output buffers even after completing the corresponding
772  * work item.
773  *
774  * Max reference age is the longest number of additional frame processing that a component may
775  * hold onto a buffer for. Max reference count is the number of buffers that a component may
776  * hold onto at the same time at the worst case. These numbers assume single frame per buffers.
777  *
778  * Use max-uint32 if there is no limit for the max age or count.
779  */
780 typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceAge>
781         C2StreamMaxReferenceAgeTuning;
782 constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE[] = "input.reference.max-age";
783 constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE[] = "output.reference.max-age";
784 
785 typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceCount>
786         C2StreamMaxReferenceCountTuning;
787 constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT[] = "input.reference.max-count";
788 constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT[] = "output.reference.max-count";
789 
790 /**
791  * Output reordering.
792  *
793  * The size of the window to use for output buffer reordering. 0 is interpreted as 1.
794  */
795 // output only
796 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexReorderBufferDepth>
797         C2PortReorderBufferDepthTuning;
798 constexpr char C2_PARAMKEY_OUTPUT_REORDER_DEPTH[] = "output.reorder.depth";
799 
800 C2ENUM(C2Config::ordinal_key_t, uint32_t,
801         ORDINAL,
802         TIMESTAMP,
803         CUSTOM)
804 
805 // read-only, output only
806 typedef C2PortParam<C2Setting, C2SimpleValueStruct<C2Config::ordinal_key_t>, kParamIndexReorderKey>
807         C2PortReorderKeySetting;
808 constexpr char C2_PARAMKEY_OUTPUT_REORDER_KEY[] = "output.reorder.key";
809 
810 /**
811  * Stream count.
812  */
813 // private
814 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexStreamCount> C2PortStreamCountTuning;
815 typedef C2PortStreamCountTuning C2PortStreamCountConfig; // deprecated
816 constexpr char C2_PARAMKEY_INPUT_STREAM_COUNT[] = "input.stream-count";
817 constexpr char C2_PARAMKEY_OUTPUT_STREAM_COUNT[] = "output.stream-count";
818 
819 /**
820  * Config update subscription.
821  */
822 // private
823 typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexSubscribedParamIndices>
824         C2SubscribedParamIndicesTuning;
825 constexpr char C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES[] = "output.subscribed-indices";
826 
827 /**
828  * Suggested buffer (C2Frame) count. This is a suggestion by the component for the number of
829  * input and output frames allocated for the component's use in the buffer pools.
830  *
831  * Component shall set the acceptable range of buffers allocated for it. E.g. client shall
832  * allocate at least the minimum required value.
833  */
834 // read-only
835 typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexSuggestedBufferCount>
836         C2PortSuggestedBufferCountTuning;
837 constexpr char C2_PARAMKEY_INPUT_SUGGESTED_BUFFER_COUNT[] = "input.buffers.pool-size";
838 constexpr char C2_PARAMKEY_OUTPUT_SUGGESTED_BUFFER_COUNT[] = "output.buffers.pool-size";
839 
840 /**
841  * Input/output batching.
842  *
843  * For input, component requests that client batches work in batches of specified size. For output,
844  * client requests that the component batches work completion in given batch size.
845  * Value 0 means don't care.
846  */
847 typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexBatchSize> C2PortBatchSizeTuning;
848 constexpr char C2_PARAMKEY_INPUT_BATCH_SIZE[] = "input.buffers.batch-size";
849 constexpr char C2_PARAMKEY_OUTPUT_BATCH_SIZE[] = "output.buffers.batch-size";
850 
851 /**
852  * Current & last work ordinals.
853  *
854  * input port: last work queued to component.
855  * output port: last work completed by component.
856  * global: current work.
857  */
858 typedef C2PortParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexLastWorkQueued> C2LastWorkQueuedTuning;
859 typedef C2GlobalParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexCurrentWork> C2CurrentWorkTuning;
860 
861 
862 /* ------------------------------------- memory allocation ------------------------------------- */
863 
864 /**
865  * Allocators to use.
866  *
867  * These are requested by the component.
868  *
869  * If none specified, client will use the default allocator ID based on the component domain and
870  * kind.
871  */
872 typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
873         C2PortAllocatorsTuning;
874 constexpr char C2_PARAMKEY_INPUT_ALLOCATORS[] = "input.buffers.allocator-ids";
875 constexpr char C2_PARAMKEY_OUTPUT_ALLOCATORS[] = "output.buffers.allocator-ids";
876 
877 typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
878         C2PrivateAllocatorsTuning;
879 constexpr char C2_PARAMKEY_PRIVATE_ALLOCATORS[] = "algo.buffers.allocator-ids";
880 
881 /**
882  * Block pools to use.
883  *
884  * These are allocated by the client for the component using the allocator IDs specified by the
885  * component. This is not used for the input port.
886  */
887 typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
888         C2PortBlockPoolsTuning;
889 constexpr char C2_PARAMKEY_OUTPUT_BLOCK_POOLS[] = "output.buffers.pool-ids";
890 
891 typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
892         C2PrivateBlockPoolsTuning;
893 constexpr char C2_PARAMKEY_PRIVATE_BLOCK_POOLS[] = "algo.buffers.pool-ids";
894 
895 /**
896  * The max number of private allocations at any one time by the component.
897  * (This is an array with a corresponding value for each private allocator)
898  */
899 typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexMaxReferenceCount>
900         C2MaxPrivateBufferCountTuning;
901 constexpr char C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT[] = "algo.buffers.max-count";
902 
903 /**
904  * Buffer type
905  *
906  * This is provided by the component for the client to allocate the proper buffer type for the
907  * input port, and can be provided by the client to control the buffer type for the output.
908  */
909 // private
910 typedef C2StreamParam<C2Setting, C2SimpleValueStruct<C2EasyEnum<C2BufferData::type_t>>,
911                 kParamIndexBufferType>
912         C2StreamBufferTypeSetting;
913 
914 constexpr C2BufferData::type_t C2FormatAudio      = C2BufferData::LINEAR; // deprecated
915 constexpr C2BufferData::type_t C2FormatCompressed = C2BufferData::LINEAR; // deprecated
916 constexpr C2BufferData::type_t C2FormatVideo      = C2BufferData::GRAPHIC; // deprecated
917 typedef C2BufferData::type_t C2FormatKind; // deprecated
918 
919 typedef C2StreamBufferTypeSetting C2StreamFormatConfig; // deprecated
920 constexpr char C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE[] = "input.buffers.type";
921 constexpr char C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE[] = "output.buffers.type";
922 
923 // deprecated
924 #define C2_NAME_INPUT_STREAM_FORMAT_SETTING C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE
925 #define C2_NAME_OUTPUT_STREAM_FORMAT_SETTING C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE
926 
927 /**
928  * Memory usage.
929  *
930  * Suggested by component for input and negotiated between client and component for output.
931  */
932 typedef C2StreamParam<C2Tuning, C2Uint64Value, kParamIndexUsage> C2StreamUsageTuning;
933 constexpr char C2_PARAMKEY_INPUT_STREAM_USAGE[] = "input.buffers.usage";
934 constexpr char C2_PARAMKEY_OUTPUT_STREAM_USAGE[] = "output.buffers.usage";
935 // deprecated
936 #define C2_NAME_INPUT_STREAM_USAGE_SETTING C2_PARAMKEY_INPUT_STREAM_USAGE
937 
938 /**
939  * Picture (video or image frame) size.
940  */
941 struct C2PictureSizeStruct {
942     inline C2PictureSizeStruct() = default;
C2PictureSizeStructC2PictureSizeStruct943     inline C2PictureSizeStruct(uint32_t width_, uint32_t height_)
944         : width(width_), height(height_) {}
945 
946     uint32_t width;     ///< video width
947     uint32_t height;    ///< video height
948 
949     DEFINE_AND_DESCRIBE_C2STRUCT(PictureSize)
950     C2FIELD(width, "width")
951     C2FIELD(height, "height")
952 };
953 
954 /**
955  * Out of memory signaling
956  *
957  * This is a configuration for the client to mark that it cannot allocate necessary private and/
958  * or output buffers to continue operation, and to signal the failing configuration.
959  */
960 struct C2OutOfMemoryStruct {
961     C2BlockPool::local_id_t pool;   ///< pool ID that failed the allocation
962     uint64_t usage;                 ///< memory usage used
963     C2PictureSizeStruct planar;     ///< buffer dimensions to be allocated if 2D
964     uint32_t format;                ///< pixel format to be used if 2D
965     uint32_t capacity;              ///< buffer capacity to be allocated if 1D
966     c2_bool_t outOfMemory;           ///< true if component is out of memory
967 
968     DEFINE_AND_DESCRIBE_C2STRUCT(OutOfMemory)
969     C2FIELD(pool, "pool")
970     C2FIELD(usage, "usage")
971     C2FIELD(planar, "planar")
972     C2FIELD(format, "format")
973     C2FIELD(capacity, "capacity")
974     C2FIELD(outOfMemory, "out-of-memory")
975 };
976 
977 typedef C2GlobalParam<C2Tuning, C2OutOfMemoryStruct, kParamIndexOutOfMemory> C2OutOfMemoryTuning;
978 constexpr char C2_PARAMKEY_OUT_OF_MEMORY[] = "algo.oom";
979 
980 /**
981  * Max buffer size
982  *
983  * This is a hint provided by the component for the maximum buffer size expected on a stream for the
984  * current configuration on its input and output streams. This is communicated to clients so they
985  * can preallocate input buffers, or configure downstream components that require a maximum size on
986  * their buffers.
987  *
988  * Read-only. Required to be provided by components on all compressed streams.
989  */
990 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexMaxBufferSize> C2StreamMaxBufferSizeInfo;
991 constexpr char C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE[] = "input.buffers.max-size";
992 constexpr char C2_PARAMKEY_OUTPUT_MAX_BUFFER_SIZE[] = "output.buffers.max-size";
993 
994 #define C2_NAME_STREAM_MAX_BUFFER_SIZE_SETTING C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE
995 
996 /* ---------------------------------------- misc. state ---------------------------------------- */
997 
998 /**
999  * Tripped state,
1000  *
1001  * This state exists to be able to provide reasoning for a tripped state during normal
1002  * interface operations, as well as to allow client to trip the component on demand.
1003  */
1004 typedef C2GlobalParam<C2Tuning, C2BoolValue, kParamIndexTripped>
1005         C2TrippedTuning;
1006 constexpr char C2_PARAMKEY_TRIPPED[] = "algo.tripped";
1007 
1008 /**
1009  * Configuration counters.
1010  *
1011  * Configurations are tracked using three counters. The input counter is incremented exactly
1012  * once with each work accepted by the component. The output counter is incremented exactly
1013  * once with each work completed by the component (in the order of work completion). The
1014  * global counter is incremented exactly once during to each config() call. These counters
1015  * shall be read-only.
1016  *
1017  * TODO: these should be counters.
1018  */
1019 typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2PortConfigCounterTuning;
1020 typedef C2GlobalParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2ConfigCounterTuning;
1021 constexpr char C2_PARAMKEY_INPUT_COUNTER[] = "input.buffers.counter";
1022 constexpr char C2_PARAMKEY_OUTPUT_COUNTER[] = "output.buffers.counter";
1023 constexpr char C2_PARAMKEY_CONFIG_COUNTER[] = "algo.config.counter";
1024 
1025 /* ----------------------------------------- resources ----------------------------------------- */
1026 
1027 /**
1028  * Resources needed and resources reserved for current configuration.
1029  *
1030  * Resources are tracked as a vector of positive numbers. Available resources are defined by
1031  * the vendor.
1032  *
1033  * By default, no resources are reserved for a component. If resource reservation is successful,
1034  * the component shall be able to use those resources exclusively. If however, the component is
1035  * not using all of the reserved resources, those may be shared with other components.
1036  *
1037  * TODO: define some of the resources.
1038  */
1039 typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesNeeded> C2ResourcesNeededTuning;
1040 typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesReserved>
1041         C2ResourcesReservedTuning;
1042 constexpr char C2_PARAMKEY_RESOURCES_NEEDED[] = "resources.needed";
1043 constexpr char C2_PARAMKEY_RESOURCES_RESERVED[] = "resources.reserved";
1044 
1045 /**
1046  * Operating rate.
1047  *
1048  * Operating rate is the expected rate of work through the component. Negative values is
1049  * invalid.
1050  *
1051  * TODO: this could distinguish set value
1052  */
1053 typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexOperatingRate> C2OperatingRateTuning;
1054 constexpr char C2_PARAMKEY_OPERATING_RATE[] = "algo.rate";
1055 
1056 /**
1057  * Realtime / operating point.
1058  *
1059  * Priority value defines the operating point for the component. Operating points are defined by
1060  * the vendor. Priority value of 0 means that the client requires operation at the given operating
1061  * rate. Priority values -1 and below define operating points in decreasing performance. In this
1062  * case client expects best effort without exceeding the specific operating point. This allows
1063  * client to run components deeper in the background by using larger priority values. In these
1064  * cases operating rate is a hint for the maximum rate that the client anticipates.
1065  *
1066  * Operating rate and priority are used in tandem. E.g. if there are components that run at a
1067  * higher operating point (priority) it will make more resources available for components at
1068  * a lower operating point, so operating rate can be used to gate those components.
1069  *
1070  * Positive priority values are not defined at the moment and shall be treated equivalent to 0.
1071  */
1072 typedef C2GlobalParam<C2Tuning, C2Int32Value, kParamIndexRealTimePriority>
1073         C2RealTimePriorityTuning;
1074 constexpr char C2_PARAMKEY_PRIORITY[] = "algo.priority";
1075 
1076 /* ------------------------------------- protected content ------------------------------------- */
1077 
1078 /**
1079  * Secure mode.
1080  */
1081 C2ENUM(C2Config::secure_mode_t, uint32_t,
1082     SM_UNPROTECTED,    ///< no content protection
1083     SM_READ_PROTECTED, ///< input and output buffers shall be protected from reading
1084 )
1085 
1086 typedef C2GlobalParam<C2Tuning, C2SimpleValueStruct<C2Config::secure_mode_t>, kParamIndexSecureMode>
1087         C2SecureModeTuning;
1088 constexpr char C2_PARAMKEY_SECURE_MODE[] = "algo.secure-mode";
1089 
1090 /* ===================================== ENCODER COMPONENTS ===================================== */
1091 
1092 /**
1093  * Bitrate
1094  */
1095 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBitrate> C2StreamBitrateInfo;
1096 typedef C2StreamBitrateInfo C2BitrateTuning; // deprecated
1097 constexpr char C2_PARAMKEY_BITRATE[] = "coded.bitrate";
1098 #define C2_NAME_STREAM_BITRATE_SETTING C2_PARAMKEY_BITRATE
1099 
1100 /**
1101  * Bitrate mode.
1102  *
1103  * TODO: refine this with bitrate ranges and suggested window
1104  */
1105 C2ENUM(C2Config::bitrate_mode_t, uint32_t,
1106     BITRATE_CONST_SKIP_ALLOWED = 0,      ///< constant bitrate, frame skipping allowed
1107     BITRATE_CONST = 1,                   ///< constant bitrate, keep all frames
1108     BITRATE_VARIABLE_SKIP_ALLOWED = 2,   ///< bitrate can vary, frame skipping allowed
1109     BITRATE_VARIABLE = 3,                ///< bitrate can vary, keep all frames
1110     BITRATE_IGNORE = 7,                  ///< bitrate can be exceeded at will to achieve
1111                                          ///< quality or other settings
1112 
1113     // bitrate modes are composed of the following flags
1114     BITRATE_FLAG_KEEP_ALL_FRAMES = 1,
1115     BITRATE_FLAG_CAN_VARY = 2,
1116     BITRATE_FLAG_CAN_EXCEED = 4,
1117 )
1118 
1119 typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::bitrate_mode_t>,
1120                 kParamIndexBitrateMode>
1121         C2StreamBitrateModeTuning;
1122 constexpr char C2_PARAMKEY_BITRATE_MODE[] = "algo.bitrate-mode";
1123 
1124 /**
1125  * Quality.
1126  *
1127  * This is defined by each component, the higher the better the output quality at the expense of
1128  * less compression efficiency. This setting is defined for the output streams in case the
1129  * component can support varying quality on each stream, or as an output port tuning in case the
1130  * quality is global to all streams.
1131  */
1132 typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2StreamQualityTuning;
1133 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2QualityTuning;
1134 constexpr char C2_PARAMKEY_QUALITY[] = "algo.quality";
1135 
1136 /**
1137  * Complexity.
1138  *
1139  * This is defined by each component, this higher the value, the more resources the component
1140  * will use to produce better quality at the same compression efficiency or better compression
1141  * efficiency at the same quality. This setting is defined for the output streams in case the
1142  * component can support varying complexity on each stream, or as an output port tuning in case the
1143  * quality is global to all streams
1144  */
1145 typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2StreamComplexityTuning;
1146 typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2ComplexityTuning;
1147 constexpr char C2_PARAMKEY_COMPLEXITY[] = "algo.complexity";
1148 
1149 /**
1150  * Header (init-data) handling around sync frames.
1151  */
1152 C2ENUM(C2Config::prepend_header_mode_t, uint32_t,
1153     /**
1154      * don't prepend header. Signal header only through C2StreamInitDataInfo.
1155      */
1156     PREPEND_HEADER_TO_NONE,
1157 
1158     /**
1159      * prepend header before the first output frame and thereafter before the next sync frame
1160      * if it changes.
1161      */
1162     PREPEND_HEADER_ON_CHANGE,
1163 
1164     /**
1165      * prepend header before every sync frame.
1166      */
1167     PREPEND_HEADER_TO_ALL_SYNC,
1168 )
1169 
1170 typedef C2GlobalParam<C2Setting, C2BoolValue, kParamIndexPrependHeaderMode>
1171         C2PrependHeaderModeSetting;
1172 constexpr char C2_PARAMKEY_PREPEND_HEADER_MODE[] = "output.buffers.prepend-header";
1173 
1174 /* =================================== IMAGE/VIDEO COMPONENTS =================================== */
1175 
1176 /*
1177  * Order of transformation is:
1178  *
1179  * crop => (scaling => scaled-crop) => sample-aspect-ratio => flip => rotation
1180  */
1181 
1182 /**
1183  * Picture (image- and video frame) size.
1184  *
1185  * This is used for the output of the video decoder, and the input of the video encoder.
1186  */
1187 typedef C2PictureSizeStruct C2VideoSizeStruct; // deprecated
1188 
1189 typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPictureSize> C2StreamPictureSizeInfo;
1190 constexpr char C2_PARAMKEY_PICTURE_SIZE[] = "raw.size";
1191 #define C2_PARAMKEY_STREAM_PICTURE_SIZE C2_PARAMKEY_PICTURE_SIZE
1192 #define C2_NAME_STREAM_VIDEO_SIZE_INFO C2_PARAMKEY_PICTURE_SIZE
1193 typedef C2StreamPictureSizeInfo C2VideoSizeStreamInfo; // deprecated
1194 typedef C2StreamPictureSizeInfo C2VideoSizeStreamTuning; // deprecated
1195 #define C2_NAME_STREAM_VIDEO_SIZE_SETTING C2_PARAMKEY_PICTURE_SIZE
1196 
1197 /**
1198  * Crop rectangle.
1199  */
1200 struct C2RectStruct : C2Rect {
1201     C2RectStruct() = default;
C2RectStructC2RectStruct1202     C2RectStruct(const C2Rect &rect) : C2Rect(rect) { }
1203 
1204     bool operator==(const C2RectStruct &) = delete;
1205     bool operator!=(const C2RectStruct &) = delete;
1206 
1207     DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rect)
1208     C2FIELD(width, "width")
1209     C2FIELD(height, "height")
1210     C2FIELD(left, "left")
1211     C2FIELD(top, "top")
1212 };
1213 
1214 typedef C2StreamParam<C2Info, C2RectStruct, kParamIndexCropRect> C2StreamCropRectInfo;
1215 constexpr char C2_PARAMKEY_CROP_RECT[] = "raw.crop";
1216 constexpr char C2_PARAMKEY_CODED_CROP_RECT[] = "coded.crop";
1217 
1218 /**
1219  * Pixel format.
1220  */
1221 // TODO: define some
1222 
1223 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexPixelFormat> C2StreamPixelFormatInfo;
1224 constexpr char C2_PARAMKEY_PIXEL_FORMAT[] = "raw.pixel-format";
1225 
1226 /**
1227  * Extended rotation information also incorporating a flip.
1228  *
1229  * Rotation is counter clock-wise.
1230  */
1231 struct C2RotationStruct {
1232     C2RotationStruct(int32_t rotation = 0)
1233         : flip(0), value(rotation) { }
1234 
1235     int32_t flip;   ///< horizontal flip (left-right flip applied prior to rotation)
1236     int32_t value;  ///< rotation in degrees counter clockwise
1237 
1238     DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rotation)
1239     C2FIELD(flip, "flip")
1240     C2FIELD(value, "value")
1241 };
1242 
1243 typedef C2StreamParam<C2Info, C2RotationStruct, kParamIndexRotation> C2StreamRotationInfo;
1244 constexpr char C2_PARAMKEY_ROTATION[] = "raw.rotation";
1245 constexpr char C2_PARAMKEY_VUI_ROTATION[] = "coded.vui.rotation";
1246 
1247 /**
1248  * Pixel (sample) aspect ratio.
1249  */
1250 typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPixelAspectRatio>
1251         C2StreamPixelAspectRatioInfo;
1252 constexpr char C2_PARAMKEY_PIXEL_ASPECT_RATIO[] = "raw.sar";
1253 constexpr char C2_PARAMKEY_VUI_PIXEL_ASPECT_RATIO[] = "coded.vui.sar";
1254 
1255 /**
1256  * In-line scaling.
1257  *
1258  * Components can optionally support scaling of raw image/video frames.  Or scaling only a
1259  * portion of raw image/video frames (scaled-crop).
1260  */
1261 
1262 C2ENUM(C2Config::scaling_method_t, uint32_t,
1263     SCALING_ARBITRARY,   ///< arbitrary, unspecified
1264 )
1265 
1266 typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::scaling_method_t>,
1267                 kParamIndexScalingMethod>
1268         C2StreamScalingMethodTuning;
1269 constexpr char C2_PARAMKEY_SCALING_MODE[] = "raw.scaling-method";
1270 #define C2_PARAMKEY_STREAM_SCALING_MODE C2_PARAMKEY_SCALING_MODE
1271 
1272 typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexScaledPictureSize>
1273         C2StreamScaledPictureSizeTuning;
1274 constexpr char C2_PARAMKEY_SCALED_PICTURE_SIZE[] = "raw.scaled-size";
1275 #define C2_PARAMKEY_STREAM_SCALED_PICTURE_SIZE C2_PARAMKEY_SCALED_PICTURE_SIZE
1276 
1277 typedef C2StreamParam<C2Tuning, C2RectStruct, kParamIndexScaledCropRect>
1278         C2StreamScaledCropRectTuning;
1279 constexpr char C2_PARAMKEY_SCALED_CROP_RECT[] = "raw.scaled-crop";
1280 
1281 /* ------------------------------------- color information ------------------------------------- */
1282 
1283 /**
1284  * Color Info
1285  *
1286  * Chroma location can vary for top and bottom fields, so use an array, that can have 0 to 2
1287  * values. Empty array is used for non YUV formats.
1288  */
1289 
1290 struct C2Color {
1291     enum range_t : uint32_t;
1292     enum primaries_t : uint32_t;
1293     enum transfer_t : uint32_t;
1294     enum matrix_t : uint32_t;
1295     enum subsampling_t : uint32_t;  ///< chroma subsampling
1296 };
1297 
1298 /// Chroma subsampling
1299 C2ENUM(C2Color::subsampling_t, uint32_t,
1300     RGB,            ///< RGB
1301     MONOCHROME,     ///< there are no Cr nor Cb planes
1302     YUV_420,        ///< Cr and Cb planes are subsampled by 2 both horizontally and vertically
1303     YUV_422,        ///< Cr and Cb planes are subsampled horizontally
1304     YUV_444,        ///< Cr and Cb planes are not subsampled
1305 )
1306 
1307 struct C2ChromaOffsetStruct {
1308     // chroma offsets defined by ITU
ITU_YUV_444C2ChromaOffsetStruct1309     constexpr static C2ChromaOffsetStruct ITU_YUV_444() { return { 0.0f, 0.0f }; }
ITU_YUV_422C2ChromaOffsetStruct1310     constexpr static C2ChromaOffsetStruct ITU_YUV_422() { return { 0.0f, 0.0f }; }
ITU_YUV_420_0C2ChromaOffsetStruct1311     constexpr static C2ChromaOffsetStruct ITU_YUV_420_0() { return { 0.0f, 0.5f }; }
ITU_YUV_420_1C2ChromaOffsetStruct1312     constexpr static C2ChromaOffsetStruct ITU_YUV_420_1() { return { 0.5f, 0.5f }; }
ITU_YUV_420_2C2ChromaOffsetStruct1313     constexpr static C2ChromaOffsetStruct ITU_YUV_420_2() { return { 0.0f, 0.0f }; }
ITU_YUV_420_3C2ChromaOffsetStruct1314     constexpr static C2ChromaOffsetStruct ITU_YUV_420_3() { return { 0.5f, 0.0f }; }
ITU_YUV_420_4C2ChromaOffsetStruct1315     constexpr static C2ChromaOffsetStruct ITU_YUV_420_4() { return { 0.0f, 1.0f }; }
ITU_YUV_420_5C2ChromaOffsetStruct1316     constexpr static C2ChromaOffsetStruct ITU_YUV_420_5() { return { 0.5f, 1.0f }; }
1317 
1318     float x;    ///< x offset in pixels (towards right)
1319     float y;    ///< y offset in pixels (towards down)
1320 
1321     DEFINE_AND_DESCRIBE_C2STRUCT(ChromaOffset)
1322     C2FIELD(x, "x")
1323     C2FIELD(y, "y")
1324 };
1325 
1326 struct C2ColorInfoStruct {
1327     C2ColorInfoStruct() = default;
1328 
1329     uint32_t bitDepth;
1330     C2Color::subsampling_t subsampling;
1331     C2ChromaOffsetStruct locations[]; // max 2 elements
1332 
C2ColorInfoStructC2ColorInfoStruct1333     C2ColorInfoStruct(
1334             size_t /* flexCount */, uint32_t bitDepth_, C2Color::subsampling_t subsampling_)
1335         : bitDepth(bitDepth_), subsampling(subsampling_) {
1336     }
1337 
C2ColorInfoStructC2ColorInfoStruct1338     C2ColorInfoStruct(
1339             size_t flexCount, uint32_t bitDepth_, C2Color::subsampling_t subsampling_,
1340             std::initializer_list<C2ChromaOffsetStruct> locations_)
1341         : bitDepth(bitDepth_), subsampling(subsampling_) {
1342         size_t ix = 0;
1343         for (const C2ChromaOffsetStruct &location : locations_) {
1344             if (ix == flexCount) {
1345                 break;
1346             }
1347             locations[ix] = location;
1348             ++ix;
1349         }
1350     }
1351 
1352     DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(ColorInfo, locations)
1353     C2FIELD(bitDepth, "bit-depth")
1354     C2FIELD(subsampling, "subsampling")
1355     C2FIELD(locations, "locations")
1356 };
1357 
1358 typedef C2StreamParam<C2Info, C2ColorInfoStruct, kParamIndexColorInfo> C2StreamColorInfo;
1359 constexpr char C2_PARAMKEY_COLOR_INFO[] = "raw.color-format";
1360 constexpr char C2_PARAMKEY_CODED_COLOR_INFO[] = "coded.color-format";
1361 
1362 /**
1363  * Color Aspects
1364  */
1365 
1366 /* The meaning of the following enumerators is as described in ITU-T H.273. */
1367 
1368 /// Range
1369 C2ENUM(C2Color::range_t, uint32_t,
1370     RANGE_UNSPECIFIED,          ///< range is unspecified
1371     RANGE_FULL,                 ///< full range
1372     RANGE_LIMITED,              ///< limited range
1373 
1374     RANGE_VENDOR_START = 0x80,  ///< vendor-specific range values start here
1375     RANGE_OTHER = 0XFF          ///< max value, reserved for undefined values
1376 )
1377 
1378 /// Color primaries
1379 C2ENUM(C2Color::primaries_t, uint32_t,
1380     PRIMARIES_UNSPECIFIED,          ///< primaries are unspecified
1381     PRIMARIES_BT709,                ///< Rec.ITU-R BT.709-6 or equivalent
1382     PRIMARIES_BT470_M,              ///< Rec.ITU-R BT.470-6 System M or equivalent
1383     PRIMARIES_BT601_625,            ///< Rec.ITU-R BT.601-6 625 or equivalent
1384     PRIMARIES_BT601_525,            ///< Rec.ITU-R BT.601-6 525 or equivalent
1385     PRIMARIES_GENERIC_FILM,         ///< Generic Film
1386     PRIMARIES_BT2020,               ///< Rec.ITU-R BT.2020 or equivalent
1387     PRIMARIES_RP431,                ///< SMPTE RP 431-2 or equivalent
1388     PRIMARIES_EG432,                ///< SMPTE EG 432-1 or equivalent
1389     PRIMARIES_EBU3213,              ///< EBU Tech.3213-E or equivalent
1390                                     ///
1391     PRIMARIES_VENDOR_START = 0x80,  ///< vendor-specific primaries values start here
1392     PRIMARIES_OTHER = 0xff          ///< max value, reserved for undefined values
1393 )
1394 
1395 /// Transfer function
1396 C2ENUM(C2Color::transfer_t, uint32_t,
1397     TRANSFER_UNSPECIFIED,           ///< transfer is unspecified
1398     TRANSFER_LINEAR,                ///< Linear transfer characteristics
1399     TRANSFER_SRGB,                  ///< sRGB or equivalent
1400     TRANSFER_170M,                  ///< SMPTE 170M or equivalent (e.g. BT.601/709/2020)
1401     TRANSFER_GAMMA22,               ///< Assumed display gamma 2.2
1402     TRANSFER_GAMMA28,               ///< Assumed display gamma 2.8
1403     TRANSFER_ST2084,                ///< SMPTE ST 2084 for 10/12/14/16 bit systems
1404     TRANSFER_HLG,                   ///< ARIB STD-B67 hybrid-log-gamma
1405 
1406     TRANSFER_240M = 0x40,           ///< SMPTE 240M or equivalent
1407     TRANSFER_XVYCC,                 ///< IEC 61966-2-4 or equivalent
1408     TRANSFER_BT1361,                ///< Rec.ITU-R BT.1361 extended gamut
1409     TRANSFER_ST428,                 ///< SMPTE ST 428-1 or equivalent
1410                                     ///
1411     TRANSFER_VENDOR_START = 0x80,   ///< vendor-specific transfer values start here
1412     TRANSFER_OTHER = 0xff           ///< max value, reserved for undefined values
1413 )
1414 
1415 /// Matrix coefficient
1416 C2ENUM(C2Color::matrix_t, uint32_t,
1417     MATRIX_UNSPECIFIED,             ///< matrix coefficients are unspecified
1418     MATRIX_BT709,                   ///< Rec.ITU-R BT.709-5 or equivalent
1419     MATRIX_FCC47_73_682,            ///< FCC Title 47 CFR 73.682 or equivalent (KR=0.30, KB=0.11)
1420     MATRIX_BT601,                   ///< Rec.ITU-R BT.470, BT.601-6 625 or equivalent
1421     MATRIX_SMPTE240M,               ///< SMPTE 240M or equivalent
1422     MATRIX_BT2020,                  ///< Rec.ITU-R BT.2020 non-constant luminance
1423     MATRIX_BT2020CONSTANT,          ///< Rec.ITU-R BT.2020 constant luminance
1424     MATRIX_VENDOR_START = 0x80,     ///< vendor-specific matrix coefficient values start here
1425     MATRIX_OTHER = 0xff             ///< max value, reserved for undefined values
1426 )
1427 
1428 constexpr C2Color::matrix_t MATRIX_BT470_6M = MATRIX_FCC47_73_682; // deprecated
1429 constexpr C2Color::matrix_t MATRIX_BT709_5 = MATRIX_BT709; // deprecated
1430 constexpr C2Color::matrix_t MATRIX_BT601_6 = MATRIX_BT601; // deprecated
1431 
1432 struct C2ColorAspectsStruct {
1433     C2Color::range_t range;
1434     C2Color::primaries_t primaries;
1435     C2Color::transfer_t transfer;
1436     C2Color::matrix_t matrix;
1437 
1438     C2ColorAspectsStruct() = default;
C2ColorAspectsStructC2ColorAspectsStruct1439     C2ColorAspectsStruct(C2Color::range_t range_, C2Color::primaries_t primaries_,
1440                          C2Color::transfer_t transfer_, C2Color::matrix_t matrix_)
1441         : range(range_), primaries(primaries_), transfer(transfer_), matrix(matrix_) {}
1442 
1443     DEFINE_AND_DESCRIBE_C2STRUCT(ColorAspects)
1444     C2FIELD(range, "range")
1445     C2FIELD(primaries, "primaries")
1446     C2FIELD(transfer, "transfer")
1447     C2FIELD(matrix, "matrix")
1448 };
1449 
1450 typedef C2StreamParam<C2Info, C2ColorAspectsStruct, kParamIndexColorAspects>
1451         C2StreamColorAspectsInfo;
1452 constexpr char C2_PARAMKEY_COLOR_ASPECTS[] = "raw.color";
1453 constexpr char C2_PARAMKEY_VUI_COLOR_ASPECTS[] = "coded.vui.color";
1454 
1455 /**
1456  * Default color aspects to use. These come from the container or client and shall be handled
1457  * according to the coding standard.
1458  */
1459 typedef C2StreamParam<C2Tuning, C2ColorAspectsStruct, kParamIndexDefaultColorAspects>
1460         C2StreamColorAspectsTuning;
1461 constexpr char C2_PARAMKEY_DEFAULT_COLOR_ASPECTS[] = "default.color";
1462 
1463 /**
1464  * HDR Static Metadata Info.
1465  */
1466 struct C2ColorXyStruct {
1467     float x; ///< x color coordinate in xyY space [0-1]
1468     float y; ///< y color coordinate in xyY space [0-1]
1469 
1470     DEFINE_AND_DESCRIBE_C2STRUCT(ColorXy)
1471     C2FIELD(x, "x")
1472     C2FIELD(y, "y")
1473 };
1474 
1475 struct C2MasteringDisplayColorVolumeStruct {
1476     C2ColorXyStruct red;    ///< coordinates of red display primary
1477     C2ColorXyStruct green;  ///< coordinates of green display primary
1478     C2ColorXyStruct blue;   ///< coordinates of blue display primary
1479     C2ColorXyStruct white;  ///< coordinates of white point
1480 
1481     float maxLuminance;  ///< max display mastering luminance in cd/m^2
1482     float minLuminance;  ///< min display mastering luminance in cd/m^2
1483 
1484     DEFINE_AND_DESCRIBE_C2STRUCT(MasteringDisplayColorVolume)
1485     C2FIELD(red, "red")
1486     C2FIELD(green, "green")
1487     C2FIELD(blue, "blue")
1488     C2FIELD(white, "white")
1489 
1490     C2FIELD(maxLuminance, "max-luminance")
1491     C2FIELD(minLuminance, "min-luminance")
1492 };
1493 
1494 struct C2HdrStaticMetadataStruct {
1495     C2MasteringDisplayColorVolumeStruct mastering;
1496 
1497     // content descriptors
1498     float maxCll;  ///< max content light level (pixel luminance) in cd/m^2
1499     float maxFall; ///< max frame average light level (frame luminance) in cd/m^2
1500 
1501     DEFINE_AND_DESCRIBE_BASE_C2STRUCT(HdrStaticMetadata)
1502     C2FIELD(mastering, "mastering")
1503     C2FIELD(maxCll, "max-cll")
1504     C2FIELD(maxFall, "max-fall")
1505 };
1506 typedef C2StreamParam<C2Info, C2HdrStaticMetadataStruct, kParamIndexHdrStaticMetadata>
1507         C2StreamHdrStaticInfo;
1508 constexpr char C2_PARAMKEY_HDR_STATIC_INFO[] = "raw.hdr-static-info";
1509 
1510 /* ------------------------------------ block-based coding ----------------------------------- */
1511 
1512 /**
1513  * Block-size, block count and block rate. Used to determine or communicate profile-level
1514  * requirements.
1515  */
1516 typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexBlockSize> C2StreamBlockSizeInfo;
1517 constexpr char C2_PARAMKEY_BLOCK_SIZE[] = "coded.block-size";
1518 
1519 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBlockCount> C2StreamBlockCountInfo;
1520 constexpr char C2_PARAMKEY_BLOCK_COUNT[] = "coded.block-count";
1521 
1522 typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexBlockRate> C2StreamBlockRateInfo;
1523 constexpr char C2_PARAMKEY_BLOCK_RATE[] = "coded.block-rate";
1524 
1525 /* ====================================== VIDEO COMPONENTS ====================================== */
1526 
1527 /**
1528  * Frame rate (coded and port for raw data)
1529  *
1530  * Coded frame rates are what is represented in the compressed bitstream and should correspond to
1531  * the timestamp.
1532  *
1533  * Frame rates on raw ports should still correspond to the timestamps.
1534  *
1535  * For slow motion or timelapse recording, the timestamp shall be adjusted prior to feeding an
1536  * encoder, and the time stretch parameter should be used to signal the relationship between
1537  * timestamp and real-world time.
1538  */
1539 typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2StreamFrameRateInfo;
1540 constexpr char C2_PARAMKEY_FRAME_RATE[] = "coded.frame-rate";
1541 #define C2_NAME_STREAM_FRAME_RATE_SETTING C2_PARAMKEY_FRAME_RATE
1542 
1543 typedef C2PortParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2PortFrameRateInfo;
1544 constexpr char C2_PARAMKEY_INPUT_FRAME_RATE[] = "input.frame-rate";
1545 constexpr char C2_PARAMKEY_OUTPUT_FRAME_RATE[] = "output.frame-rate";
1546 
1547 /**
1548  * Time stretch. Ratio between real-world time and timestamp. E.g. time stretch of 4.0 means that
1549  * timestamp grows 1/4 the speed of real-world time (e.g. 4x slo-mo input). This can be used to
1550  * optimize encoding.
1551  */
1552 typedef C2PortParam<C2Info, C2FloatValue, kParamIndexTimeStretch> C2PortTimeStretchInfo;
1553 constexpr char C2_PARAMKEY_INPUT_TIME_STRETCH[] = "input.time-stretch";
1554 constexpr char C2_PARAMKEY_OUTPUT_TIME_STRETCH[] = "output.time-stretch";
1555 
1556 /**
1557  * Max video frame size.
1558  */
1559 typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexMaxPictureSize>
1560         C2StreamMaxPictureSizeTuning;
1561 typedef C2StreamMaxPictureSizeTuning C2MaxVideoSizeHintPortSetting;
1562 constexpr char C2_PARAMKEY_MAX_PICTURE_SIZE[] = "raw.max-size";
1563 
1564 /**
1565  * Picture type mask.
1566  */
1567 C2ENUM(C2Config::picture_type_t, uint32_t,
1568     SYNC_FRAME = (1 << 0),  ///< sync frame, e.g. IDR
1569     I_FRAME    = (1 << 1),  ///< intra frame that is completely encoded
1570     P_FRAME    = (1 << 2),  ///< inter predicted frame from previous frames
1571     B_FRAME    = (1 << 3),  ///< backward predicted (out-of-order) frame
1572 )
1573 
1574 typedef C2Config::picture_type_t C2PictureTypeMask; // deprecated
1575 constexpr C2Config::picture_type_t C2PictureTypeKeyFrame = C2Config::SYNC_FRAME; // deprecated
1576 
1577 /**
1578  * Allowed picture types.
1579  */
1580 typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
1581                 kParamIndexPictureTypeMask>
1582         C2StreamPictureTypeMaskTuning;
1583 constexpr char C2_PARAMKEY_PICTURE_TYPE_MASK[] = "coding.picture-type-mask";
1584 
1585 /**
1586  * Resulting picture type
1587  */
1588 typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
1589                 kParamIndexPictureType>
1590         C2StreamPictureTypeInfo;
1591 typedef C2StreamPictureTypeInfo C2StreamPictureTypeMaskInfo;
1592 constexpr char C2_PARAMKEY_PICTURE_TYPE[] = "coded.picture-type";
1593 
1594 /**
1595  * GOP specification.
1596  *
1597  * GOP is specified in layers between sync frames, by specifying the number of specific type of
1598  * frames between the previous type (starting with sync frames for the first layer):
1599  *
1600  * E.g.
1601  *      - 4 I frames between each sync frame
1602  *      - 2 P frames between each I frame
1603  *      - 1 B frame between each P frame
1604  *
1605  *      [ { I, 4 }, { P, 2 }, { B, 1 } ] ==> (Sync)BPBPB IBPBPB IBPBPB IBPBPB IBPBPB (Sync)BPBPB
1606  *
1607  * For infinite GOP, I layer can be omitted (as the first frame is always a sync frame.):
1608  *
1609  *      [ { P, MAX_UINT } ]   ==> (Sync)PPPPPPPPPPPPPPPPPP...
1610  *
1611  * Sync frames can also be requested on demand, and as a time-based interval. For time-based
1612  * interval, if there hasn't been a sync frame in at least the given time, the next I frame shall
1613  * be encoded as a sync frame.  For sync request, the next I frame shall be encoded as a sync frame.
1614  *
1615  * Temporal layering will determine GOP structure other than the I frame count between sync
1616  * frames.
1617  */
1618 struct C2GopLayerStruct {
1619     C2Config::picture_type_t type;
1620     uint32_t count;
1621 
1622     DEFINE_AND_DESCRIBE_C2STRUCT(GopLayer)
1623     C2FIELD(type, "type")
1624     C2FIELD(type, "count")
1625 };
1626 
1627 typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2GopLayerStruct>, kParamIndexGop>
1628         C2StreamGopTuning;
1629 constexpr char C2_PARAMKEY_GOP[] = "coding.gop";
1630 
1631 /**
1632  * Sync frame can be requested on demand by the client.
1633  *
1634  * If true, the next I frame shall be encoded as a sync frame. This config can be passed
1635  * synchronously with the work, or directly to the component - leading to different result.
1636  * If it is passed with work, it shall take effect when that work item is being processed (so
1637  * the first I frame at or after that work item shall be a sync frame).
1638  */
1639 typedef C2StreamParam<C2Tuning, C2EasyBoolValue, kParamIndexRequestSyncFrame>
1640         C2StreamRequestSyncFrameTuning;
1641 constexpr char C2_PARAMKEY_REQUEST_SYNC_FRAME[] = "coding.request-sync-frame";
1642 
1643 /**
1644  * Sync frame interval in time domain (timestamp).
1645  *
1646  * If there hasn't been a sync frame in at least this value, the next intra frame shall be encoded
1647  * as a sync frame. The value of MAX_I32 or a negative value means no sync frames after the first
1648  * frame. A value of 0 means all sync frames.
1649  */
1650 typedef C2StreamParam<C2Tuning, C2Int64Value, kParamIndexSyncFramePeriod>
1651         C2StreamSyncFramePeriodTuning;
1652 constexpr char C2_PARAMKEY_SYNC_FRAME_PERIOD[] = "coding.sync-frame-period";
1653 
1654 /**
1655  * Temporal layering
1656  *
1657  * Layer index is a value between 0 and layer count - 1. Layers with higher index have higher
1658  * frequency:
1659  *     0
1660  *   1   1
1661  *  2 2 2 2
1662  */
1663 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerIndex> C2StreamLayerIndexInfo;
1664 constexpr char C2_PARAMKEY_LAYER_INDEX[] = "coded.layer-index";
1665 
1666 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerCount> C2StreamLayerCountInfo;
1667 constexpr char C2_PARAMKEY_LAYER_COUNT[] = "coded.layer-count";
1668 
1669 struct C2TemporalLayeringStruct {
1670     uint32_t layerCount;     ///< total number of layers (0 means no temporal layering)
1671     uint32_t bLayerCount;    ///< total number of bidirectional layers (<= num layers)
1672     /**
1673      * Bitrate budgets for each layer and the layers below, given as a ratio of the total
1674      * stream bitrate. This can be omitted or partially specififed by the client while configuring,
1675      * in which case the component shall fill in appropriate values for the missing layers.
1676      * This must be provided by the component when queried for at least layer count - 2 (as the
1677      * last layer's budget is always 1.0).
1678      */
1679     float bitrateRatios[];   ///< 1.0-based
1680 
1681     DEFINE_AND_DESCRIBE_C2STRUCT(TemporalLayering)
1682     C2FIELD(layerCount, "layer-count")
1683     C2FIELD(bLayerCount, "b-layer-count")
1684     C2FIELD(bitrateRatios, "bitrate-ratios")
1685 };
1686 
1687 typedef C2StreamParam<C2Tuning, C2TemporalLayeringStruct, kParamIndexTemporalLayering>
1688         C2StreamTemporalLayeringTuning;
1689 constexpr char C2_PARAMKEY_TEMPORAL_LAYERING[] = "coding.temporal-layering";
1690 
1691 /**
1692  * Intra-refresh.
1693  */
1694 
1695 C2ENUM(C2Config::intra_refresh_mode_t, uint32_t,
1696     INTRA_REFRESH_DISABLED,     ///< no intra refresh
1697     INTRA_REFRESH_ARBITRARY,    ///< arbitrary, unspecified
1698 )
1699 
1700 struct C2IntraRefreshStruct {
1701     C2Config::intra_refresh_mode_t mode; ///< refresh mode
1702     float period;         ///< intra refresh period in frames (must be >= 1), 0 means disabled
1703 
1704     DEFINE_AND_DESCRIBE_C2STRUCT(IntraRefresh)
1705     C2FIELD(mode, "mode")
1706     C2FIELD(period, "period")
1707 };
1708 
1709 typedef C2StreamParam<C2Tuning, C2IntraRefreshStruct, kParamIndexIntraRefresh>
1710         C2StreamIntraRefreshTuning;
1711 constexpr char C2_PARAMKEY_INTRA_REFRESH[] = "coding.intra-refresh";
1712 
1713 /* ====================================== IMAGE COMPONENTS ====================================== */
1714 
1715 /**
1716  * Tile layout.
1717  *
1718  * This described how the image is decomposed into tiles.
1719  */
1720 C2ENUM(C2Config::scan_order_t, uint32_t,
1721     SCAN_LEFT_TO_RIGHT_THEN_DOWN
1722 )
1723 
1724 struct C2TileLayoutStruct {
1725     C2PictureSizeStruct tile;       ///< tile size
1726     uint32_t columnCount;           ///< number of tiles horizontally
1727     uint32_t rowCount;              ///< number of tiles vertically
1728     C2Config::scan_order_t order;   ///< tile order
1729 
1730     DEFINE_AND_DESCRIBE_C2STRUCT(TileLayout)
1731     C2FIELD(tile, "tile")
1732     C2FIELD(columnCount, "columns")
1733     C2FIELD(rowCount, "rows")
1734     C2FIELD(order, "order")
1735 };
1736 
1737 typedef C2StreamParam<C2Info, C2TileLayoutStruct, kParamIndexTileLayout> C2StreamTileLayoutInfo;
1738 constexpr char C2_PARAMKEY_TILE_LAYOUT[] = "coded.tile-layout";
1739 
1740 /**
1741  * Tile handling.
1742  *
1743  * Whether to concatenate tiles or output them each.
1744  */
1745 C2ENUM(C2Config::tiling_mode_t, uint32_t,
1746     TILING_SEPARATE,    ///< output each tile in a separate onWorkDone
1747     TILING_CONCATENATE  ///< output one work completion per frame (concatenate tiles)
1748 )
1749 
1750 typedef C2StreamParam<C2Tuning, C2TileLayoutStruct, kParamIndexTileHandling>
1751         C2StreamTileHandlingTuning;
1752 constexpr char C2_PARAMKEY_TILE_HANDLING[] = "coding.tile-handling";
1753 
1754 /* ====================================== AUDIO COMPONENTS ====================================== */
1755 
1756 /**
1757  * Sample rate
1758  */
1759 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSampleRate> C2StreamSampleRateInfo;
1760 constexpr char C2_PARAMKEY_SAMPLE_RATE[] = "raw.sample-rate";
1761 constexpr char C2_PARAMKEY_CODED_SAMPLE_RATE[] = "coded.sample-rate";
1762 // deprecated
1763 #define C2_NAME_STREAM_SAMPLE_RATE_SETTING C2_PARAMKEY_SAMPLE_RATE
1764 
1765 /**
1766  * Channel count.
1767  */
1768 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexChannelCount> C2StreamChannelCountInfo;
1769 constexpr char C2_PARAMKEY_CHANNEL_COUNT[] = "raw.channel-count";
1770 constexpr char C2_PARAMKEY_CODED_CHANNEL_COUNT[] = "coded.channel-count";
1771 // deprecated
1772 #define C2_NAME_STREAM_CHANNEL_COUNT_SETTING C2_PARAMKEY_CHANNEL_COUNT
1773 
1774 /**
1775  * Audio sample format (PCM encoding)
1776  */
1777 C2ENUM(C2Config::pcm_encoding_t, uint32_t,
1778     PCM_16,
1779     PCM_8,
1780     PCM_FLOAT
1781 )
1782 
1783 typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::pcm_encoding_t>, kParamIndexPcmEncoding>
1784         C2StreamPcmEncodingInfo;
1785 constexpr char C2_PARAMKEY_PCM_ENCODING[] = "raw.pcm-encoding";
1786 constexpr char C2_PARAMKEY_CODED_PCM_ENCODING[] = "coded.pcm-encoding";
1787 
1788 /* --------------------------------------- AAC components --------------------------------------- */
1789 
1790 /**
1791  * AAC stream format
1792  */
1793 C2ENUM(C2Config::aac_packaging_t, uint32_t,
1794     AAC_PACKAGING_RAW,
1795     AAC_PACKAGING_ADTS
1796 )
1797 
1798 typedef C2Config::aac_packaging_t C2AacStreamFormatKind; // deprecated
1799 // deprecated
1800 constexpr C2Config::aac_packaging_t C2AacStreamFormatRaw = C2Config::AAC_PACKAGING_RAW;
1801 constexpr C2Config::aac_packaging_t C2AacStreamFormatAdts = C2Config::AAC_PACKAGING_ADTS;
1802 
1803 typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::aac_packaging_t>>,
1804         kParamIndexAacPackaging> C2StreamAacPackagingInfo;
1805 typedef C2StreamAacPackagingInfo C2StreamAacFormatInfo;
1806 constexpr char C2_PARAMKEY_AAC_PACKAGING[] = "coded.aac-packaging";
1807 #define C2_NAME_STREAM_AAC_FORMAT_SETTING C2_PARAMKEY_AAC_PACKAGING
1808 
1809 /* ================================ PLATFORM-DEFINED PARAMETERS ================================ */
1810 
1811 /**
1812  * Platform level and features.
1813  */
1814 enum C2Config::platform_level_t : uint32_t {
1815     PLATFORM_P,   ///< support for Android 9.0 feature set
1816 };
1817 
1818 // read-only
1819 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_level_t>,
1820                 kParamIndexPlatformLevel>
1821         C2PlatformLevelSetting;
1822 constexpr char C2_PARAMKEY_PLATFORM_LEVEL[] = "api.platform-level";
1823 
1824 enum C2Config::platform_feature_t : uint64_t {
1825     // no platform-specific features have been defined
1826 };
1827 
1828 // read-only
1829 typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_feature_t>,
1830                 kParamIndexPlatformFeatures>
1831         C2PlatformFeaturesSetting;
1832 constexpr char C2_PARAMKEY_PLATFORM_FEATURES[] = "api.platform-features";
1833 
1834 /**
1835  * This structure describes the preferred ion allocation parameters for a given memory usage.
1836  */
1837 struct C2StoreIonUsageStruct {
1838     inline C2StoreIonUsageStruct() = default;
C2StoreIonUsageStructC2StoreIonUsageStruct1839     inline C2StoreIonUsageStruct(uint64_t usage_, uint32_t capacity_)
1840         : usage(usage_), capacity(capacity_), heapMask(0), allocFlags(0), minAlignment(0) { }
1841 
1842     uint64_t usage;        ///< C2MemoryUsage
1843     uint32_t capacity;     ///< capacity
1844     int32_t heapMask;      ///< ion heapMask
1845     int32_t allocFlags;    ///< ion allocation flags
1846     uint32_t minAlignment; ///< minimum alignment
1847 
1848     DEFINE_AND_DESCRIBE_C2STRUCT(StoreIonUsage)
1849     C2FIELD(usage, "usage")
1850     C2FIELD(capacity, "capacity")
1851     C2FIELD(heapMask, "heap-mask")
1852     C2FIELD(allocFlags, "alloc-flags")
1853     C2FIELD(minAlignment, "min-alignment")
1854 };
1855 
1856 // store, private
1857 typedef C2GlobalParam<C2Info, C2StoreIonUsageStruct, kParamIndexStoreIonUsage>
1858         C2StoreIonUsageInfo;
1859 
1860 /**
1861  * This structure describes the android dataspace for a raw video/image frame.
1862  */
1863 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexDataSpace> C2StreamDataSpaceInfo;
1864 constexpr char C2_PARAMKEY_DATA_SPACE[] = "raw.data-space";
1865 
1866 /**
1867  * This structure describes the android dataspace for a raw video/image frame.
1868  */
1869 typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSurfaceScaling> C2StreamSurfaceScalingInfo;
1870 constexpr char C2_PARAMKEY_SURFACE_SCALING_MODE[] = "raw.surface-scaling";
1871 
1872 /* ======================================= INPUT SURFACE ======================================= */
1873 
1874 /**
1875  * Input surface EOS
1876  */
1877 typedef C2GlobalParam<C2Tuning, C2EasyBoolValue, kParamIndexInputSurfaceEos>
1878         C2InputSurfaceEosTuning;
1879 constexpr char C2_PARAMKEY_INPUT_SURFACE_EOS[] = "input-surface.eos";
1880 #define C2_NAME_INPUT_SURFACE_EOS_TUNING C2_PARAMKEY_INPUT_SURFACE_EOS
1881 
1882 /**
1883  * Start/suspend/resume/stop timestamps.
1884  *
1885  * TODO: make these counters
1886  */
1887 typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexStartAt> C2PortStartTimestampTuning;
1888 typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexSuspendAt> C2PortSuspendTimestampTuning;
1889 typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexResumeAt> C2PortResumeTimestampTuning;
1890 typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexStopAt> C2PortStopTimestampTuning;
1891 
1892 /**
1893  * Time offset for input surface.
1894  */
1895 typedef C2GlobalParam<C2Tuning, C2Int64Value, kParamIndexTimeOffset> C2ComponentTimeOffsetTuning;
1896 
1897 /**
1898  * Minimum fps for input surface.
1899  *
1900  * Repeat frame to meet this.
1901  */
1902 typedef C2PortParam<C2Tuning, C2FloatValue, kParamIndexMinFrameRate> C2PortMinFrameRateTuning;
1903 
1904 /// @}
1905 
1906 #endif  // C2CONFIG_H_
1907