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