blob: 2cc7ab7d7de1f7f2db1211b5980d12c0da5bc8ea [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef C2CONFIG_H_
#define C2CONFIG_H_
#include <C2.h>
#include <C2Component.h>
#include <C2Enum.h>
#include <C2ParamDef.h>
/// \defgroup config Component configuration
/// @{
/**
* Enumerated boolean.
*/
C2ENUM(c2_bool_t, uint32_t,
C2_FALSE, ///< true
C2_TRUE, ///< false
)
typedef C2SimpleValueStruct<c2_bool_t> C2BoolValue;
typedef C2SimpleValueStruct<C2EasyEnum<c2_bool_t>> C2EasyBoolValue;
/**
* Enumerated set tri-state.
*
* Used for optional configurations to distinguish between values set by the client,
* default values set by the component, or unset values.
*/
C2ENUM(c2_set_t, uint32_t,
C2_UNSET, // parameter is unset and has no value
C2_SET, // parameter is/has been set by the client
C2_DEFAULT, // parameter has not been set by the client, but is set by the component
)
/** Enumerations used by configuration parameters */
struct C2Config {
enum aac_packaging_t : uint32_t; ///< AAC packaging (RAW vs ADTS)
enum aac_sbr_mode_t : uint32_t; ///< AAC SBR mode
enum api_feature_t : uint64_t; ///< API features
enum api_level_t : uint32_t; ///< API level
enum bitrate_mode_t : uint32_t; ///< bitrate control mode
enum drc_compression_mode_t : int32_t; ///< DRC compression mode
enum drc_effect_type_t : int32_t; ///< DRC effect type
enum drc_album_mode_t : int32_t; ///< DRC album mode
enum intra_refresh_mode_t : uint32_t; ///< intra refresh modes
enum level_t : uint32_t; ///< coding level
enum ordinal_key_t : uint32_t; ///< work ordering keys
enum pcm_encoding_t : uint32_t; ///< PCM encoding
enum picture_type_t : uint32_t; ///< picture types
enum platform_feature_t : uint64_t; ///< platform features
enum platform_level_t : uint32_t; ///< platform level
enum prepend_header_mode_t : uint32_t; ///< prepend header operational modes
enum profile_t : uint32_t; ///< coding profile
enum scaling_method_t : uint32_t; ///< scaling methods
enum scan_order_t : uint32_t; ///< scan orders
enum secure_mode_t : uint32_t; ///< secure/protected modes
enum supplemental_info_t : uint32_t; ///< supplemental information types
enum tiling_mode_t : uint32_t; ///< tiling modes
};
struct C2PlatformConfig {
enum encoding_quality_level_t : uint32_t; ///< encoding quality level
};
namespace {
enum C2ParamIndexKind : C2Param::type_index_t {
C2_PARAM_INDEX_INVALID = 0x0, ///< do not use
C2_PARAM_INDEX_STRUCT_START = 0x1, ///< struct only indices
C2_PARAM_INDEX_PARAM_START = 0x800, ///< regular parameters
C2_PARAM_INDEX_CODER_PARAM_START = 0x1000, ///< en/transcoder parameters
C2_PARAM_INDEX_PICTURE_PARAM_START = 0x1800, ///< image/video parameters
C2_PARAM_INDEX_VIDEO_PARAM_START = 0x2000, ///< video parameters
C2_PARAM_INDEX_IMAGE_PARAM_START = 0x2800, ///< image parameters
C2_PARAM_INDEX_AUDIO_PARAM_START = 0x3000, ///< image parameters
C2_PARAM_INDEX_PLATFORM_START = 0x4000, ///< platform-defined parameters
/* =================================== structure indices =================================== */
kParamIndexColorXy = C2_PARAM_INDEX_STRUCT_START,
kParamIndexMasteringDisplayColorVolume,
kParamIndexChromaOffset,
kParamIndexGopLayer,
/* =================================== parameter indices =================================== */
kParamIndexApiLevel = C2_PARAM_INDEX_PARAM_START,
kParamIndexApiFeatures,
/* ------------------------------------ all components ------------------------------------ */
/* generic component characteristics */
kParamIndexName,
kParamIndexAliases,
kParamIndexKind,
kParamIndexDomain,
kParamIndexAttributes,
kParamIndexTimeStretch,
/* coding characteristics */
kParamIndexProfileLevel,
kParamIndexInitData,
kParamIndexSupplementalData,
kParamIndexSubscribedSupplementalData,
/* pipeline characteristics */
kParamIndexMediaType,
__kParamIndexRESERVED_0,
kParamIndexDelay,
kParamIndexMaxReferenceAge,
kParamIndexMaxReferenceCount,
kParamIndexReorderBufferDepth,
kParamIndexReorderKey,
kParamIndexStreamCount,
kParamIndexSubscribedParamIndices,
kParamIndexSuggestedBufferCount,
kParamIndexBatchSize,
kParamIndexCurrentWork,
kParamIndexLastWorkQueued,
/* memory allocation */
kParamIndexAllocators,
kParamIndexBlockPools,
kParamIndexBufferType,
kParamIndexUsage,
kParamIndexOutOfMemory,
kParamIndexMaxBufferSize,
/* misc. state */
kParamIndexTripped,
kParamIndexConfigCounter,
/* resources */
kParamIndexResourcesNeeded,
kParamIndexResourcesReserved,
kParamIndexOperatingRate,
kParamIndexRealTimePriority,
/* protected content */
kParamIndexSecureMode,
kParamIndexEncryptedBuffer, // info-buffer, used with SM_READ_PROTECTED_WITH_ENCRYPTED
// deprecated
kParamIndexDelayRequest = kParamIndexDelay | C2Param::CoreIndex::IS_REQUEST_FLAG,
/* ------------------------------------ (trans/en)coders ------------------------------------ */
kParamIndexBitrate = C2_PARAM_INDEX_CODER_PARAM_START,
kParamIndexBitrateMode,
kParamIndexQuality,
kParamIndexComplexity,
kParamIndexPrependHeaderMode,
/* --------------------------------- image/video components --------------------------------- */
kParamIndexPictureSize = C2_PARAM_INDEX_PICTURE_PARAM_START,
kParamIndexCropRect,
kParamIndexPixelFormat,
kParamIndexRotation,
kParamIndexPixelAspectRatio,
kParamIndexScaledPictureSize,
kParamIndexScaledCropRect,
kParamIndexScalingMethod,
kParamIndexColorInfo,
kParamIndexColorAspects,
kParamIndexHdrStaticMetadata,
kParamIndexDefaultColorAspects,
kParamIndexBlockSize,
kParamIndexBlockCount,
kParamIndexBlockRate,
kParamIndexPictureTypeMask,
kParamIndexPictureType,
kParamIndexHdr10PlusMetadata,
kParamIndexPictureQuantization,
/* ------------------------------------ video components ------------------------------------ */
kParamIndexFrameRate = C2_PARAM_INDEX_VIDEO_PARAM_START,
kParamIndexMaxBitrate,
kParamIndexMaxFrameRate,
kParamIndexMaxPictureSize,
kParamIndexGop,
kParamIndexSyncFrameInterval,
kParamIndexRequestSyncFrame,
kParamIndexTemporalLayering,
kParamIndexLayerIndex,
kParamIndexLayerCount,
kParamIndexIntraRefresh,
/* ------------------------------------ image components ------------------------------------ */
kParamIndexTileLayout = C2_PARAM_INDEX_IMAGE_PARAM_START,
kParamIndexTileHandling,
/* ------------------------------------ audio components ------------------------------------ */
kParamIndexSampleRate = C2_PARAM_INDEX_AUDIO_PARAM_START,
kParamIndexChannelCount,
kParamIndexPcmEncoding,
kParamIndexAacPackaging,
kParamIndexMaxChannelCount,
kParamIndexAacSbrMode, // aac encode, enum
kParamIndexDrcEncodedTargetLevel, // drc, float (dBFS)
kParamIndexDrcTargetReferenceLevel, // drc, float (dBFS)
kParamIndexDrcCompression, // drc, enum
kParamIndexDrcBoostFactor, // drc, float (0-1)
kParamIndexDrcAttenuationFactor, // drc, float (0-1)
kParamIndexDrcEffectType, // drc, enum
kParamIndexDrcOutputLoudness, // drc, float (dBFS)
kParamIndexDrcAlbumMode, // drc, enum
kParamIndexAudioFrameSize, // int
/* ============================== platform-defined parameters ============================== */
kParamIndexPlatformLevel = C2_PARAM_INDEX_PLATFORM_START, // all, u32
kParamIndexPlatformFeatures, // all, u64 mask
kParamIndexStoreIonUsage, // store, struct
kParamIndexAspectsToDataSpace, // store, struct
kParamIndexFlexiblePixelFormatDescriptor, // store, struct
kParamIndexFlexiblePixelFormatDescriptors, // store, struct[]
kParamIndexDataSpaceToAspects, // store, struct
kParamIndexDataSpace, // u32
kParamIndexSurfaceScaling, // u32
// input surface
kParamIndexInputSurfaceEos, // input-surface, eos
kParamIndexTimedControl, // struct
kParamIndexStartAt, // input-surface, struct
kParamIndexSuspendAt, // input-surface, struct
kParamIndexResumeAt, // input-surface, struct
kParamIndexStopAt, // input-surface, struct
kParamIndexTimeOffset, // input-surface, struct
kParamIndexMinFrameRate, // input-surface, float
kParamIndexTimestampGapAdjustment, // input-surface, struct
kParamIndexSurfaceAllocator, // u32
// low latency mode
kParamIndexLowLatencyMode, // bool
// tunneled codec
kParamIndexTunneledMode, // struct
kParamIndexTunnelHandle, // int32[]
kParamIndexTunnelSystemTime, // int64
kParamIndexTunnelHoldRender, // bool
kParamIndexTunnelStartRender, // bool
// dmabuf allocator
kParamIndexStoreDmaBufUsage, // store, struct
// encoding quality requirements
kParamIndexEncodingQualityLevel, // encoders, enum
};
}
/**
* Codec 2.0 parameter types follow the following naming convention:
*
* C2<group><domain><index><type>
*
* E.g. C2StreamPictureSizeInfo: group="" domain="Stream" index="PictureSize" type="Info".
* Group is somewhat arbitrary, but denotes kind of objects the parameter is defined.
* At this point we use Component and Store to distinguish basic component/store parameters.
*
* Parameter keys are named C2_PARAMKEY_[<group>_]<domain>_<index> as type is not expected
* to distinguish parameters. E.g. a component could change the type of the parameter and it
* is not expected users would need to change the key.
*/
/* ----------------------------------------- API level ----------------------------------------- */
enum C2Config::api_level_t : uint32_t {
API_L0_1 = 0, ///< support for API level 0.1
};
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_level_t>, kParamIndexApiLevel>
C2ApiLevelSetting;
constexpr char C2_PARAMKEY_API_LEVEL[] = "api.level";
C2ENUM(C2Config::api_feature_t, uint64_t,
API_REFLECTION = (1U << 0), ///< ability to list supported parameters
API_VALUES = (1U << 1), ///< ability to list supported values for each parameter
API_CURRENT_VALUES = (1U << 2), ///< ability to list currently supported values for each parameter
API_DEPENDENCY = (1U << 3), ///< have a defined parameter dependency
API_SAME_INPUT_BUFFER = (1U << 16), ///< supporting multiple input buffers
///< backed by the same allocation
API_STREAMS = (1ULL << 32), ///< supporting variable number of streams
API_TUNNELING = (1ULL << 48) ///< tunneling API
)
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::api_feature_t>, kParamIndexApiFeatures>
C2ApiFeaturesSetting;
constexpr char C2_PARAMKEY_API_FEATURES[] = "api.features";
/* ----------------------------- generic component characteristics ----------------------------- */
/**
* The name of the component.
*
* This must contain only alphanumeric characters or dot '.', hyphen '-', plus '+', or
* underline '_'. The name of each component must be unique.
*
* For Android: Component names must start with 'c2.' followed by the company name or abbreviation
* and another dot, e.g. 'c2.android.'. Use of lowercase is preferred but not required.
*/
// read-only
typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexName> C2ComponentNameSetting;
constexpr char C2_PARAMKEY_COMPONENT_NAME[] = "component.name";
/**
* Alternate names (aliases) of the component.
*
* This is a comma ',' separated list of alternate component names. Unlike component names that
* must be unique, multiple components can have the same alias.
*/
// read-only
typedef C2GlobalParam<C2Setting, C2StringValue, kParamIndexAliases> C2ComponentAliasesSetting;
constexpr char C2_PARAMKEY_COMPONENT_ALIASES[] = "component.aliases";
/**
* Component kind.
*/
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::kind_t>, kParamIndexKind>
C2ComponentKindSetting;
constexpr char C2_PARAMKEY_COMPONENT_KIND[] = "component.kind";
/**
* Component domain.
*/
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::domain_t>, kParamIndexDomain>
C2ComponentDomainSetting;
constexpr char C2_PARAMKEY_COMPONENT_DOMAIN[] = "component.domain";
/**
* Component attributes.
*
* These are a set of flags provided by the component characterizing its processing algorithm.
*/
C2ENUM(C2Component::attrib_t, uint64_t,
ATTRIB_IS_TEMPORAL = 1u << 0, ///< component input ordering matters for processing
)
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Component::attrib_t>, kParamIndexAttributes>
C2ComponentAttributesSetting;
constexpr char C2_PARAMKEY_COMPONENT_ATTRIBUTES[] = "component.attributes";
/**
* Time stretching.
*
* This is the ratio between the rate of the input timestamp, and the rate of the output timestamp.
* E.g. if this is 4.0, for every 1 seconds of input timestamp difference, the output shall differ
* by 4 seconds.
*/
typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexTimeStretch> C2ComponentTimeStretchTuning;
constexpr char C2_PARAMKEY_TIME_STRETCH[] = "algo.time-stretch";
/* ----------------------------------- coding characteristics ----------------------------------- */
/**
* Profile and level.
*
* Profile determines the tools used by the component.
* Level determines the level of resources used by the component.
*/
namespace {
// Codec bases are ordered by their date of introduction to the code base.
enum : uint32_t {
_C2_PL_MP2V_BASE = 0x1000,
_C2_PL_AAC_BASE = 0x2000,
_C2_PL_H263_BASE = 0x3000,
_C2_PL_MP4V_BASE = 0x4000,
_C2_PL_AVC_BASE = 0x5000,
_C2_PL_HEVC_BASE = 0x6000,
_C2_PL_VP9_BASE = 0x7000,
_C2_PL_DV_BASE = 0x8000,
_C2_PL_AV1_BASE = 0x9000,
_C2_PL_VP8_BASE = 0xA000,
_C2_PL_MPEGH_BASE = 0xB000, // MPEG-H 3D Audio
C2_PROFILE_LEVEL_VENDOR_START = 0x70000000,
};
}
// Profiles and levels for each codec are ordered based on how they are ordered in the
// corresponding standard documents at introduction, and chronologically afterwards.
enum C2Config::profile_t : uint32_t {
PROFILE_UNUSED = 0, ///< profile is not used by this media type
// AAC (MPEG-2 Part 7 and MPEG-4 Part 3) profiles
PROFILE_AAC_LC = _C2_PL_AAC_BASE, ///< AAC Low-Complexity
PROFILE_AAC_MAIN, ///< AAC Main
PROFILE_AAC_SSR, ///< AAC Scalable Sampling Rate
PROFILE_AAC_LTP, ///< AAC Long Term Prediction
PROFILE_AAC_HE, ///< AAC High-Efficiency
PROFILE_AAC_SCALABLE, ///< AAC Scalable
PROFILE_AAC_ER_LC, ///< AAC Error Resilient Low-Complexity
PROFILE_AAC_ER_SCALABLE, ///< AAC Error Resilient Scalable
PROFILE_AAC_LD, ///< AAC Low Delay
PROFILE_AAC_HE_PS, ///< AAC High-Efficiency Parametric Stereo
PROFILE_AAC_ELD, ///< AAC Enhanced Low Delay
PROFILE_AAC_XHE, ///< AAC Extended High-Efficiency
// MPEG-2 Video profiles
PROFILE_MP2V_SIMPLE = _C2_PL_MP2V_BASE, ///< MPEG-2 Video (H.262) Simple
PROFILE_MP2V_MAIN, ///< MPEG-2 Video (H.262) Main
PROFILE_MP2V_SNR_SCALABLE, ///< MPEG-2 Video (H.262) SNR Scalable
PROFILE_MP2V_SPATIALLY_SCALABLE, ///< MPEG-2 Video (H.262) Spatially Scalable
PROFILE_MP2V_HIGH, ///< MPEG-2 Video (H.262) High
PROFILE_MP2V_422, ///< MPEG-2 Video (H.262) 4:2:2
PROFILE_MP2V_MULTIVIEW, ///< MPEG-2 Video (H.262) Multi-view
// H.263 profiles
PROFILE_H263_BASELINE = _C2_PL_H263_BASE, ///< H.263 Baseline (Profile 0)
PROFILE_H263_H320, ///< H.263 H.320 Coding Efficiency Version 2 Backward-Compatibility (Profile 1)
PROFILE_H263_V1BC, ///< H.263 Version 1 Backward-Compatibility (Profile 2)
PROFILE_H263_ISWV2, ///< H.263 Version 2 Interactive and Streaming Wireless (Profile 3)
PROFILE_H263_ISWV3, ///< H.263 Version 3 Interactive and Streaming Wireless (Profile 4)
PROFILE_H263_HIGH_COMPRESSION, ///< H.263 Conversational High Compression (Profile 5)
PROFILE_H263_INTERNET, ///< H.263 Conversational Internet (Profile 6)
PROFILE_H263_INTERLACE, ///< H.263 Conversational Interlace (Profile 7)
PROFILE_H263_HIGH_LATENCY, ///< H.263 High Latency (Profile 8)
// MPEG-4 Part 2 (Video) Natural Visual Profiles
PROFILE_MP4V_SIMPLE, ///< MPEG-4 Video Simple
PROFILE_MP4V_SIMPLE_SCALABLE, ///< MPEG-4 Video Simple Scalable
PROFILE_MP4V_CORE, ///< MPEG-4 Video Core
PROFILE_MP4V_MAIN, ///< MPEG-4 Video Main
PROFILE_MP4V_NBIT, ///< MPEG-4 Video N-Bit
PROFILE_MP4V_ARTS, ///< MPEG-4 Video Advanced Realtime Simple
PROFILE_MP4V_CORE_SCALABLE, ///< MPEG-4 Video Core Scalable
PROFILE_MP4V_ACE, ///< MPEG-4 Video Advanced Coding Efficiency
PROFILE_MP4V_ADVANCED_CORE, ///< MPEG-4 Video Advanced Core
PROFILE_MP4V_SIMPLE_STUDIO, ///< MPEG-4 Video Simple Studio
PROFILE_MP4V_CORE_STUDIO, ///< MPEG-4 Video Core Studio
PROFILE_MP4V_ADVANCED_SIMPLE, ///< MPEG-4 Video Advanced Simple
PROFILE_MP4V_FGS, ///< MPEG-4 Video Fine Granularity Scalable
// AVC / MPEG-4 Part 10 (H.264) profiles
PROFILE_AVC_BASELINE = _C2_PL_AVC_BASE, ///< AVC (H.264) Baseline
PROFILE_AVC_CONSTRAINED_BASELINE, ///< AVC (H.264) Constrained Baseline
PROFILE_AVC_MAIN, ///< AVC (H.264) Main
PROFILE_AVC_EXTENDED, ///< AVC (H.264) Extended
PROFILE_AVC_HIGH, ///< AVC (H.264) High
PROFILE_AVC_PROGRESSIVE_HIGH, ///< AVC (H.264) Progressive High
PROFILE_AVC_CONSTRAINED_HIGH, ///< AVC (H.264) Constrained High
PROFILE_AVC_HIGH_10, ///< AVC (H.264) High 10
PROFILE_AVC_PROGRESSIVE_HIGH_10, ///< AVC (H.264) Progressive High 10
PROFILE_AVC_HIGH_422, ///< AVC (H.264) High 4:2:2
PROFILE_AVC_HIGH_444_PREDICTIVE, ///< AVC (H.264) High 4:4:4 Predictive
PROFILE_AVC_HIGH_10_INTRA, ///< AVC (H.264) High 10 Intra
PROFILE_AVC_HIGH_422_INTRA, ///< AVC (H.264) High 4:2:2 Intra
PROFILE_AVC_HIGH_444_INTRA, ///< AVC (H.264) High 4:4:4 Intra
PROFILE_AVC_CAVLC_444_INTRA, ///< AVC (H.264) CAVLC 4:4:4 Intra
PROFILE_AVC_SCALABLE_BASELINE = _C2_PL_AVC_BASE + 0x100, ///< AVC (H.264) Scalable Baseline
PROFILE_AVC_SCALABLE_CONSTRAINED_BASELINE, ///< AVC (H.264) Scalable Constrained Baseline
PROFILE_AVC_SCALABLE_HIGH, ///< AVC (H.264) Scalable High
PROFILE_AVC_SCALABLE_CONSTRAINED_HIGH, ///< AVC (H.264) Scalable Constrained High
PROFILE_AVC_SCALABLE_HIGH_INTRA, ///< AVC (H.264) Scalable High Intra
PROFILE_AVC_MULTIVIEW_HIGH = _C2_PL_AVC_BASE + 0x200, ///< AVC (H.264) Multiview High
PROFILE_AVC_STEREO_HIGH, ///< AVC (H.264) Stereo High
PROFILE_AVC_MFC_HIGH, ///< AVC (H.264) MFC High
PROFILE_AVC_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x300, ///< AVC (H.264) Multiview Depth High
PROFILE_AVC_MFC_DEPTH_HIGH, ///< AVC (H.264) MFC Depth High
PROFILE_AVC_ENHANCED_MULTIVIEW_DEPTH_HIGH = _C2_PL_AVC_BASE + 0x400, ///< AVC (H.264) Enhanced Multiview Depth High
// HEVC profiles
PROFILE_HEVC_MAIN = _C2_PL_HEVC_BASE, ///< HEVC (H.265) Main
PROFILE_HEVC_MAIN_10, ///< HEVC (H.265) Main 10
PROFILE_HEVC_MAIN_STILL, ///< HEVC (H.265) Main Still Picture
PROFILE_HEVC_MONO = _C2_PL_HEVC_BASE + 0x100, ///< HEVC (H.265) Monochrome
PROFILE_HEVC_MONO_12, ///< HEVC (H.265) Monochrome 12
PROFILE_HEVC_MONO_16, ///< HEVC (H.265) Monochrome 16
PROFILE_HEVC_MAIN_12, ///< HEVC (H.265) Main 12
PROFILE_HEVC_MAIN_422_10, ///< HEVC (H.265) Main 4:2:2 10
PROFILE_HEVC_MAIN_422_12, ///< HEVC (H.265) Main 4:2:2 12
PROFILE_HEVC_MAIN_444, ///< HEVC (H.265) Main 4:4:4
PROFILE_HEVC_MAIN_444_10, ///< HEVC (H.265) Main 4:4:4 10
PROFILE_HEVC_MAIN_444_12, ///< HEVC (H.265) Main 4:4:4 12
PROFILE_HEVC_MAIN_INTRA, ///< HEVC (H.265) Main Intra
PROFILE_HEVC_MAIN_10_INTRA, ///< HEVC (H.265) Main 10 Intra
PROFILE_HEVC_MAIN_12_INTRA, ///< HEVC (H.265) Main 12 Intra
PROFILE_HEVC_MAIN_422_10_INTRA, ///< HEVC (H.265) Main 4:2:2 10 Intra
PROFILE_HEVC_MAIN_422_12_INTRA, ///< HEVC (H.265) Main 4:2:2 12 Intra
PROFILE_HEVC_MAIN_444_INTRA, ///< HEVC (H.265) Main 4:4:4 Intra
PROFILE_HEVC_MAIN_444_10_INTRA, ///< HEVC (H.265) Main 4:4:4 10 Intra
PROFILE_HEVC_MAIN_444_12_INTRA, ///< HEVC (H.265) Main 4:4:4 12 Intra
PROFILE_HEVC_MAIN_444_16_INTRA, ///< HEVC (H.265) Main 4:4:4 16 Intra
PROFILE_HEVC_MAIN_444_STILL, ///< HEVC (H.265) Main 4:4:4 Still Picture
PROFILE_HEVC_MAIN_444_16_STILL, ///< HEVC (H.265) Main 4:4:4 16 Still Picture
PROFILE_HEVC_HIGH_444 = _C2_PL_HEVC_BASE + 0x200, ///< HEVC (H.265) High Throughput 4:4:4
PROFILE_HEVC_HIGH_444_10, ///< HEVC (H.265) High Throughput 4:4:4 10
PROFILE_HEVC_HIGH_444_14, ///< HEVC (H.265) High Throughput 4:4:4 14
PROFILE_HEVC_HIGH_444_16_INTRA, ///< HEVC (H.265) High Throughput 4:4:4 16 Intra
PROFILE_HEVC_SX_MAIN = _C2_PL_HEVC_BASE + 0x300, ///< HEVC (H.265) Screen-Extended Main
PROFILE_HEVC_SX_MAIN_10, ///< HEVC (H.265) Screen-Extended Main 10
PROFILE_HEVC_SX_MAIN_444, ///< HEVC (H.265) Screen-Extended Main 4:4:4
PROFILE_HEVC_SX_MAIN_444_10, ///< HEVC (H.265) Screen-Extended Main 4:4:4 10
PROFILE_HEVC_SX_HIGH_444, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4
PROFILE_HEVC_SX_HIGH_444_10, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 10
PROFILE_HEVC_SX_HIGH_444_14, ///< HEVC (H.265) Screen-Extended High Throughput 4:4:4 14
PROFILE_HEVC_MULTIVIEW_MAIN = _C2_PL_HEVC_BASE + 0x400, ///< HEVC (H.265) Multiview Main
PROFILE_HEVC_SCALABLE_MAIN = _C2_PL_HEVC_BASE + 0x500, ///< HEVC (H.265) Scalable Main
PROFILE_HEVC_SCALABLE_MAIN_10, ///< HEVC (H.265) Scalable Main 10
PROFILE_HEVC_SCALABLE_MONO = _C2_PL_HEVC_BASE + 0x600, ///< HEVC (H.265) Scalable Monochrome
PROFILE_HEVC_SCALABLE_MONO_12, ///< HEVC (H.265) Scalable Monochrome 12
PROFILE_HEVC_SCALABLE_MONO_16, ///< HEVC (H.265) Scalable Monochrome 16
PROFILE_HEVC_SCALABLE_MAIN_444, ///< HEVC (H.265) Scalable Main 4:4:4
PROFILE_HEVC_3D_MAIN = _C2_PL_HEVC_BASE + 0x700, ///< HEVC (H.265) 3D Main
// VP9 profiles
PROFILE_VP9_0 = _C2_PL_VP9_BASE, ///< VP9 Profile 0 (4:2:0)
PROFILE_VP9_1, ///< VP9 Profile 1 (4:2:2 or 4:4:4)
PROFILE_VP9_2, ///< VP9 Profile 2 (4:2:0, 10 or 12 bit)
PROFILE_VP9_3, ///< VP9 Profile 3 (4:2:2 or 4:4:4, 10 or 12 bit)
// Dolby Vision profiles
PROFILE_DV_AV_PER = _C2_PL_DV_BASE + 0, ///< Dolby Vision dvav.per profile (deprecated)
PROFILE_DV_AV_PEN, ///< Dolby Vision dvav.pen profile (deprecated)
PROFILE_DV_HE_DER, ///< Dolby Vision dvhe.der profile (deprecated)
PROFILE_DV_HE_DEN, ///< Dolby Vision dvhe.den profile (deprecated)
PROFILE_DV_HE_04 = _C2_PL_DV_BASE + 4, ///< Dolby Vision dvhe.04 profile
PROFILE_DV_HE_05 = _C2_PL_DV_BASE + 5, ///< Dolby Vision dvhe.05 profile
PROFILE_DV_HE_DTH, ///< Dolby Vision dvhe.dth profile (deprecated)
PROFILE_DV_HE_07 = _C2_PL_DV_BASE + 7, ///< Dolby Vision dvhe.07 profile
PROFILE_DV_HE_08 = _C2_PL_DV_BASE + 8, ///< Dolby Vision dvhe.08 profile
PROFILE_DV_AV_09 = _C2_PL_DV_BASE + 9, ///< Dolby Vision dvav.09 profile
PROFILE_DV_AV1_10 = _C2_PL_DV_BASE + 10, ///< Dolby Vision dav1.10 profile
// AV1 profiles
PROFILE_AV1_0 = _C2_PL_AV1_BASE, ///< AV1 Profile 0 (4:2:0, 8 to 10 bit)
PROFILE_AV1_1, ///< AV1 Profile 1 (8 to 10 bit)
PROFILE_AV1_2, ///< AV1 Profile 2 (8 to 12 bit)
// VP8 profiles
PROFILE_VP8_0 = _C2_PL_VP8_BASE, ///< VP8 Profile 0
PROFILE_VP8_1, ///< VP8 Profile 1
PROFILE_VP8_2, ///< VP8 Profile 2
PROFILE_VP8_3, ///< VP8 Profile 3
// MPEG-H 3D Audio profiles
PROFILE_MPEGH_MAIN = _C2_PL_MPEGH_BASE, ///< MPEG-H Main
PROFILE_MPEGH_HIGH, ///< MPEG-H High
PROFILE_MPEGH_LC, ///< MPEG-H Low-complexity
PROFILE_MPEGH_BASELINE, ///< MPEG-H Baseline
};
enum C2Config::level_t : uint32_t {
LEVEL_UNUSED = 0, ///< level is not used by this media type
// MPEG-2 Video levels
LEVEL_MP2V_LOW = _C2_PL_MP2V_BASE, ///< MPEG-2 Video (H.262) Low Level
LEVEL_MP2V_MAIN, ///< MPEG-2 Video (H.262) Main Level
LEVEL_MP2V_HIGH_1440, ///< MPEG-2 Video (H.262) High 1440 Level
LEVEL_MP2V_HIGH, ///< MPEG-2 Video (H.262) High Level
LEVEL_MP2V_HIGHP, ///< MPEG-2 Video (H.262) HighP Level
// H.263 levels
LEVEL_H263_10 = _C2_PL_H263_BASE, ///< H.263 Level 10
LEVEL_H263_20, ///< H.263 Level 20
LEVEL_H263_30, ///< H.263 Level 30
LEVEL_H263_40, ///< H.263 Level 40
LEVEL_H263_45, ///< H.263 Level 45
LEVEL_H263_50, ///< H.263 Level 50
LEVEL_H263_60, ///< H.263 Level 60
LEVEL_H263_70, ///< H.263 Level 70
// MPEG-4 Part 2 (Video) levels
LEVEL_MP4V_0 = _C2_PL_MP4V_BASE, ///< MPEG-4 Video Level 0
LEVEL_MP4V_0B, ///< MPEG-4 Video Level 0b
LEVEL_MP4V_1, ///< MPEG-4 Video Level 1
LEVEL_MP4V_2, ///< MPEG-4 Video Level 2
LEVEL_MP4V_3, ///< MPEG-4 Video Level 3
LEVEL_MP4V_3B, ///< MPEG-4 Video Level 3b
LEVEL_MP4V_4, ///< MPEG-4 Video Level 4
LEVEL_MP4V_4A, ///< MPEG-4 Video Level 4a
LEVEL_MP4V_5, ///< MPEG-4 Video Level 5
LEVEL_MP4V_6, ///< MPEG-4 Video Level 6
// AVC / MPEG-4 Part 10 (H.264) levels
LEVEL_AVC_1 = _C2_PL_AVC_BASE, ///< AVC (H.264) Level 1
LEVEL_AVC_1B, ///< AVC (H.264) Level 1b
LEVEL_AVC_1_1, ///< AVC (H.264) Level 1.1
LEVEL_AVC_1_2, ///< AVC (H.264) Level 1.2
LEVEL_AVC_1_3, ///< AVC (H.264) Level 1.3
LEVEL_AVC_2, ///< AVC (H.264) Level 2
LEVEL_AVC_2_1, ///< AVC (H.264) Level 2.1
LEVEL_AVC_2_2, ///< AVC (H.264) Level 2.2
LEVEL_AVC_3, ///< AVC (H.264) Level 3
LEVEL_AVC_3_1, ///< AVC (H.264) Level 3.1
LEVEL_AVC_3_2, ///< AVC (H.264) Level 3.2
LEVEL_AVC_4, ///< AVC (H.264) Level 4
LEVEL_AVC_4_1, ///< AVC (H.264) Level 4.1
LEVEL_AVC_4_2, ///< AVC (H.264) Level 4.2
LEVEL_AVC_5, ///< AVC (H.264) Level 5
LEVEL_AVC_5_1, ///< AVC (H.264) Level 5.1
LEVEL_AVC_5_2, ///< AVC (H.264) Level 5.2
LEVEL_AVC_6, ///< AVC (H.264) Level 6
LEVEL_AVC_6_1, ///< AVC (H.264) Level 6.1
LEVEL_AVC_6_2, ///< AVC (H.264) Level 6.2
// HEVC (H.265) tiers and levels
LEVEL_HEVC_MAIN_1 = _C2_PL_HEVC_BASE, ///< HEVC (H.265) Main Tier Level 1
LEVEL_HEVC_MAIN_2, ///< HEVC (H.265) Main Tier Level 2
LEVEL_HEVC_MAIN_2_1, ///< HEVC (H.265) Main Tier Level 2.1
LEVEL_HEVC_MAIN_3, ///< HEVC (H.265) Main Tier Level 3
LEVEL_HEVC_MAIN_3_1, ///< HEVC (H.265) Main Tier Level 3.1
LEVEL_HEVC_MAIN_4, ///< HEVC (H.265) Main Tier Level 4
LEVEL_HEVC_MAIN_4_1, ///< HEVC (H.265) Main Tier Level 4.1
LEVEL_HEVC_MAIN_5, ///< HEVC (H.265) Main Tier Level 5
LEVEL_HEVC_MAIN_5_1, ///< HEVC (H.265) Main Tier Level 5.1
LEVEL_HEVC_MAIN_5_2, ///< HEVC (H.265) Main Tier Level 5.2
LEVEL_HEVC_MAIN_6, ///< HEVC (H.265) Main Tier Level 6
LEVEL_HEVC_MAIN_6_1, ///< HEVC (H.265) Main Tier Level 6.1
LEVEL_HEVC_MAIN_6_2, ///< HEVC (H.265) Main Tier Level 6.2
LEVEL_HEVC_HIGH_4 = _C2_PL_HEVC_BASE + 0x100, ///< HEVC (H.265) High Tier Level 4
LEVEL_HEVC_HIGH_4_1, ///< HEVC (H.265) High Tier Level 4.1
LEVEL_HEVC_HIGH_5, ///< HEVC (H.265) High Tier Level 5
LEVEL_HEVC_HIGH_5_1, ///< HEVC (H.265) High Tier Level 5.1
LEVEL_HEVC_HIGH_5_2, ///< HEVC (H.265) High Tier Level 5.2
LEVEL_HEVC_HIGH_6, ///< HEVC (H.265) High Tier Level 6
LEVEL_HEVC_HIGH_6_1, ///< HEVC (H.265) High Tier Level 6.1
LEVEL_HEVC_HIGH_6_2, ///< HEVC (H.265) High Tier Level 6.2
// VP9 levels
LEVEL_VP9_1 = _C2_PL_VP9_BASE, ///< VP9 Level 1
LEVEL_VP9_1_1, ///< VP9 Level 1.1
LEVEL_VP9_2, ///< VP9 Level 2
LEVEL_VP9_2_1, ///< VP9 Level 2.1
LEVEL_VP9_3, ///< VP9 Level 3
LEVEL_VP9_3_1, ///< VP9 Level 3.1
LEVEL_VP9_4, ///< VP9 Level 4
LEVEL_VP9_4_1, ///< VP9 Level 4.1
LEVEL_VP9_5, ///< VP9 Level 5
LEVEL_VP9_5_1, ///< VP9 Level 5.1
LEVEL_VP9_5_2, ///< VP9 Level 5.2
LEVEL_VP9_6, ///< VP9 Level 6
LEVEL_VP9_6_1, ///< VP9 Level 6.1
LEVEL_VP9_6_2, ///< VP9 Level 6.2
// Dolby Vision levels
LEVEL_DV_MAIN_HD_24 = _C2_PL_DV_BASE, ///< Dolby Vision main tier hd24
LEVEL_DV_MAIN_HD_30, ///< Dolby Vision main tier hd30
LEVEL_DV_MAIN_FHD_24, ///< Dolby Vision main tier fhd24
LEVEL_DV_MAIN_FHD_30, ///< Dolby Vision main tier fhd30
LEVEL_DV_MAIN_FHD_60, ///< Dolby Vision main tier fhd60
LEVEL_DV_MAIN_UHD_24, ///< Dolby Vision main tier uhd24
LEVEL_DV_MAIN_UHD_30, ///< Dolby Vision main tier uhd30
LEVEL_DV_MAIN_UHD_48, ///< Dolby Vision main tier uhd48
LEVEL_DV_MAIN_UHD_60, ///< Dolby Vision main tier uhd60
LEVEL_DV_HIGH_HD_24 = _C2_PL_DV_BASE + 0x100, ///< Dolby Vision high tier hd24
LEVEL_DV_HIGH_HD_30, ///< Dolby Vision high tier hd30
LEVEL_DV_HIGH_FHD_24, ///< Dolby Vision high tier fhd24
LEVEL_DV_HIGH_FHD_30, ///< Dolby Vision high tier fhd30
LEVEL_DV_HIGH_FHD_60, ///< Dolby Vision high tier fhd60
LEVEL_DV_HIGH_UHD_24, ///< Dolby Vision high tier uhd24
LEVEL_DV_HIGH_UHD_30, ///< Dolby Vision high tier uhd30
LEVEL_DV_HIGH_UHD_48, ///< Dolby Vision high tier uhd48
LEVEL_DV_HIGH_UHD_60, ///< Dolby Vision high tier uhd60
// AV1 levels
LEVEL_AV1_2 = _C2_PL_AV1_BASE , ///< AV1 Level 2
LEVEL_AV1_2_1, ///< AV1 Level 2.1
LEVEL_AV1_2_2, ///< AV1 Level 2.2
LEVEL_AV1_2_3, ///< AV1 Level 2.3
LEVEL_AV1_3, ///< AV1 Level 3
LEVEL_AV1_3_1, ///< AV1 Level 3.1
LEVEL_AV1_3_2, ///< AV1 Level 3.2
LEVEL_AV1_3_3, ///< AV1 Level 3.3
LEVEL_AV1_4, ///< AV1 Level 4
LEVEL_AV1_4_1, ///< AV1 Level 4.1
LEVEL_AV1_4_2, ///< AV1 Level 4.2
LEVEL_AV1_4_3, ///< AV1 Level 4.3
LEVEL_AV1_5, ///< AV1 Level 5
LEVEL_AV1_5_1, ///< AV1 Level 5.1
LEVEL_AV1_5_2, ///< AV1 Level 5.2
LEVEL_AV1_5_3, ///< AV1 Level 5.3
LEVEL_AV1_6, ///< AV1 Level 6
LEVEL_AV1_6_1, ///< AV1 Level 6.1
LEVEL_AV1_6_2, ///< AV1 Level 6.2
LEVEL_AV1_6_3, ///< AV1 Level 6.3
LEVEL_AV1_7, ///< AV1 Level 7
LEVEL_AV1_7_1, ///< AV1 Level 7.1
LEVEL_AV1_7_2, ///< AV1 Level 7.2
LEVEL_AV1_7_3, ///< AV1 Level 7.3
// MPEG-H 3D Audio levels
LEVEL_MPEGH_1 = _C2_PL_MPEGH_BASE, ///< MPEG-H L1
LEVEL_MPEGH_2, ///< MPEG-H L2
LEVEL_MPEGH_3, ///< MPEG-H L3
LEVEL_MPEGH_4, ///< MPEG-H L4
LEVEL_MPEGH_5, ///< MPEG-H L5
};
struct C2ProfileLevelStruct {
C2Config::profile_t profile; ///< coding profile
C2Config::level_t level; ///< coding level
C2ProfileLevelStruct(
C2Config::profile_t profile_ = C2Config::PROFILE_UNUSED,
C2Config::level_t level_ = C2Config::LEVEL_UNUSED)
: profile(profile_), level(level_) { }
DEFINE_AND_DESCRIBE_C2STRUCT(ProfileLevel)
C2FIELD(profile, "profile")
C2FIELD(level, "level")
};
// TODO: may need to make this explicit (have .set member)
typedef C2StreamParam<C2Info, C2ProfileLevelStruct, kParamIndexProfileLevel>
C2StreamProfileLevelInfo;
constexpr char C2_PARAMKEY_PROFILE_LEVEL[] = "coded.pl";
/**
* Codec-specific initialization data.
*
* This is initialization data for the codec.
*
* For AVC/HEVC, these are the concatenated SPS/PPS/VPS NALs.
*
* TODO: define for other codecs.
*/
typedef C2StreamParam<C2Info, C2BlobValue, kParamIndexInitData> C2StreamInitDataInfo;
constexpr char C2_PARAMKEY_INIT_DATA[] = "coded.init-data";
/**
* Supplemental Data.
*
* This is coding-specific supplemental informational data, e.g. SEI for AVC/HEVC.
* This structure is not a configuration so it does not have a parameter key.
* This structure shall be returned in the configuration update, and can be repeated as needed
* in the same update.
*/
C2ENUM(C2Config::supplemental_info_t, uint32_t,
INFO_NONE = 0,
INFO_PREFIX_SEI_UNIT = 0x10000, ///< prefix SEI payload types add this flag
INFO_SUFFIX_SEI_UNIT = 0x20000, ///< suffix SEI payload types add this flag
INFO_SEI_USER_DATA = INFO_PREFIX_SEI_UNIT | 4, ///< closed-captioning data (ITU-T T35)
INFO_SEI_MDCV = INFO_PREFIX_SEI_UNIT | 137, ///< mastering display color volume
INFO_SET_USER_DATA_SFX = INFO_SUFFIX_SEI_UNIT | 4, ///< closed-captioning data (ITU-T T35)
INFO_VENDOR_START = 0x70000000
)
struct C2SupplementalDataStruct {
C2SupplementalDataStruct()
: type_(INFO_NONE) { }
C2SupplementalDataStruct(
size_t flexCount, C2Config::supplemental_info_t type, std::vector<uint8_t> data_)
: type_(type) {
memcpy(data, &data_[0], c2_min(data_.size(), flexCount));
}
C2Config::supplemental_info_t type_;
uint8_t data[];
DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(SupplementalData, data)
C2FIELD(type_, "type")
C2FIELD(data, "data")
};
typedef C2StreamParam<C2Info, C2SupplementalDataStruct, kParamIndexSupplementalData>
C2StreamSupplementalDataInfo;
/**
* Supplemental Data Subscription
*/
typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2Config::supplemental_info_t>,
kParamIndexSubscribedSupplementalData>
C2StreamSubscribedSupplementalDataTuning;
constexpr char C2_PARAMKEY_SUBSCRIBED_SUPPLEMENTAL_DATA[] = "output.subscribed-supplemental";
/* ---------------------------------- pipeline characteristics ---------------------------------- */
/**
* Media-type.
*
* This is defined for both port and stream, but stream media type may be a subtype of the
* port media type.
*/
typedef C2PortParam<C2Setting, C2StringValue, kParamIndexMediaType> C2PortMediaTypeSetting;
constexpr char C2_PARAMKEY_INPUT_MEDIA_TYPE[] = "input.media-type";
constexpr char C2_PARAMKEY_OUTPUT_MEDIA_TYPE[] = "output.media-type";
typedef C2StreamParam<C2Setting, C2StringValue, kParamIndexMediaType> C2StreamMediaTypeSetting;
/**
* Pipeline delays.
*
* Input delay is the number of additional input frames requested by the component to process
* an input frame.
*
* Output delay is the number of additional output frames that need to be generated before an
* output can be released by the component.
*
* Pipeline delay is the number of additional frames that are processed at one time by the
* component.
*
* As these may vary from frame to frame, the number is the maximum required value. E.g. if
* input delay is 0, the component is expected to consume each frame queued even if no further
* frames are queued. Similarly, if input delay is 1, as long as there are always exactly 2
* outstanding input frames queued to the component, it shall produce output.
*/
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelay | C2Param::CoreIndex::IS_REQUEST_FLAG>
C2PortRequestedDelayTuning;
constexpr char C2_PARAMKEY_INPUT_DELAY_REQUEST[] = "input.delay"; // deprecated
constexpr char C2_PARAMKEY_OUTPUT_DELAY_REQUEST[] = "output.delay"; // deprecated
typedef C2GlobalParam<C2Tuning, C2Uint32Value,
kParamIndexDelay | C2Param::CoreIndex::IS_REQUEST_FLAG>
C2RequestedPipelineDelayTuning;
constexpr char C2_PARAMKEY_PIPELINE_DELAY_REQUEST[] = "algo.delay"; // deprecated
// read-only
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2PortDelayTuning;
typedef C2PortDelayTuning C2PortActualDelayTuning; // deprecated
constexpr char C2_PARAMKEY_INPUT_DELAY[] = "input.delay";
constexpr char C2_PARAMKEY_OUTPUT_DELAY[] = "output.delay";
// read-only
typedef C2GlobalParam<C2Tuning, C2Uint32Value, kParamIndexDelay> C2PipelineDelayTuning;
typedef C2PipelineDelayTuning C2ActualPipelineDelayTuning; // deprecated
constexpr char C2_PARAMKEY_PIPELINE_DELAY[] = "algo.delay";
/**
* Enable/disable low latency mode.
* If true, low latency is preferred over low power. Disable power optimizations that
* may result in increased latency. For decoders, this means that the decoder does not
* hold input and output data more than required by the codec standards.
*/
typedef C2GlobalParam<C2Tuning, C2EasyBoolValue, kParamIndexLowLatencyMode>
C2GlobalLowLatencyModeTuning;
constexpr char C2_PARAMKEY_LOW_LATENCY_MODE[] = "algo.low-latency";
/**
* Reference characteristics.
*
* The component may hold onto input and output buffers even after completing the corresponding
* work item.
*
* Max reference age is the longest number of additional frame processing that a component may
* hold onto a buffer for. Max reference count is the number of buffers that a component may
* hold onto at the same time at the worst case. These numbers assume single frame per buffers.
*
* Use max-uint32 if there is no limit for the max age or count.
*/
typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceAge>
C2StreamMaxReferenceAgeTuning;
constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_AGE[] = "input.reference.max-age";
constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_AGE[] = "output.reference.max-age";
typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexMaxReferenceCount>
C2StreamMaxReferenceCountTuning;
constexpr char C2_PARAMKEY_INPUT_MAX_REFERENCE_COUNT[] = "input.reference.max-count";
constexpr char C2_PARAMKEY_OUTPUT_MAX_REFERENCE_COUNT[] = "output.reference.max-count";
/**
* Output reordering.
*
* The size of the window to use for output buffer reordering. 0 is interpreted as 1.
*/
// output only
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexReorderBufferDepth>
C2PortReorderBufferDepthTuning;
constexpr char C2_PARAMKEY_OUTPUT_REORDER_DEPTH[] = "output.reorder.depth";
C2ENUM(C2Config::ordinal_key_t, uint32_t,
ORDINAL,
TIMESTAMP,
CUSTOM)
// read-only, output only
typedef C2PortParam<C2Setting, C2SimpleValueStruct<C2Config::ordinal_key_t>, kParamIndexReorderKey>
C2PortReorderKeySetting;
constexpr char C2_PARAMKEY_OUTPUT_REORDER_KEY[] = "output.reorder.key";
/**
* Stream count.
*/
// private
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexStreamCount> C2PortStreamCountTuning;
constexpr char C2_PARAMKEY_INPUT_STREAM_COUNT[] = "input.stream-count";
constexpr char C2_PARAMKEY_OUTPUT_STREAM_COUNT[] = "output.stream-count";
/**
* Config update subscription.
*/
// private
typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexSubscribedParamIndices>
C2SubscribedParamIndicesTuning;
constexpr char C2_PARAMKEY_SUBSCRIBED_PARAM_INDICES[] = "output.subscribed-indices";
/**
* Suggested buffer (C2Frame) count. This is a suggestion by the component for the number of
* input and output frames allocated for the component's use in the buffer pools.
*
* Component shall set the acceptable range of buffers allocated for it. E.g. client shall
* allocate at least the minimum required value.
*/
// read-only
typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexSuggestedBufferCount>
C2PortSuggestedBufferCountTuning;
constexpr char C2_PARAMKEY_INPUT_SUGGESTED_BUFFER_COUNT[] = "input.buffers.pool-size";
constexpr char C2_PARAMKEY_OUTPUT_SUGGESTED_BUFFER_COUNT[] = "output.buffers.pool-size";
/**
* Input/output batching.
*
* For input, component requests that client batches work in batches of specified size. For output,
* client requests that the component batches work completion in given batch size.
* Value 0 means don't care.
*/
typedef C2PortParam<C2Tuning, C2Uint64Array, kParamIndexBatchSize> C2PortBatchSizeTuning;
constexpr char C2_PARAMKEY_INPUT_BATCH_SIZE[] = "input.buffers.batch-size";
constexpr char C2_PARAMKEY_OUTPUT_BATCH_SIZE[] = "output.buffers.batch-size";
/**
* Current & last work ordinals.
*
* input port: last work queued to component.
* output port: last work completed by component.
* global: current work.
*/
typedef C2PortParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexLastWorkQueued> C2LastWorkQueuedTuning;
typedef C2GlobalParam<C2Tuning, C2WorkOrdinalStruct, kParamIndexCurrentWork> C2CurrentWorkTuning;
/* ------------------------------------- memory allocation ------------------------------------- */
/**
* Allocators to use.
*
* These are requested by the component.
*
* If none specified, client will use the default allocator ID based on the component domain and
* kind.
*/
typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
C2PortAllocatorsTuning;
constexpr char C2_PARAMKEY_INPUT_ALLOCATORS[] = "input.buffers.allocator-ids";
constexpr char C2_PARAMKEY_OUTPUT_ALLOCATORS[] = "output.buffers.allocator-ids";
typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2Allocator::id_t>, kParamIndexAllocators>
C2PrivateAllocatorsTuning;
constexpr char C2_PARAMKEY_PRIVATE_ALLOCATORS[] = "algo.buffers.allocator-ids";
/**
* Allocator to use for outputting to surface.
*
* Components can optionally request allocator type for outputting to surface.
*
* If none specified, client will use the default BufferQueue-backed allocator ID for outputting to
* surface.
*/
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexSurfaceAllocator>
C2PortSurfaceAllocatorTuning;
constexpr char C2_PARAMKEY_OUTPUT_SURFACE_ALLOCATOR[] = "output.buffers.surface-allocator-id";
/**
* Block pools to use.
*
* These are allocated by the client for the component using the allocator IDs specified by the
* component. This is not used for the input port.
*/
typedef C2PortParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
C2PortBlockPoolsTuning;
constexpr char C2_PARAMKEY_OUTPUT_BLOCK_POOLS[] = "output.buffers.pool-ids";
typedef C2GlobalParam<C2Tuning, C2SimpleArrayStruct<C2BlockPool::local_id_t>, kParamIndexBlockPools>
C2PrivateBlockPoolsTuning;
constexpr char C2_PARAMKEY_PRIVATE_BLOCK_POOLS[] = "algo.buffers.pool-ids";
/**
* The max number of private allocations at any one time by the component.
* (This is an array with a corresponding value for each private allocator)
*/
typedef C2GlobalParam<C2Tuning, C2Uint32Array, kParamIndexMaxReferenceCount>
C2MaxPrivateBufferCountTuning;
constexpr char C2_PARAMKEY_MAX_PRIVATE_BUFFER_COUNT[] = "algo.buffers.max-count";
/**
* Buffer type
*
* This is provided by the component for the client to allocate the proper buffer type for the
* input port, and can be provided by the client to control the buffer type for the output.
*/
// private
typedef C2StreamParam<C2Setting, C2SimpleValueStruct<C2EasyEnum<C2BufferData::type_t>>,
kParamIndexBufferType>
C2StreamBufferTypeSetting;
constexpr char C2_PARAMKEY_INPUT_STREAM_BUFFER_TYPE[] = "input.buffers.type";
constexpr char C2_PARAMKEY_OUTPUT_STREAM_BUFFER_TYPE[] = "output.buffers.type";
/**
* Memory usage.
*
* Suggested by component for input and negotiated between client and component for output.
*/
typedef C2StreamParam<C2Tuning, C2Uint64Value, kParamIndexUsage> C2StreamUsageTuning;
constexpr char C2_PARAMKEY_INPUT_STREAM_USAGE[] = "input.buffers.usage";
constexpr char C2_PARAMKEY_OUTPUT_STREAM_USAGE[] = "output.buffers.usage";
/**
* Picture (video or image frame) size.
*/
struct C2PictureSizeStruct {
inline C2PictureSizeStruct()
: width(0), height(0) { }
inline C2PictureSizeStruct(uint32_t width_, uint32_t height_)
: width(width_), height(height_) { }
uint32_t width; ///< video width
uint32_t height; ///< video height
DEFINE_AND_DESCRIBE_C2STRUCT(PictureSize)
C2FIELD(width, "width")
C2FIELD(height, "height")
};
/**
* Out of memory signaling
*
* This is a configuration for the client to mark that it cannot allocate necessary private and/
* or output buffers to continue operation, and to signal the failing configuration.
*/
struct C2OutOfMemoryStruct {
C2BlockPool::local_id_t pool; ///< pool ID that failed the allocation
uint64_t usage; ///< memory usage used
C2PictureSizeStruct planar; ///< buffer dimensions to be allocated if 2D
uint32_t format; ///< pixel format to be used if 2D
uint32_t capacity; ///< buffer capacity to be allocated if 1D
c2_bool_t outOfMemory; ///< true if component is out of memory
DEFINE_AND_DESCRIBE_C2STRUCT(OutOfMemory)
C2FIELD(pool, "pool")
C2FIELD(usage, "usage")
C2FIELD(planar, "planar")
C2FIELD(format, "format")
C2FIELD(capacity, "capacity")
C2FIELD(outOfMemory, "out-of-memory")
};
typedef C2GlobalParam<C2Tuning, C2OutOfMemoryStruct, kParamIndexOutOfMemory> C2OutOfMemoryTuning;
constexpr char C2_PARAMKEY_OUT_OF_MEMORY[] = "algo.oom";
/**
* Max buffer size
*
* This is a hint provided by the component for the maximum buffer size expected on a stream for the
* current configuration on its input and output streams. This is communicated to clients so they
* can preallocate input buffers, or configure downstream components that require a maximum size on
* their buffers.
*
* Read-only. Required to be provided by components on all compressed streams.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexMaxBufferSize> C2StreamMaxBufferSizeInfo;
constexpr char C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE[] = "input.buffers.max-size";
constexpr char C2_PARAMKEY_OUTPUT_MAX_BUFFER_SIZE[] = "output.buffers.max-size";
/* ---------------------------------------- misc. state ---------------------------------------- */
/**
* Tripped state,
*
* This state exists to be able to provide reasoning for a tripped state during normal
* interface operations, as well as to allow client to trip the component on demand.
*/
typedef C2GlobalParam<C2Tuning, C2BoolValue, kParamIndexTripped>
C2TrippedTuning;
constexpr char C2_PARAMKEY_TRIPPED[] = "algo.tripped";
/**
* Configuration counters.
*
* Configurations are tracked using three counters. The input counter is incremented exactly
* once with each work accepted by the component. The output counter is incremented exactly
* once with each work completed by the component (in the order of work completion). The
* global counter is incremented exactly once during to each config() call. These counters
* shall be read-only.
*
* TODO: these should be counters.
*/
typedef C2PortParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2PortConfigCounterTuning;
typedef C2GlobalParam<C2Tuning, C2Uint64Value, kParamIndexConfigCounter> C2ConfigCounterTuning;
constexpr char C2_PARAMKEY_INPUT_COUNTER[] = "input.buffers.counter";
constexpr char C2_PARAMKEY_OUTPUT_COUNTER[] = "output.buffers.counter";
constexpr char C2_PARAMKEY_CONFIG_COUNTER[] = "algo.config.counter";
/* ----------------------------------------- resources ----------------------------------------- */
/**
* Resources needed and resources reserved for current configuration.
*
* Resources are tracked as a vector of positive numbers. Available resources are defined by
* the vendor.
*
* By default, no resources are reserved for a component. If resource reservation is successful,
* the component shall be able to use those resources exclusively. If however, the component is
* not using all of the reserved resources, those may be shared with other components.
*
* TODO: define some of the resources.
*/
typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesNeeded> C2ResourcesNeededTuning;
typedef C2GlobalParam<C2Tuning, C2Uint64Array, kParamIndexResourcesReserved>
C2ResourcesReservedTuning;
constexpr char C2_PARAMKEY_RESOURCES_NEEDED[] = "resources.needed";
constexpr char C2_PARAMKEY_RESOURCES_RESERVED[] = "resources.reserved";
/**
* Operating rate.
*
* Operating rate is the expected rate of work through the component. Negative values is
* invalid.
*
* TODO: this could distinguish set value
*/
typedef C2GlobalParam<C2Tuning, C2FloatValue, kParamIndexOperatingRate> C2OperatingRateTuning;
constexpr char C2_PARAMKEY_OPERATING_RATE[] = "algo.rate";
/**
* Realtime / operating point.
*
* Priority value defines the operating point for the component. Operating points are defined by
* the vendor. Priority value of 0 means that the client requires operation at the given operating
* rate. Priority values -1 and below define operating points in decreasing performance. In this
* case client expects best effort without exceeding the specific operating point. This allows
* client to run components deeper in the background by using larger priority values. In these
* cases operating rate is a hint for the maximum rate that the client anticipates.
*
* Operating rate and priority are used in tandem. E.g. if there are components that run at a
* higher operating point (priority) it will make more resources available for components at
* a lower operating point, so operating rate can be used to gate those components.
*
* Positive priority values are not defined at the moment and shall be treated equivalent to 0.
*/
typedef C2GlobalParam<C2Tuning, C2Int32Value, kParamIndexRealTimePriority>
C2RealTimePriorityTuning;
constexpr char C2_PARAMKEY_PRIORITY[] = "algo.priority";
/* ------------------------------------- protected content ------------------------------------- */
/**
* Secure mode.
*/
C2ENUM(C2Config::secure_mode_t, uint32_t,
SM_UNPROTECTED, ///< no content protection
SM_READ_PROTECTED, ///< input and output buffers shall be protected from reading
/// both read protected and readable encrypted buffers are used
SM_READ_PROTECTED_WITH_ENCRYPTED,
)
typedef C2GlobalParam<C2Tuning, C2SimpleValueStruct<C2Config::secure_mode_t>, kParamIndexSecureMode>
C2SecureModeTuning;
constexpr char C2_PARAMKEY_SECURE_MODE[] = "algo.secure-mode";
/* ===================================== ENCODER COMPONENTS ===================================== */
/**
* Bitrate
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBitrate> C2StreamBitrateInfo;
constexpr char C2_PARAMKEY_BITRATE[] = "coded.bitrate";
/**
* Bitrate mode.
*
* TODO: refine this with bitrate ranges and suggested window
*/
C2ENUM(C2Config::bitrate_mode_t, uint32_t,
BITRATE_CONST_SKIP_ALLOWED = 0, ///< constant bitrate, frame skipping allowed
BITRATE_CONST = 1, ///< constant bitrate, keep all frames
BITRATE_VARIABLE_SKIP_ALLOWED = 2, ///< bitrate can vary, frame skipping allowed
BITRATE_VARIABLE = 3, ///< bitrate can vary, keep all frames
BITRATE_IGNORE = 7, ///< bitrate can be exceeded at will to achieve
///< quality or other settings
// bitrate modes are composed of the following flags
BITRATE_FLAG_KEEP_ALL_FRAMES = 1,
BITRATE_FLAG_CAN_VARY = 2,
BITRATE_FLAG_CAN_EXCEED = 4,
)
typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::bitrate_mode_t>,
kParamIndexBitrateMode>
C2StreamBitrateModeTuning;
constexpr char C2_PARAMKEY_BITRATE_MODE[] = "algo.bitrate-mode";
/**
* Quality.
*
* This is defined by each component, the higher the better the output quality at the expense of
* less compression efficiency. This setting is defined for the output streams in case the
* component can support varying quality on each stream, or as an output port tuning in case the
* quality is global to all streams.
*/
typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2StreamQualityTuning;
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexQuality> C2QualityTuning;
constexpr char C2_PARAMKEY_QUALITY[] = "algo.quality";
/**
* Complexity.
*
* This is defined by each component, this higher the value, the more resources the component
* will use to produce better quality at the same compression efficiency or better compression
* efficiency at the same quality. This setting is defined for the output streams in case the
* component can support varying complexity on each stream, or as an output port tuning in case the
* quality is global to all streams
*/
typedef C2StreamParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2StreamComplexityTuning;
typedef C2PortParam<C2Tuning, C2Uint32Value, kParamIndexComplexity> C2ComplexityTuning;
constexpr char C2_PARAMKEY_COMPLEXITY[] = "algo.complexity";
/**
* Header (init-data) handling around sync frames.
*/
C2ENUM(C2Config::prepend_header_mode_t, uint32_t,
/**
* don't prepend header. Signal header only through C2StreamInitDataInfo.
*/
PREPEND_HEADER_TO_NONE,
/**
* prepend header before the first output frame and thereafter before the next sync frame
* if it changes.
*/
PREPEND_HEADER_ON_CHANGE,
/**
* prepend header before every sync frame.
*/
PREPEND_HEADER_TO_ALL_SYNC,
)
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::prepend_header_mode_t>,
kParamIndexPrependHeaderMode>
C2PrependHeaderModeSetting;
constexpr char C2_PARAMKEY_PREPEND_HEADER_MODE[] = "output.buffers.prepend-header";
/* =================================== IMAGE/VIDEO COMPONENTS =================================== */
/*
* Order of transformation is:
*
* crop => (scaling => scaled-crop) => sample-aspect-ratio => flip => rotation
*/
/**
* Picture (image- and video frame) size.
*
* This is used for the output of the video decoder, and the input of the video encoder.
*/
typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPictureSize> C2StreamPictureSizeInfo;
constexpr char C2_PARAMKEY_PICTURE_SIZE[] = "raw.size";
/**
* Crop rectangle.
*/
struct C2RectStruct : C2Rect {
C2RectStruct() = default;
C2RectStruct(const C2Rect &rect) : C2Rect(rect) { }
bool operator==(const C2RectStruct &) = delete;
bool operator!=(const C2RectStruct &) = delete;
DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rect)
C2FIELD(width, "width")
C2FIELD(height, "height")
C2FIELD(left, "left")
C2FIELD(top, "top")
};
typedef C2StreamParam<C2Info, C2RectStruct, kParamIndexCropRect> C2StreamCropRectInfo;
constexpr char C2_PARAMKEY_CROP_RECT[] = "raw.crop";
constexpr char C2_PARAMKEY_CODED_CROP_RECT[] = "coded.crop";
/**
* Pixel format.
*/
// TODO: define some
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexPixelFormat> C2StreamPixelFormatInfo;
constexpr char C2_PARAMKEY_PIXEL_FORMAT[] = "raw.pixel-format";
/**
* Extended rotation information also incorporating a flip.
*
* Rotation is counter clock-wise.
*/
struct C2RotationStruct {
C2RotationStruct(int32_t rotation = 0)
: flip(0), value(rotation) { }
int32_t flip; ///< horizontal flip (left-right flip applied prior to rotation)
int32_t value; ///< rotation in degrees counter clockwise
DEFINE_AND_DESCRIBE_BASE_C2STRUCT(Rotation)
C2FIELD(flip, "flip")
C2FIELD(value, "value")
};
typedef C2StreamParam<C2Info, C2RotationStruct, kParamIndexRotation> C2StreamRotationInfo;
constexpr char C2_PARAMKEY_ROTATION[] = "raw.rotation";
constexpr char C2_PARAMKEY_VUI_ROTATION[] = "coded.vui.rotation";
/**
* Pixel (sample) aspect ratio.
*/
typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexPixelAspectRatio>
C2StreamPixelAspectRatioInfo;
constexpr char C2_PARAMKEY_PIXEL_ASPECT_RATIO[] = "raw.sar";
constexpr char C2_PARAMKEY_VUI_PIXEL_ASPECT_RATIO[] = "coded.vui.sar";
/**
* In-line scaling.
*
* Components can optionally support scaling of raw image/video frames. Or scaling only a
* portion of raw image/video frames (scaled-crop).
*/
C2ENUM(C2Config::scaling_method_t, uint32_t,
SCALING_ARBITRARY, ///< arbitrary, unspecified
)
typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2Config::scaling_method_t>,
kParamIndexScalingMethod>
C2StreamScalingMethodTuning;
constexpr char C2_PARAMKEY_SCALING_MODE[] = "raw.scaling-method";
typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexScaledPictureSize>
C2StreamScaledPictureSizeTuning;
constexpr char C2_PARAMKEY_SCALED_PICTURE_SIZE[] = "raw.scaled-size";
typedef C2StreamParam<C2Tuning, C2RectStruct, kParamIndexScaledCropRect>
C2StreamScaledCropRectTuning;
constexpr char C2_PARAMKEY_SCALED_CROP_RECT[] = "raw.scaled-crop";
/* ------------------------------------- color information ------------------------------------- */
/**
* Color Info
*
* Chroma location can vary for top and bottom fields, so use an array, that can have 0 to 2
* values. Empty array is used for non YUV formats.
*/
struct C2Color {
enum matrix_t : uint32_t; ///< matrix coefficient (YUV <=> RGB)
enum plane_layout_t : uint32_t; ///< plane layout for flexible formats
enum primaries_t : uint32_t; ///< color primaries and white point
enum range_t : uint32_t; ///< range of color component values
enum subsampling_t : uint32_t; ///< chroma subsampling
enum transfer_t : uint32_t; ///< transfer function
};
/// Chroma subsampling
C2ENUM(C2Color::subsampling_t, uint32_t,
MONOCHROME, ///< there are no Cr nor Cb planes
MONOCHROME_ALPHA, ///< there are no Cr nor Cb planes, but there is an alpha plane
RGB, ///< RGB
RGBA, ///< RGBA
YUV_420, ///< Cr and Cb planes are subsampled by 2 both horizontally and vertically
YUV_422, ///< Cr and Cb planes are subsampled horizontally
YUV_444, ///< Cr and Cb planes are not subsampled
YUVA_444, ///< Cr and Cb planes are not subsampled, there is an alpha plane
)
struct C2ChromaOffsetStruct {
// chroma offsets defined by ITU
constexpr static C2ChromaOffsetStruct ITU_YUV_444() { return { 0.0f, 0.0f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_422() { return { 0.0f, 0.0f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_0() { return { 0.0f, 0.5f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_1() { return { 0.5f, 0.5f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_2() { return { 0.0f, 0.0f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_3() { return { 0.5f, 0.0f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_4() { return { 0.0f, 1.0f }; }
constexpr static C2ChromaOffsetStruct ITU_YUV_420_5() { return { 0.5f, 1.0f }; }
float x; ///< x offset in pixels (towards right)
float y; ///< y offset in pixels (towards down)
DEFINE_AND_DESCRIBE_C2STRUCT(ChromaOffset)
C2FIELD(x, "x")
C2FIELD(y, "y")
};
struct C2ColorInfoStruct {
C2ColorInfoStruct()
: bitDepth(8), subsampling(C2Color::YUV_420) { }
uint32_t bitDepth;
C2Color::subsampling_t subsampling;
C2ChromaOffsetStruct locations[]; // max 2 elements
C2ColorInfoStruct(
size_t /* flexCount */, uint32_t bitDepth_, C2Color::subsampling_t subsampling_)
: bitDepth(bitDepth_), subsampling(subsampling_) { }
C2ColorInfoStruct(
size_t flexCount, uint32_t bitDepth_, C2Color::subsampling_t subsampling_,
std::initializer_list<C2ChromaOffsetStruct> locations_)
: bitDepth(bitDepth_), subsampling(subsampling_) {
size_t ix = 0;
for (const C2ChromaOffsetStruct &location : locations_) {
if (ix == flexCount) {
break;
}
locations[ix] = location;
++ix;
}
}
DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(ColorInfo, locations)
C2FIELD(bitDepth, "bit-depth")
C2FIELD(subsampling, "subsampling")
C2FIELD(locations, "locations")
};
typedef C2StreamParam<C2Info, C2ColorInfoStruct, kParamIndexColorInfo> C2StreamColorInfo;
constexpr char C2_PARAMKEY_COLOR_INFO[] = "raw.color-format";
constexpr char C2_PARAMKEY_CODED_COLOR_INFO[] = "coded.color-format";
/**
* Color Aspects
*/
/* The meaning of the following enumerators is as described in ITU-T H.273. */
/// Range
C2ENUM(C2Color::range_t, uint32_t,
RANGE_UNSPECIFIED, ///< range is unspecified
RANGE_FULL, ///< full range
RANGE_LIMITED, ///< limited range
RANGE_VENDOR_START = 0x80, ///< vendor-specific range values start here
RANGE_OTHER = 0XFF ///< max value, reserved for undefined values
)
/// Color primaries
C2ENUM(C2Color::primaries_t, uint32_t,
PRIMARIES_UNSPECIFIED, ///< primaries are unspecified
PRIMARIES_BT709, ///< Rec.ITU-R BT.709-6 or equivalent
PRIMARIES_BT470_M, ///< Rec.ITU-R BT.470-6 System M or equivalent
PRIMARIES_BT601_625, ///< Rec.ITU-R BT.601-6 625 or equivalent
PRIMARIES_BT601_525, ///< Rec.ITU-R BT.601-6 525 or equivalent
PRIMARIES_GENERIC_FILM, ///< Generic Film
PRIMARIES_BT2020, ///< Rec.ITU-R BT.2020 or equivalent
PRIMARIES_RP431, ///< SMPTE RP 431-2 or equivalent
PRIMARIES_EG432, ///< SMPTE EG 432-1 or equivalent
PRIMARIES_EBU3213, ///< EBU Tech.3213-E or equivalent
///
PRIMARIES_VENDOR_START = 0x80, ///< vendor-specific primaries values start here
PRIMARIES_OTHER = 0xff ///< max value, reserved for undefined values
)
/// Transfer function
C2ENUM(C2Color::transfer_t, uint32_t,
TRANSFER_UNSPECIFIED, ///< transfer is unspecified
TRANSFER_LINEAR, ///< Linear transfer characteristics
TRANSFER_SRGB, ///< sRGB or equivalent
TRANSFER_170M, ///< SMPTE 170M or equivalent (e.g. BT.601/709/2020)
TRANSFER_GAMMA22, ///< Assumed display gamma 2.2
TRANSFER_GAMMA28, ///< Assumed display gamma 2.8
TRANSFER_ST2084, ///< SMPTE ST 2084 for 10/12/14/16 bit systems
TRANSFER_HLG, ///< ARIB STD-B67 hybrid-log-gamma
TRANSFER_240M = 0x40, ///< SMPTE 240M or equivalent
TRANSFER_XVYCC, ///< IEC 61966-2-4 or equivalent
TRANSFER_BT1361, ///< Rec.ITU-R BT.1361 extended gamut
TRANSFER_ST428, ///< SMPTE ST 428-1 or equivalent
///
TRANSFER_VENDOR_START = 0x80, ///< vendor-specific transfer values start here
TRANSFER_OTHER = 0xff ///< max value, reserved for undefined values
)
/// Matrix coefficient
C2ENUM(C2Color::matrix_t, uint32_t,
MATRIX_UNSPECIFIED, ///< matrix coefficients are unspecified
MATRIX_BT709, ///< Rec.ITU-R BT.709-5 or equivalent
MATRIX_FCC47_73_682, ///< FCC Title 47 CFR 73.682 or equivalent (KR=0.30, KB=0.11)
MATRIX_BT601, ///< Rec.ITU-R BT.470, BT.601-6 625 or equivalent
MATRIX_240M, ///< SMPTE 240M or equivalent
MATRIX_BT2020, ///< Rec.ITU-R BT.2020 non-constant luminance
MATRIX_BT2020_CONSTANT, ///< Rec.ITU-R BT.2020 constant luminance
MATRIX_VENDOR_START = 0x80, ///< vendor-specific matrix coefficient values start here
MATRIX_OTHER = 0xff, ///< max value, reserved for undefined values
)
struct C2ColorAspectsStruct {
C2Color::range_t range;
C2Color::primaries_t primaries;
C2Color::transfer_t transfer;
C2Color::matrix_t matrix;
C2ColorAspectsStruct()
: range(C2Color::RANGE_UNSPECIFIED),
primaries(C2Color::PRIMARIES_UNSPECIFIED),
transfer(C2Color::TRANSFER_UNSPECIFIED),
matrix(C2Color::MATRIX_UNSPECIFIED) { }
C2ColorAspectsStruct(C2Color::range_t range_, C2Color::primaries_t primaries_,
C2Color::transfer_t transfer_, C2Color::matrix_t matrix_)
: range(range_), primaries(primaries_), transfer(transfer_), matrix(matrix_) {}
DEFINE_AND_DESCRIBE_C2STRUCT(ColorAspects)
C2FIELD(range, "range")
C2FIELD(primaries, "primaries")
C2FIELD(transfer, "transfer")
C2FIELD(matrix, "matrix")
};
typedef C2StreamParam<C2Info, C2ColorAspectsStruct, kParamIndexColorAspects>
C2StreamColorAspectsInfo;
constexpr char C2_PARAMKEY_COLOR_ASPECTS[] = "raw.color";
constexpr char C2_PARAMKEY_VUI_COLOR_ASPECTS[] = "coded.vui.color";
/**
* Default color aspects to use. These come from the container or client and shall be handled
* according to the coding standard.
*/
typedef C2StreamParam<C2Tuning, C2ColorAspectsStruct, kParamIndexDefaultColorAspects>
C2StreamColorAspectsTuning;
constexpr char C2_PARAMKEY_DEFAULT_COLOR_ASPECTS[] = "default.color";
/**
* HDR Static Metadata Info.
*/
struct C2ColorXyStruct {
float x; ///< x color coordinate in xyY space [0-1]
float y; ///< y color coordinate in xyY space [0-1]
DEFINE_AND_DESCRIBE_C2STRUCT(ColorXy)
C2FIELD(x, "x")
C2FIELD(y, "y")
};
struct C2MasteringDisplayColorVolumeStruct {
C2ColorXyStruct red; ///< coordinates of red display primary
C2ColorXyStruct green; ///< coordinates of green display primary
C2ColorXyStruct blue; ///< coordinates of blue display primary
C2ColorXyStruct white; ///< coordinates of white point
float maxLuminance; ///< max display mastering luminance in cd/m^2
float minLuminance; ///< min display mastering luminance in cd/m^2
DEFINE_AND_DESCRIBE_C2STRUCT(MasteringDisplayColorVolume)
C2FIELD(red, "red")
C2FIELD(green, "green")
C2FIELD(blue, "blue")
C2FIELD(white, "white")
C2FIELD(maxLuminance, "max-luminance")
C2FIELD(minLuminance, "min-luminance")
};
struct C2HdrStaticMetadataStruct {
C2MasteringDisplayColorVolumeStruct mastering;
// content descriptors
float maxCll; ///< max content light level (pixel luminance) in cd/m^2
float maxFall; ///< max frame average light level (frame luminance) in cd/m^2
DEFINE_AND_DESCRIBE_BASE_C2STRUCT(HdrStaticMetadata)
C2FIELD(mastering, "mastering")
C2FIELD(maxCll, "max-cll")
C2FIELD(maxFall, "max-fall")
};
typedef C2StreamParam<C2Info, C2HdrStaticMetadataStruct, kParamIndexHdrStaticMetadata>
C2StreamHdrStaticInfo;
constexpr char C2_PARAMKEY_HDR_STATIC_INFO[] = "raw.hdr-static-info";
/**
* HDR10+ Metadata Info.
*/
typedef C2StreamParam<C2Info, C2BlobValue, kParamIndexHdr10PlusMetadata>
C2StreamHdr10PlusInfo;
constexpr char C2_PARAMKEY_INPUT_HDR10_PLUS_INFO[] = "input.hdr10-plus-info";
constexpr char C2_PARAMKEY_OUTPUT_HDR10_PLUS_INFO[] = "output.hdr10-plus-info";
/* ------------------------------------ block-based coding ----------------------------------- */
/**
* Block-size, block count and block rate. Used to determine or communicate profile-level
* requirements.
*/
typedef C2StreamParam<C2Info, C2PictureSizeStruct, kParamIndexBlockSize> C2StreamBlockSizeInfo;
constexpr char C2_PARAMKEY_BLOCK_SIZE[] = "coded.block-size";
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexBlockCount> C2StreamBlockCountInfo;
constexpr char C2_PARAMKEY_BLOCK_COUNT[] = "coded.block-count";
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexBlockRate> C2StreamBlockRateInfo;
constexpr char C2_PARAMKEY_BLOCK_RATE[] = "coded.block-rate";
/* ====================================== VIDEO COMPONENTS ====================================== */
/**
* Frame rate (coded and port for raw data)
*
* Coded frame rates are what is represented in the compressed bitstream and should correspond to
* the timestamp.
*
* Frame rates on raw ports should still correspond to the timestamps.
*
* For slow motion or timelapse recording, the timestamp shall be adjusted prior to feeding an
* encoder, and the time stretch parameter should be used to signal the relationship between
* timestamp and real-world time.
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2StreamFrameRateInfo;
constexpr char C2_PARAMKEY_FRAME_RATE[] = "coded.frame-rate";
typedef C2PortParam<C2Info, C2FloatValue, kParamIndexFrameRate> C2PortFrameRateInfo;
constexpr char C2_PARAMKEY_INPUT_FRAME_RATE[] = "input.frame-rate";
constexpr char C2_PARAMKEY_OUTPUT_FRAME_RATE[] = "output.frame-rate";
/**
* Time stretch. Ratio between real-world time and timestamp. E.g. time stretch of 4.0 means that
* timestamp grows 1/4 the speed of real-world time (e.g. 4x slo-mo input). This can be used to
* optimize encoding.
*/
typedef C2PortParam<C2Info, C2FloatValue, kParamIndexTimeStretch> C2PortTimeStretchInfo;
constexpr char C2_PARAMKEY_INPUT_TIME_STRETCH[] = "input.time-stretch";
constexpr char C2_PARAMKEY_OUTPUT_TIME_STRETCH[] = "output.time-stretch";
/**
* Max video frame size.
*/
typedef C2StreamParam<C2Tuning, C2PictureSizeStruct, kParamIndexMaxPictureSize>
C2StreamMaxPictureSizeTuning;
typedef C2StreamMaxPictureSizeTuning C2MaxVideoSizeHintPortSetting;
constexpr char C2_PARAMKEY_MAX_PICTURE_SIZE[] = "raw.max-size";
/**
* Picture type mask.
*/
C2ENUM(C2Config::picture_type_t, uint32_t,
SYNC_FRAME = (1 << 0), ///< sync frame, e.g. IDR
I_FRAME = (1 << 1), ///< intra frame that is completely encoded
P_FRAME = (1 << 2), ///< inter predicted frame from previous frames
B_FRAME = (1 << 3), ///< backward predicted (out-of-order) frame
)
/**
* Allowed picture types.
*/
typedef C2StreamParam<C2Tuning, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
kParamIndexPictureTypeMask>
C2StreamPictureTypeMaskTuning;
constexpr char C2_PARAMKEY_PICTURE_TYPE_MASK[] = "coding.picture-type-mask";
/**
* Resulting picture type
*/
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::picture_type_t>>,
kParamIndexPictureType>
C2StreamPictureTypeInfo;
typedef C2StreamPictureTypeInfo C2StreamPictureTypeMaskInfo;
constexpr char C2_PARAMKEY_PICTURE_TYPE[] = "coded.picture-type";
/**
* GOP specification.
*
* GOP is specified in layers between sync frames, by specifying the number of specific type of
* frames between the previous type (starting with sync frames for the first layer):
*
* E.g.
* - 4 I frames between each sync frame
* - 2 P frames between each I frame
* - 1 B frame between each P frame
*
* [ { I, 4 }, { P, 2 }, { B, 1 } ] ==> (Sync)BPBPB IBPBPB IBPBPB IBPBPB IBPBPB (Sync)BPBPB
*
* For infinite GOP, I layer can be omitted (as the first frame is always a sync frame.):
*
* [ { P, MAX_UINT } ] ==> (Sync)PPPPPPPPPPPPPPPPPP...
*
* Sync frames can also be requested on demand, and as a time-based interval. For time-based
* interval, if there hasn't been a sync frame in at least the given time, the next I frame shall
* be encoded as a sync frame. For sync request, the next I frame shall be encoded as a sync frame.
*
* Temporal layering will determine GOP structure other than the I frame count between sync
* frames.
*/
struct C2GopLayerStruct {
C2GopLayerStruct() : type_((C2Config::picture_type_t)0), count(0) {}
C2GopLayerStruct(C2Config::picture_type_t type, uint32_t count_)
: type_(type), count(count_) { }
C2Config::picture_type_t type_;
uint32_t count;
DEFINE_AND_DESCRIBE_C2STRUCT(GopLayer)
C2FIELD(type_, "type")
C2FIELD(count, "count")
};
typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2GopLayerStruct>, kParamIndexGop>
C2StreamGopTuning;
constexpr char C2_PARAMKEY_GOP[] = "coding.gop";
/**
* Quantization
* min/max for each picture type
*
*/
struct C2PictureQuantizationStruct {
C2PictureQuantizationStruct() : type_((C2Config::picture_type_t)0),
min(INT32_MIN), max(INT32_MAX) {}
C2PictureQuantizationStruct(C2Config::picture_type_t type, int32_t min_, int32_t max_)
: type_(type), min(min_), max(max_) { }
C2Config::picture_type_t type_;
int32_t min; // INT32_MIN == 'no lower bound specified'
int32_t max; // INT32_MAX == 'no upper bound specified'
DEFINE_AND_DESCRIBE_C2STRUCT(PictureQuantization)
C2FIELD(type_, "type")
C2FIELD(min, "min")
C2FIELD(max, "max")
};
typedef C2StreamParam<C2Tuning, C2SimpleArrayStruct<C2PictureQuantizationStruct>,
kParamIndexPictureQuantization> C2StreamPictureQuantizationTuning;
constexpr char C2_PARAMKEY_PICTURE_QUANTIZATION[] = "coding.qp";
/**
* Sync frame can be requested on demand by the client.
*
* If true, the next I frame shall be encoded as a sync frame. This config can be passed
* synchronously with the work, or directly to the component - leading to different result.
* If it is passed with work, it shall take effect when that work item is being processed (so
* the first I frame at or after that work item shall be a sync frame).
*/
typedef C2StreamParam<C2Tuning, C2EasyBoolValue, kParamIndexRequestSyncFrame>
C2StreamRequestSyncFrameTuning;
constexpr char C2_PARAMKEY_REQUEST_SYNC_FRAME[] = "coding.request-sync-frame";
/**
* Sync frame interval in time domain (timestamp).
*
* If there hasn't been a sync frame in at least this value, the next intra frame shall be encoded
* as a sync frame. The value of MAX_I64 or a negative value means no sync frames after the first
* frame. A value of 0 means all sync frames.
*/
typedef C2StreamParam<C2Tuning, C2Int64Value, kParamIndexSyncFrameInterval>
C2StreamSyncFrameIntervalTuning;
constexpr char C2_PARAMKEY_SYNC_FRAME_INTERVAL[] = "coding.sync-frame-interval";
/**
* Temporal layering
*
* Layer index is a value between 0 and layer count - 1. Layers with higher index have higher
* frequency:
* 0
* 1 1
* 2 2 2 2
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerIndex> C2StreamLayerIndexInfo;
constexpr char C2_PARAMKEY_LAYER_INDEX[] = "coded.layer-index";
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexLayerCount> C2StreamLayerCountInfo;
constexpr char C2_PARAMKEY_LAYER_COUNT[] = "coded.layer-count";
struct C2TemporalLayeringStruct {
C2TemporalLayeringStruct()
: layerCount(0), bLayerCount(0) { }
C2TemporalLayeringStruct(size_t /* flexCount */, uint32_t layerCount_, uint32_t bLayerCount_)
: layerCount(layerCount_), bLayerCount(c2_min(layerCount_, bLayerCount_)) { }
C2TemporalLayeringStruct(size_t flexCount, uint32_t layerCount_, uint32_t bLayerCount_,
std::initializer_list<float> ratios)
: layerCount(layerCount_), bLayerCount(c2_min(layerCount_, bLayerCount_)) {
size_t ix = 0;
for (float ratio : ratios) {
if (ix == flexCount) {
break;
}
bitrateRatios[ix++] = ratio;
}
}
uint32_t layerCount; ///< total number of layers (0 means no temporal layering)
uint32_t bLayerCount; ///< total number of bidirectional layers (<= num layers)
/**
* Bitrate budgets for each layer and the layers below, given as a ratio of the total
* stream bitrate. This can be omitted or partially specififed by the client while configuring,
* in which case the component shall fill in appropriate values for the missing layers.
* This must be provided by the component when queried for at least layer count - 1 (as the
* last layer's budget is always 1.0).
*/
float bitrateRatios[]; ///< 1.0-based
DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TemporalLayering, bitrateRatios)
C2FIELD(layerCount, "layer-count")
C2FIELD(bLayerCount, "b-layer-count")
C2FIELD(bitrateRatios, "bitrate-ratios")
};
typedef C2StreamParam<C2Tuning, C2TemporalLayeringStruct, kParamIndexTemporalLayering>
C2StreamTemporalLayeringTuning;
constexpr char C2_PARAMKEY_TEMPORAL_LAYERING[] = "coding.temporal-layering";
/**
* Intra-refresh.
*/
C2ENUM(C2Config::intra_refresh_mode_t, uint32_t,
INTRA_REFRESH_DISABLED, ///< no intra refresh
INTRA_REFRESH_ARBITRARY, ///< arbitrary, unspecified
)
struct C2IntraRefreshStruct {
C2IntraRefreshStruct()
: mode(C2Config::INTRA_REFRESH_DISABLED), period(0.) { }
C2IntraRefreshStruct(C2Config::intra_refresh_mode_t mode_, float period_)
: mode(mode_), period(period_) { }
C2Config::intra_refresh_mode_t mode; ///< refresh mode
float period; ///< intra refresh period in frames (must be >= 1), 0 means disabled
DEFINE_AND_DESCRIBE_C2STRUCT(IntraRefresh)
C2FIELD(mode, "mode")
C2FIELD(period, "period")
};
typedef C2StreamParam<C2Tuning, C2IntraRefreshStruct, kParamIndexIntraRefresh>
C2StreamIntraRefreshTuning;
constexpr char C2_PARAMKEY_INTRA_REFRESH[] = "coding.intra-refresh";
/* ====================================== IMAGE COMPONENTS ====================================== */
/**
* Tile layout.
*
* This described how the image is decomposed into tiles.
*/
C2ENUM(C2Config::scan_order_t, uint32_t,
SCAN_LEFT_TO_RIGHT_THEN_DOWN
)
struct C2TileLayoutStruct {
C2PictureSizeStruct tile; ///< tile size
uint32_t columnCount; ///< number of tiles horizontally
uint32_t rowCount; ///< number of tiles vertically
C2Config::scan_order_t order; ///< tile order
DEFINE_AND_DESCRIBE_C2STRUCT(TileLayout)
C2FIELD(tile, "tile")
C2FIELD(columnCount, "columns")
C2FIELD(rowCount, "rows")
C2FIELD(order, "order")
};
typedef C2StreamParam<C2Info, C2TileLayoutStruct, kParamIndexTileLayout> C2StreamTileLayoutInfo;
constexpr char C2_PARAMKEY_TILE_LAYOUT[] = "coded.tile-layout";
/**
* Tile handling.
*
* Whether to concatenate tiles or output them each.
*/
C2ENUM(C2Config::tiling_mode_t, uint32_t,
TILING_SEPARATE, ///< output each tile in a separate onWorkDone
TILING_CONCATENATE ///< output one work completion per frame (concatenate tiles)
)
typedef C2StreamParam<C2Tuning, C2TileLayoutStruct, kParamIndexTileHandling>
C2StreamTileHandlingTuning;
constexpr char C2_PARAMKEY_TILE_HANDLING[] = "coding.tile-handling";
/* ====================================== AUDIO COMPONENTS ====================================== */
/**
* Sample rate
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSampleRate> C2StreamSampleRateInfo;
constexpr char C2_PARAMKEY_SAMPLE_RATE[] = "raw.sample-rate";
constexpr char C2_PARAMKEY_CODED_SAMPLE_RATE[] = "coded.sample-rate";
/**
* Channel count.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexChannelCount> C2StreamChannelCountInfo;
constexpr char C2_PARAMKEY_CHANNEL_COUNT[] = "raw.channel-count";
constexpr char C2_PARAMKEY_CODED_CHANNEL_COUNT[] = "coded.channel-count";
/**
* Max channel count. Used to limit the number of coded or decoded channels.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexMaxChannelCount> C2StreamMaxChannelCountInfo;
constexpr char C2_PARAMKEY_MAX_CHANNEL_COUNT[] = "raw.max-channel-count";
constexpr char C2_PARAMKEY_MAX_CODED_CHANNEL_COUNT[] = "coded.max-channel-count";
/**
* Audio sample format (PCM encoding)
*/
C2ENUM(C2Config::pcm_encoding_t, uint32_t,
PCM_16,
PCM_8,
PCM_FLOAT,
PCM_24,
PCM_32
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::pcm_encoding_t>, kParamIndexPcmEncoding>
C2StreamPcmEncodingInfo;
constexpr char C2_PARAMKEY_PCM_ENCODING[] = "raw.pcm-encoding";
constexpr char C2_PARAMKEY_CODED_PCM_ENCODING[] = "coded.pcm-encoding";
/**
* AAC SBR Mode. Used during encoding.
*/
C2ENUM(C2Config::aac_sbr_mode_t, uint32_t,
AAC_SBR_OFF,
AAC_SBR_SINGLE_RATE,
AAC_SBR_DUAL_RATE,
AAC_SBR_AUTO ///< let the codec decide
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::aac_sbr_mode_t>, kParamIndexAacSbrMode>
C2StreamAacSbrModeTuning;
constexpr char C2_PARAMKEY_AAC_SBR_MODE[] = "coding.aac-sbr-mode";
/**
* DRC Compression. Used during decoding.
*/
C2ENUM(C2Config::drc_compression_mode_t, int32_t,
DRC_COMPRESSION_ODM_DEFAULT, ///< odm's default
DRC_COMPRESSION_NONE,
DRC_COMPRESSION_LIGHT,
DRC_COMPRESSION_HEAVY ///<
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::drc_compression_mode_t>,
kParamIndexDrcCompression>
C2StreamDrcCompressionModeTuning;
constexpr char C2_PARAMKEY_DRC_COMPRESSION_MODE[] = "coding.drc.compression-mode";
/**
* DRC target reference level in dBFS. Used during decoding.
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcTargetReferenceLevel>
C2StreamDrcTargetReferenceLevelTuning;
constexpr char C2_PARAMKEY_DRC_TARGET_REFERENCE_LEVEL[] = "coding.drc.reference-level";
/**
* DRC target reference level in dBFS. Used during decoding.
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcEncodedTargetLevel>
C2StreamDrcEncodedTargetLevelTuning;
constexpr char C2_PARAMKEY_DRC_ENCODED_TARGET_LEVEL[] = "coding.drc.encoded-level";
/**
* DRC target reference level in dBFS. Used during decoding.
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcBoostFactor>
C2StreamDrcBoostFactorTuning;
constexpr char C2_PARAMKEY_DRC_BOOST_FACTOR[] = "coding.drc.boost-factor";
/**
* DRC target reference level in dBFS. Used during decoding.
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcAttenuationFactor>
C2StreamDrcAttenuationFactorTuning;
constexpr char C2_PARAMKEY_DRC_ATTENUATION_FACTOR[] = "coding.drc.attenuation-factor";
/**
* DRC Effect Type (see ISO 23003-4) Uniform Dynamic Range Control. Used during decoding.
*/
C2ENUM(C2Config::drc_effect_type_t, int32_t,
DRC_EFFECT_ODM_DEFAULT = -2, ///< odm's default
DRC_EFFECT_OFF = -1, ///< no DRC
DRC_EFFECT_NONE = 0, ///< no DRC except to prevent clipping
DRC_EFFECT_LATE_NIGHT,
DRC_EFFECT_NOISY_ENVIRONMENT,
DRC_EFFECT_LIMITED_PLAYBACK_RANGE,
DRC_EFFECT_LOW_PLAYBACK_LEVEL,
DRC_EFFECT_DIALOG_ENHANCEMENT,
DRC_EFFECT_GENERAL_COMPRESSION
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::drc_effect_type_t>,
kParamIndexDrcEffectType>
C2StreamDrcEffectTypeTuning;
constexpr char C2_PARAMKEY_DRC_EFFECT_TYPE[] = "coding.drc.effect-type";
/**
* DRC album mode. Used during decoding.
*/
C2ENUM(C2Config::drc_album_mode_t, int32_t,
DRC_ALBUM_MODE_OFF = 0,
DRC_ALBUM_MODE_ON = 1
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2Config::drc_album_mode_t>, kParamIndexDrcAlbumMode>
C2StreamDrcAlbumModeTuning;
constexpr char C2_PARAMKEY_DRC_ALBUM_MODE[] = "coding.drc.album-mode";
/**
* DRC output loudness in dBFS. Retrieved during decoding
*/
typedef C2StreamParam<C2Info, C2FloatValue, kParamIndexDrcOutputLoudness>
C2StreamDrcOutputLoudnessTuning;
constexpr char C2_PARAMKEY_DRC_OUTPUT_LOUDNESS[] = "output.drc.output-loudness";
/**
* Audio frame size in samples.
*
* Audio encoders can expose this parameter to signal the desired audio frame
* size that corresponds to a single coded access unit.
* Default value is 0, meaning that the encoder accepts input buffers of any size.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexAudioFrameSize>
C2StreamAudioFrameSizeInfo;
constexpr char C2_PARAMKEY_AUDIO_FRAME_SIZE[] = "raw.audio-frame-size";
/* --------------------------------------- AAC components --------------------------------------- */
/**
* AAC stream format
*/
C2ENUM(C2Config::aac_packaging_t, uint32_t,
AAC_PACKAGING_RAW,
AAC_PACKAGING_ADTS
)
typedef C2StreamParam<C2Info, C2SimpleValueStruct<C2EasyEnum<C2Config::aac_packaging_t>>,
kParamIndexAacPackaging> C2StreamAacPackagingInfo;
typedef C2StreamAacPackagingInfo C2StreamAacFormatInfo;
constexpr char C2_PARAMKEY_AAC_PACKAGING[] = "coded.aac-packaging";
/* ================================ PLATFORM-DEFINED PARAMETERS ================================ */
/**
* Platform level and features.
*/
enum C2Config::platform_level_t : uint32_t {
PLATFORM_P, ///< support for Android 9.0 feature set
};
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_level_t>,
kParamIndexPlatformLevel>
C2PlatformLevelSetting;
constexpr char C2_PARAMKEY_PLATFORM_LEVEL[] = "api.platform-level";
enum C2Config::platform_feature_t : uint64_t {
// no platform-specific features have been defined
};
// read-only
typedef C2GlobalParam<C2Setting, C2SimpleValueStruct<C2Config::platform_feature_t>,
kParamIndexPlatformFeatures>
C2PlatformFeaturesSetting;
constexpr char C2_PARAMKEY_PLATFORM_FEATURES[] = "api.platform-features";
/**
* This structure describes the preferred ion allocation parameters for a given memory usage.
*/
struct C2StoreIonUsageStruct {
inline C2StoreIonUsageStruct() {
memset(this, 0, sizeof(*this));
}
inline C2StoreIonUsageStruct(uint64_t usage_, uint32_t capacity_)
: usage(usage_), capacity(capacity_), heapMask(0), allocFlags(0), minAlignment(0) { }
uint64_t usage; ///< C2MemoryUsage
uint32_t capacity; ///< capacity
int32_t heapMask; ///< ion heapMask
int32_t allocFlags; ///< ion allocation flags
uint32_t minAlignment; ///< minimum alignment
DEFINE_AND_DESCRIBE_C2STRUCT(StoreIonUsage)
C2FIELD(usage, "usage")
C2FIELD(capacity, "capacity")
C2FIELD(heapMask, "heap-mask")
C2FIELD(allocFlags, "alloc-flags")
C2FIELD(minAlignment, "min-alignment")
};
// store, private
typedef C2GlobalParam<C2Info, C2StoreIonUsageStruct, kParamIndexStoreIonUsage>
C2StoreIonUsageInfo;
/**
* This structure describes the preferred DMA-Buf allocation parameters for a given memory usage.
*/
struct C2StoreDmaBufUsageStruct {
inline C2StoreDmaBufUsageStruct() { memset(this, 0, sizeof(*this)); }
inline C2StoreDmaBufUsageStruct(size_t flexCount, uint64_t usage_, uint32_t capacity_)
: usage(usage_), capacity(capacity_), allocFlags(0) {
memset(heapName, 0, flexCount);
}
uint64_t usage; ///< C2MemoryUsage
uint32_t capacity; ///< capacity
int32_t allocFlags; ///< ion allocation flags
char heapName[]; ///< dmabuf heap name
DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(StoreDmaBufUsage, heapName)
C2FIELD(usage, "usage")
C2FIELD(capacity, "capacity")
C2FIELD(allocFlags, "alloc-flags")
C2FIELD(heapName, "heap-name")
};
// store, private
typedef C2GlobalParam<C2Info, C2StoreDmaBufUsageStruct, kParamIndexStoreDmaBufUsage>
C2StoreDmaBufUsageInfo;
/**
* Flexible pixel format descriptors
*/
struct C2FlexiblePixelFormatDescriptorStruct {
uint32_t pixelFormat;
uint32_t bitDepth;
C2Color::subsampling_t subsampling;
C2Color::plane_layout_t layout;
DEFINE_AND_DESCRIBE_C2STRUCT(FlexiblePixelFormatDescriptor)
C2FIELD(pixelFormat, "pixel-format")
C2FIELD(bitDepth, "bit-depth")
C2FIELD(subsampling, "subsampling")
C2FIELD(layout, "layout")
};
/**
* Plane layout of flexible pixel formats.
*
* bpp: bytes per color component, e.g. 1 for 8-bit formats, and 2 for 10-16-bit formats.
*/
C2ENUM(C2Color::plane_layout_t, uint32_t,
/** Unknown layout */
UNKNOWN_LAYOUT,
/** Planar layout with rows of each plane packed (colInc = bpp) */
PLANAR_PACKED,
/** Semiplanar layout with rows of each plane packed (colInc_Y/A = bpp (planar),
* colInc_Cb/Cr = 2*bpp (interleaved). Used only for YUV(A) formats. */
SEMIPLANAR_PACKED,
/** Interleaved packed. colInc = N*bpp (N are the number of color components) */
INTERLEAVED_PACKED,
/** Interleaved aligned. colInc = smallest power of 2 >= N*bpp (N are the number of color
* components) */
INTERLEAVED_ALIGNED
)
typedef C2GlobalParam<C2Info, C2SimpleArrayStruct<C2FlexiblePixelFormatDescriptorStruct>,
kParamIndexFlexiblePixelFormatDescriptors>
C2StoreFlexiblePixelFormatDescriptorsInfo;
/**
* This structure describes the android dataspace for a raw video/image frame.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexDataSpace> C2StreamDataSpaceInfo;
constexpr char C2_PARAMKEY_DATA_SPACE[] = "raw.data-space";
/**
* This structure describes the android surface scaling mode for a raw video/image frame.
*/
typedef C2StreamParam<C2Info, C2Uint32Value, kParamIndexSurfaceScaling> C2StreamSurfaceScalingInfo;
constexpr char C2_PARAMKEY_SURFACE_SCALING_MODE[] = "raw.surface-scaling";
/* ======================================= INPUT SURFACE ======================================= */
/**
* Input surface EOS
*/
typedef C2GlobalParam<C2Tuning, C2EasyBoolValue, kParamIndexInputSurfaceEos>
C2InputSurfaceEosTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_EOS[] = "input-surface.eos";
/**
* Start/suspend/resume/stop controls and timestamps for input surface.
*
* TODO: make these counters
*/
struct C2TimedControlStruct {
c2_bool_t enabled; ///< control is enabled
int64_t timestamp; ///< if enabled, time the control should take effect
C2TimedControlStruct()
: enabled(C2_FALSE), timestamp(0) { }
/* implicit */ C2TimedControlStruct(uint64_t timestamp_)
: enabled(C2_TRUE), timestamp(timestamp_) { }
DEFINE_AND_DESCRIBE_C2STRUCT(TimedControl)
C2FIELD(enabled, "enabled")
C2FIELD(timestamp, "timestamp")
};
typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexStartAt>
C2PortStartTimestampTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_START_AT[] = "input-surface.start";
typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexSuspendAt>
C2PortSuspendTimestampTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_SUSPEND_AT[] = "input-surface.suspend";
typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexResumeAt>
C2PortResumeTimestampTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_RESUME_AT[] = "input-surface.resume";
typedef C2PortParam<C2Tuning, C2TimedControlStruct, kParamIndexStopAt>
C2PortStopTimestampTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_STOP_AT[] = "input-surface.stop";
/**
* Time offset for input surface. Input timestamp to codec is surface buffer timestamp plus this
* time offset.
*/
typedef C2GlobalParam<C2Tuning, C2Int64Value, kParamIndexTimeOffset> C2ComponentTimeOffsetTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_TIME_OFFSET[] = "input-surface.time-offset";
/**
* Minimum fps for input surface.
*
* Repeat frame to meet this.
*/
typedef C2PortParam<C2Tuning, C2FloatValue, kParamIndexMinFrameRate> C2PortMinFrameRateTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_MIN_FRAME_RATE[] = "input-surface.min-frame-rate";
/**
* Timestamp adjustment (override) for input surface buffers. These control the input timestamp
* fed to the codec, but do not impact the output timestamp.
*/
struct C2TimestampGapAdjustmentStruct {
/// control modes
enum mode_t : uint32_t;
inline C2TimestampGapAdjustmentStruct();
inline C2TimestampGapAdjustmentStruct(mode_t mode_, uint64_t value_)
: mode(mode_), value(value_) { }
mode_t mode; ///< control mode
uint64_t value; ///< control value for gap between two timestamp
DEFINE_AND_DESCRIBE_C2STRUCT(TimestampGapAdjustment)
C2FIELD(mode, "mode")
C2FIELD(value, "value")
};
C2ENUM(C2TimestampGapAdjustmentStruct::mode_t, uint32_t,
NONE,
MIN_GAP,
FIXED_GAP,
);
inline C2TimestampGapAdjustmentStruct::C2TimestampGapAdjustmentStruct()
: mode(C2TimestampGapAdjustmentStruct::NONE), value(0) { }
typedef C2PortParam<C2Tuning, C2TimestampGapAdjustmentStruct> C2PortTimestampGapTuning;
constexpr char C2_PARAMKEY_INPUT_SURFACE_TIMESTAMP_ADJUSTMENT[] = "input-surface.timestamp-adjustment";
/* ===================================== TUNNELED CODEC ==================================== */
/**
* Tunneled codec control.
*/
struct C2TunneledModeStruct {
/// mode
enum mode_t : uint32_t;
/// sync type
enum sync_type_t : uint32_t;
inline C2TunneledModeStruct() = default;
inline C2TunneledModeStruct(
size_t flexCount, mode_t mode_, sync_type_t type, std::vector<int32_t> id)
: mode(mode_), syncType(type) {
memcpy(&syncId, &id[0], c2_min(id.size(), flexCount) * FLEX_SIZE);
}
inline C2TunneledModeStruct(size_t flexCount, mode_t mode_, sync_type_t type, int32_t id)
: mode(mode_), syncType(type) {
if (flexCount >= 1) {
syncId[0] = id;
}
}
mode_t mode; ///< tunneled mode
sync_type_t syncType; ///< type of sync used for tunneled mode
int32_t syncId[]; ///< sync id
DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TunneledMode, syncId)
C2FIELD(mode, "mode")
C2FIELD(syncType, "sync-type")
C2FIELD(syncId, "sync-id")
};
C2ENUM(C2TunneledModeStruct::mode_t, uint32_t,
NONE,
SIDEBAND,
);
C2ENUM(C2TunneledModeStruct::sync_type_t, uint32_t,
REALTIME,
AUDIO_HW_SYNC,
HW_AV_SYNC,
);
/**
* Configure tunneled mode
*/
typedef C2PortParam<C2Tuning, C2TunneledModeStruct, kParamIndexTunneledMode>
C2PortTunneledModeTuning;
constexpr char C2_PARAMKEY_TUNNELED_RENDER[] = "output.tunneled-render";
/**
* Tunneled mode handle. The meaning of this is depends on the
* tunneled mode. If the tunneled mode is SIDEBAND, this is the
* sideband handle.
*/
typedef C2PortParam<C2Tuning, C2Int32Array, kParamIndexTunnelHandle> C2PortTunnelHandleTuning;
constexpr char C2_PARAMKEY_OUTPUT_TUNNEL_HANDLE[] = "output.tunnel-handle";
/**
* The system time using CLOCK_MONOTONIC in nanoseconds at the tunnel endpoint.
* For decoders this is the render time for the output frame and
* this corresponds to the media timestamp of the output frame.
*/
typedef C2PortParam<C2Info, C2SimpleValueStruct<int64_t>, kParamIndexTunnelSystemTime>
C2PortTunnelSystemTime;
constexpr char C2_PARAMKEY_OUTPUT_RENDER_TIME[] = "output.render-time";
/**
* Tunneled mode video peek signaling flag.
*
* When a video frame is pushed to the decoder with this parameter set to true,
* the decoder must decode the frame, signal partial completion, and hold on the
* frame until C2StreamTunnelStartRender is set to true (which resets this
* flag). Flush will also result in the frames being returned back to the
* client (but not rendered).
*/
typedef C2StreamParam<C2Info, C2EasyBoolValue, kParamIndexTunnelHoldRender>
C2StreamTunnelHoldRender;
constexpr char C2_PARAMKEY_TUNNEL_HOLD_RENDER[] = "output.tunnel-hold-render";
/**
* Tunneled mode video peek signaling flag.
*
* Upon receiving this flag, the decoder shall set C2StreamTunnelHoldRender to
* false, which shall cause any frames held for rendering to be immediately
* displayed, regardless of their timestamps.
*/
typedef C2StreamParam<C2Info, C2EasyBoolValue, kParamIndexTunnelStartRender>
C2StreamTunnelStartRender;
constexpr char C2_PARAMKEY_TUNNEL_START_RENDER[] = "output.tunnel-start-render";
/**
* Encoding quality level signaling.
*
* Signal the 'minimum encoding quality' introduced in Android 12/S. It indicates
* whether the underlying codec is expected to take extra steps to ensure quality meets the
* appropriate minimum. A value of NONE indicates that the codec is not to apply
* any minimum quality bar requirements. Other values indicate that the codec is to apply
* a minimum quality bar, with the exact quality bar being decided by the parameter value.
*/
typedef C2GlobalParam<C2Setting,
C2SimpleValueStruct<C2EasyEnum<C2PlatformConfig::encoding_quality_level_t>>,
kParamIndexEncodingQualityLevel> C2EncodingQualityLevel;
constexpr char C2_PARAMKEY_ENCODING_QUALITY_LEVEL[] = "algo.encoding-quality-level";
C2ENUM(C2PlatformConfig::encoding_quality_level_t, uint32_t,
NONE = 0,
S_HANDHELD = 1 // corresponds to VMAF=70
);
/// @}
#endif // C2CONFIG_H_