为了帮助了解新的相机配置文件 V2 架构,我们从简单的配置文件声明开始,并对其进行剖析,以了解各个部分。
我们采用支持新的高帧速率配置文件的假设相机。 我们首先为设备定义一些假设的硬件约束。
预览引脚为 pin 0。 在相机驱动程序定义的KSFILTER_DESCRIPTOR中,定义KSPIN_DESCRIPTOR_EX数组时,第一个KSPIN_DESCRIPTOR_EX是预览引脚的描述符。 同样,引脚 1 是捕获引脚,引脚 2 是照片图钉。
由于硬件限制,该设备无法处理帧速率为60 fps或更高帧率的缩放。 因此,预览和捕获流必须具有相同的分辨率。
同样地,设备也无法处理 60 帧每秒或更高帧率的颜色空间转换,因此子类型在预览和捕获之间必须相同。
相机能够以 60 fps 的速度流式传输 4K 16x9 视频。 相机还能够3840x2880@60fps(4:3 视频为 60 fps)。
相机在以 60 fps 的速度运行时无法提供任何照片作。
除了高帧速率配置文件,我们还声明了视频录制配置文件。
视频录制配置文件允许任意组合的媒体类型,但任何媒体类型的帧率不能超过 30 fps。
视频录制配置文件还支持单张照片操作(例如:非连续拍摄模式)。
对于基于 INF 的声明,在 DDInstall.Interfaces 部分中,AddReg 指令用于发布概要信息。
必须为每个 Pin 媒体类型筛选器分配一个注册表项名称。 此名称必须是 MTF# ,其中 # 表示整数值。 整数值不需要是连续的,只是唯一的,因为它表示 OS 注册表中的命名值。
鉴于这些约束,我们可以声明以下配置文件:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;VPS;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
OEMCameraProfileVersion
若要启用相机配置文件 V2 支持,请声明配置文件版本:
OEMCameraProfileVersion 条目项定义我们的配置文件版本,并且对于此规范的修订版本,必须为 2。
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
如果 OEMCameraProfileVersion 注册表项不存在,并且 OEMCameraProfile 条目存在,管道将回退到相机配置文件 1507 架构。
这可确保与现有相机配置文件向后兼容。
当 OEMCameraProfileVersion 条目可用时,将忽略任何现有的相机配置文件 1507 信息,并且只会处理相机配置文件 V2。
注意:如果 OEMCameraProfileVersion 条目设置为 2,但没有找到相机配置文件 V2 声明,则不会发布配置文件。
声明后,所有配置文件都必须存储在设备接口节点下的配置文件注册表项下。
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
每个配置文件必须是使用配置文件 ID 的配置文件密钥下的子项。
配置文件 ID 是配置文件类型、配置文件索引的组合。
配置文件类型可以是以下字符串之一,也可以是 {GUID} 字符串:
KSCAMERAPROFILE_VideoRecording(视频录制)
KSCAMERAPROFILE_HighQualityPhoto
KSCAMERAPROFILE_BalancedVideoAndPhoto
KSCAMERAPROFILE_VideoConferencing
KSCAMERAPROFILE_PhotoSequence
KSCAMERAPROFILE_FaceAuth_Mode
KSCAMERAPROFILE_HighFrameRate
KSCAMERAPROFILE_HDRWithWCGVideo
KSCAMERAPROFILE_HDRWithWCGPhoto
KSCAMERAPROFILE_VariablePhotoSequence
KSCAMERAPROFILE_VideoHDR8
配置文件索引可以是从 0 到 0x7FFFFFFF 的任何值。 保留具有高顺序位集的索引值供内部使用。
相机配置文件 V2 的基础分为两个主要架构条目:
配置文件约束
固定媒体类型筛选器
资料约束
配置文件约束是影响固定媒体类型筛选器处理的配置文件范围声明。 支持以下六个标记。 它们可以以任何顺序出现,并用“;”分隔:
| 资料约束 | DESCRIPTION |
|---|---|
| LRS | 锁定所有引脚的分辨率。 配置文件中声明的所有引脚在活动时必须具有相同的分辨率。 |
| LFR | 锁定所有端口的帧速率。 配置文件中声明的所有引脚在活动状态下必须具有一致的帧速率。 |
| LST | 在所有引脚之间锁定子类型。 配置文件中声明的所有引脚在激活时必须具有相同的子类型。 |
| AAR | 将 Pin 级别配置声明应用于所有纵横比。 基于分辨率的筛选是使用宽度 * 分辨率高度的乘积来完成的,并且该产品用作比较值。 但是,如果未设置 AAR 标记,则仅对具有相同纵横比的分辨率执行比较。 |
| DIS | 禁用 如果此约束用于配置文件约束,则忽略 Pin 媒体类型筛选器,并将被视为无效的配置文件语法。 此标记不得与任何其他配置文件约束标记组合。 |
| UAR | 允许在接口之间任意组合不同分辨率的纵横比。 默认情况下,跨引脚的纵横比必须相同。 此标记删除该默认约束。 注意:建议应用程序在可用引脚之间保持相同的纵横比。 |
如果未在配置文件声明中设置 UAR 标记,则引脚之间的所有纵横比必须相同。 具体而言,不支持在拍摄照片时以 16:9 的比例进行预览流式传输,也不支持从 4:3 的捕获引脚进行流式传输。 尝试这样做将导致错误。
处理上面的示例配置文件:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
配置文件约束指示 [KSCAMERAPROFILE_HighFrameRate,0] 配置文件、分辨率和所有引脚的子类型必须相同。 这符合我们假设的相机硬件限制(在运行60帧每秒或更高时无缩放或颜色空间转换)。
编码器约束
可选的配置文件约束集可能包含为选择视频编码配置文件的应用程序推荐的编码器参数。 例如,当媒体类型超出预先确定的分辨率和/或帧速率阈值时,IHV/OEM 可以建议在某些系统中使用 HEVC 而不是 H264。
此外,由于机器上的 HW 编码器在配置编码参数时可能提供更理想的性能,OEM 可以选择为应用程序创建具有更多“提示”的配置文件。
为了方便此支持,可将以下附加约束添加到任何配置文件。
首选编码子类型
以下子类型列表是编码器的首选编码子类型:
eSPSubtype_H264
eSPSubtype_HEVC
这两个约束是相互排斥的。 只能声明一个。 声明这两者都将导致配置文件无效,并且将被拒绝。
声明首选编码子类型约束时,IMFSensorProfile 的 MF 属性存储会公开声明的首选编码子类型,其中包含MF_MT_SUBTYPE属性。
首选编码器设置
以下首选编码器配置文件列表对应于 eAVEncH264VProfile 枚举。
eSPProfile_Simple
eSPProfile_Base
eSPProfile_Main
eSPProfile_High
eSPProfile_422
eSPProfile_High10
eSPProfile_444
eSPProfile_Extended
eSPProfile_ScalableBase
eSPProfile_ScalableHigh
eSPProfile_MultiviewHigh
eSPProfile_StereoHigh
eSPProfile_ConstrainedBase
eSPProfile_UCConstrainedHigh
eSPProfile_UCScalableConstrainedBase
eSPProfile_UCScalableConstrainedHigh
eSPProfileH265_Main_420_8
eSPProfileH265_Main_420_10
eSPProfileH265_Main_420_12
eSPProfileH265_Main_422_10
eSPProfileH265_Main_422_12
eSPProfileH265_Main_444_8
eSPProfileH265_Main_444_10
eSPProfileH265_Main_444_12
eSPProfileH265_单色_12
eSPProfileH265_Monochrome_16
eSPProfileH265_MainIntra_420_8
eSPProfileH265_MainIntra_420_10
eSPProfileH265_MainIntra_420_12
eSPProfileH265_MainIntra_422_10
eSPProfileH265_MainIntra_422_12
eSPProfileH265_MainIntra_444_8
eSPProfileH265_MainIntra_444_10
eSPProfileH265_MainIntra_444_12
eSPProfileH265_MainIntra_444_12
eSPProfileH265_MainStill_420_8
eSPProfileH265_MainStill_444_8
eSPProfileH265_MainStill_444_16
上述首选编码器配置文件声明是互斥的。 只能声明一个。 声明多个参数将导致配置文件无效,并将被拒绝。
声明首选编码器配置文件约束时,IMFSensorProfile 的 MF 属性存储会使用 MF_MT_MPEG2_PROFILE 属性公开声明的首选编码器配置文件。
注意:eSPProfileH265 配置文件仅对 HEVC 编码的子类型有效。
建议的 B 帧计数
建议的 BFrame 计数约束为 OEM 提供了指示编码视频的建议 B 帧计数的方法:
- eSPBFCount_X
其中 X 表示 BFrame 计数:例如,eSPBFCount_0指示 0 B 帧计数。
声明推荐的 B 帧计数约束时,IMFSensorProfile 的 MF 属性商店会公开推荐的 B 帧计数,并带有 CODECAPI_AVEncMPVDefaultBPictureCount 属性。
建议的比特率
建议的比特率约束为 OEM 提供了一种方法来指定平均编码比特率(使用适当的编码速率控制模式时)和/或最大比特率:
eSPBitRate_XXXXX
eSPMaxBitRate_XXXXX
这两个约束可以单独或一起指定。 XXXXX 表示 Kbps 中的比特率。 例如,eSPBitRate_5000表示每秒 5,000,000 比特。
当 OEM 指定eSPBitRate_XXXXX时,它将通过 IMFSensorProfile 的 MF 属性存储器通过 CODECAPI_AVEncCommonMeanBitRate 属性公开。
OEM 指定的 eSPMaxBitRate_XXXXX 将通过 IMFSensorProfile 的 MF 属性存储中的 CODECAPI_AVEncCommonMaxBitRate 进行公开。
示例编码器约束
以下示例 INF 显示了原始设备制造商如何声明编码器约束:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","Constraint",0,"eSPSubtype_HEVC;eSPProfile_Main;eSPBFCount_1;eSPBitRate_20000;eSPMaxBitRate_50000"
上面的示例编码器约束会导致 KSCAMERAPROFILE_VideoRecording,0 配置文件的 IMFSensorProfile(请参阅下文的 API 说明)中,MF 属性存储包含如下的编码器属性。
HRESULT
CheckEncoderParameters(
_In_ IMFSensorProfile* pProfile
)
{
HRESULT hr = S_OK;
ComPtr<IMFAttributes> spAttributes;
GUID guidSubtype = GUID_NULL;
UINT32 eProfile = eAVEncH264VProfile_unknown;
UINT32 uiBFrameCount = 0;
UINT32 uiBitRate = 0;
UINT32 uiMaxBitRate = 0;
if (nullptr == pProfile)
{
return E_INVALIDARG;
}
RETURN_IF_FAILED (pProfile->QueryInterface(IID_PPV_ARGS(&spAttributes)));
if (SUCCEEDED(spAttributes->GetGUID(MF_MT_SUBTYPE, &guidSubtype)))
{
if (guidSubtype == MFVideoFormat_HEVC)
{
// Use HEVC codec.
}
else
{
// Use H264 codec.
}
}
if (SUCCEEDED(spAttributes->GetUINT32(MF_MT_MPEG2_PROFILE, &eProfile)))
{
// Use the eProfile provided for encoder profile.
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncMPVDefaultBPictureCount, &uiBFrameCount)))
{
// This is the BFrame count...
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMeanBitRate, &uiBitRate)))
{
// This is the average bit rate...
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMaxBitRate, &uiMaxBitRate)))
{
// This is the max bit rate...
}
return hr;
}
在 WinRT API 图面上,可以通过 CameraProfile.Properties 获取这些相同的属性(请参阅下面的 WinRT API 说明)。
阻止的控件
被禁用的控件将允许 OEM/IHV 根据所选配置文件有选择地禁用特定的相机控件:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;PHSEQ;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
在上面的示例中,KSCAMERAPROFILE_HighFrameRate,0 声明不支持视频 HDR(VHDR)、照片序列(PHSEQ)、KSPROPERTY.Set = {E0766E84-36A2-4945-906D-092ECBD87445} 和 KSPROPERTY.Id = 2 的自定义控件,以及 Pin1 上的暖启动。
选择此配置文件后,管道将明确阻止这些控件发送给 DMFT/相机驱动程序。 这允许 DMFT/相机驱动程序提供对所有相机控件的支持,管道将确保使用相机配置文件的应用程序不会尝试操作被阻止的控件。
可以使用以下标记之一来定义已预设的相机控制选项,或者您也可以使用 {GUID}, Id 格式来定义阻止的控件。
| 标记 | 控件说明 |
|---|---|
| PHSEQ | 扩展相机控件 - 照片序列 注意:阻止照片序列将同时阻止可变照片序列。 |
| 温暖# | 扩展相机控件 - 暖启动控件。 # 表示用于禁用“暖启动”控制的 Pin ID。 |
| 场景 | 扩展相机控制 - 场景模式。 |
| 炬 | 扩展相机控制 - 火炬模式。 |
| 闪存 | 扩展相机控制 - 闪光灯模式。 |
| ISO | 扩展相机控制 - ISO |
| EVCOMP | 扩展相机控制 - 曝光值补偿 (EV) |
| WBAL | 扩展相机控制 - 白色平衡 |
| 博览会 | 扩展相机控件 - 曝光 |
| FOCUS | 扩展相机控件 - 焦点 |
| ROI | 扩展相机控制 - ROI |
| EXTZOOM | 扩展相机控件 - 缩放 |
| 通知 | 扩展相机控制 - ISO 高级 |
| VIDST | 扩展相机控件 - 视频防抖 |
| FACEDT | 扩展相机控制 - 人脸检测 |
| VHDR | 扩展相机控制 - 视频 HDR |
| OIS | 扩展相机控制 - 光学图像防抖动 |
| ADVPHOTO | 扩展相机控件 - 高级照片 |
| FACEAUTH | 扩展相机控制 - 人脸身份验证 |
| 安全 | 扩展相机控制 - 安全模式 |
| VFP | 扩展相机控制 - VFR |
除了扩展相机控件之外,配置文件还可以阻止PROPSETID_VIDCAP_VIDEOPROCAMP和PROPSETID_VIDCAP_CAMERACONTROL控件集下的旧控件。 可以使用以下命令阻止PROPSETID_VIDCAP_VIDEOPROCAMP控件:
VIDPROC#
其中 # 表示控件 ID:
KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS // 0
KSPROPERTY_VIDEOPROCAMP_CONTRAST // 1
KSPROPERTY_VIDEOPROCAMP_HUE // 2
KSPROPERTY_VIDEOPROCAMP_SATURATION // 3
KSPROPERTY_VIDEOPROCAMP_SHARPNESS // 4
KSPROPERTY_VIDEOPROCAMP_GAMMA // 5
KSPROPERTY_VIDEOPROCAMP_COLORENABLE // 6
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE // 7
KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION // 8
KSPROPERTY_VIDEOPROCAMP_GAIN // 9
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER // 10
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER_LIMIT // 11
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT // 12
KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY // 13
例如:VIDPROC13阻止电源线路频率控制。
同样,可以使用以下方法禁用PROPSETID_VIDCAP_CAMERACONTROL:
CAMCTRL#
其中 # 表示控件 ID:
KSPROPERTY_CAMERACONTROL_PAN // 0
KSPROPERTY_CAMERACONTROL_TILT // 1
KSPROPERTY_CAMERACONTROL_ROLL // 2
KSPROPERTY_CAMERACONTROL_ZOOM // 3
KSPROPERTY_CAMERACONTROL_EXPOSURE // 4
KSPROPERTY_CAMERACONTROL_IRIS // 5
KSPROPERTY_CAMERACONTROL_FOCUS // 6
KSPROPERTY_CAMERACONTROL_SCANMODE // 7
KSPROPERTY_CAMERACONTROL_PRIVACY // 8
KSPROPERTY_CAMERACONTROL_PANTILT // 9
KSPROPERTY_CAMERACONTROL_PAN_RELATIVE // 10
KSPROPERTY_CAMERACONTROL_TILT_RELATIVE // 11
KSPROPERTY_CAMERACONTROL_ROLL_RELATIVE // 12
KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE // 13
KSPROPERTY_CAMERACONTROL_EXPOSURE_RELATIVE // 14
KSPROPERTY_CAMERACONTROL_IRIS_RELATIVE // 15
KSPROPERTY_CAMERACONTROL_FOCUS_RELATIVE // 16
KSPROPERTY_CAMERACONTROL_PANTILT_RELATIVE // 17
KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH // 18
KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY // 19
固定媒体类型筛选器
现在转向示例配置文件,我们看到一个用于高帧速率配置文件的固定媒体类型过滤器:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
在上面的部分中,“高帧速率”配置文件的 Pin0(预览引脚)允许引脚上提供任何分辨率/帧速率。 对于假设设备,驱动程序不会为预览引脚公开大于 30 fps 的任何帧速率。
使用 INF 声明时,引脚号对应于 AVStream 微型端口驱动程序声明的 KSFILTER_DESCRIPTOR 结构中定义的 KSPIN_DESCRIPTOR_EX 结构的从零开始的索引序号。
若要解释 Pin 媒体类型筛选器和相应的筛选器集,我们需要定义语法架构:
此字符串定义使用以下 Pin 媒体类型筛选器架构。 如果显示 [],则包含的字符串是可选的,否则,在语法中声明的所有字符串都是强制性的(约束语法不区分大小写):
PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet : [!](ResolutionFilter;FrameRateFilter;FourCCFilter)
Resolution : RES[==|<=|>=|!=]Width,Height
FrameRate : FRT[==|<=|>=|!=]Num,Denom
Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See below>
SubtypeValue 可能采用四 CC 值的单个十六进制表示形式(例如, 0x3231564E == NV12)、自定义媒体类型(需要打开/关闭大括号)的 {GUID},并且 GUID 必须采用以下形式:{55D24460-45B7-450E-829B-91A94FF84180} 或已知标记(NV12、YUY2 等)。
如果已知子类型没有列出的标记,则 {GUID} 表示形式也可用于 MFVideoFormat_* 子类型。
示例如下:
Pin0:((RES==;FRT==;SUT==ALL))
解析为:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Ignore all frame rate checks (implies all frame rates are allowed)
Subtype : All
这在语义上是:“允许所有媒体类型”。
有关单个分辨率、帧速率和子类型标记的定义,请参阅下面的 帧速率筛选器 。
对于 Pin1(捕获引脚),帧速率声明具有不同的值:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
解析为:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Equal or greater than 60,1
Subtype : All
只有帧速率为 60 fps 或以上的媒体类型才可以在此配置文件下用于 Pin1。
而对于 Pin2(照片图钉),不可用。
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
正如语法所暗示的,Pin 媒体类型过滤器可以是一个单一的“!”声明,这意味着对于该引脚,没有受支持的媒体格式(没有受支持的媒体类型的引脚将对客户端隐藏)。
接下来是视频录制配置文件,再次,我们对预览引脚没有限制,因为我们假定的相机仅公开了30 fps预览,并且仅仅是那些在视频录制或高帧速率场景中能够保证并发的媒体类型。
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
但是对于Capture pin,我们需要将此限制为仅30 fps的媒体类型,因为对于预览和捕获或拍照操作之间的不同分辨率,我们无法支持更高的帧速率。
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
这是通过使用帧速率小于或等于的标签(FRT<=)并指定帧速率为30 fps来完成的。
Pin1:((RES==;FRT<=30,1;SUT==ALL))
解析为:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Equal or less than 30,1
Subtype : All
对于照片图钉,我们通过将带有 PHSEQ 的 BlockedControls 声明为不允许的控件来声明任何照片序列支持。
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
筛选器集
在上一部分,我们了解了多个筛选器集,并解释了其中一些架构字符串的表示形式。 此时,有必要描述筛选器集的架构语法,以便进一步讨论。
每个筛选器集由一组特定的声明组成,用于分辨率、帧速率和子类型。 有效的筛选器集需要此三个声明(按指定顺序)。
引脚媒体类型过滤器可能包含多个过滤器条目:
PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet : [!](ResolutionFilter;FrameRateFilter;SubtypeFilter)
如果筛选器集不符合此架构,将拒绝整个配置文件声明。
所有配置文件架构字符串都不区分大小写。
每个筛选器必须用“;”分隔,并且三个分辨率筛选器、帧速率筛选器和子类型筛选器必须由打开/关闭括号绑定。
筛选器集的另一个示例:
; Allow only 1080p@60fps for any media subtype.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
; Allow either 1080p@60fps or 1080p@120fps for any subtype but nothing else.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))((RES==1920,1080;FRT==120,1;SUT==ALL))
如上面的第二个示例所示,对于引脚上的多个过滤器集,比较使用两个过滤器集的逻辑 OR 操作来完成。 例如,如果媒体类型与两个过滤器集之一匹配,则允许它。
注意:为了方便声明的读取能力,可以在多行中描述筛选器集。 为此,它们必须具有相同的 Pin#,才能组合在一起。
; Allow only 1080p@60fps or 1080p@120fps
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
Pin0:((RES==1920,1080;FRT==120,1;SUT==ALL))
语义上与上述声明相同。 但是,每行必须具有唯一的 MTF# 条目。
Disabled Pin
分辨率筛选器
如文档术语中定义的那样,解析筛选器定义如何根据 IMFMediaType 的 MF_MT_FRAME_SIZE 属性进行筛选。
解析筛选器语法:
Resolution : RES[==|<=|>=|!=]Width,Height
分辨率筛选器属性
解析筛选器属性使用 RES 字符串。 此字符串不区分大小写。
分辨率筛选器比较运算符
以下是支持的运算符:
| 比较运算符 | DESCRIPTION |
|---|---|
| == | 允许当 Resolution 等于指定的分辨率时。 如果筛选器集是排除筛选器集,则如果 Resolution 等于声明的分辨率,则此标记将禁止。 注意:如果声明使用 == 运算符,并且筛选器值为空(例如 RES==;),则忽略MF_MT_FRAME_SIZE属性。 |
| <= | 允许如果分辨率等于或小于声明的分辨率。 分辨率比较基于总像素数(宽度 * 高度的乘积)和纵横比的基础上完成。 如果在配置文件约束中声明 AAR,则总像素计数将应用于所有纵横比。 否则,仅匹配长宽比。 如果筛选器集是排除筛选器集,则当分辨率等于或小于声明的分辨率时,此标记将禁止。 |
| >= | 允许分辨率等于或大于声明的分辨率。 分辨率比较是基于总像素数(宽度和高度的乘积)和纵横比进行的。 如果在配置文件约束条件中声明 AAR,则总像素数将适用于所有纵横比。 否则,仅匹配纵横比。 如果筛选器集是排除筛选器集,则当分辨率等于或大于声明的分辨率时,此标记将禁止。 |
| != | 如果分辨率不等于声明的分辨率,则允许。 如果筛选器集是排除筛选器集,则如果解析不等于声明的分辨率,则此标记将禁止。 |
分辨率筛选器值
分辨率筛选器值的宽度和高度必须采用以逗号(“,”)分隔的十进制格式,没有任何空格:
; 1080p only.
RES==1920,1080
下面的示例:
; 1080p and any lower resolution.
RES<=1920,1080
如果在配置文件约束中未声明 AAR 标记,则仅匹配分辨率为 16:9 且等于或小于 1080p 的情况。 但是,如果声明了 AAR,则它匹配宽度 * 高度等于或小于 (1920 * 1080 = 2073600) 的所有分辨率。
例如:
如果未声明 AAR,则此条目匹配 720p,但不匹配 1280x960。
如果声明 AAR,则此条目匹配 720p、1280x960 和所有较低分辨率。
如果未声明 AAR 以确保 16:9 和 4:3 纵横比的选择性分辨率匹配,则可以使用多个滤镜集:
; This will match any 16:9 resolution of 1080p or lower
; and match any 4:3 resolution of 800x600 or lower.
; Effectively skipping 1280x960.
((RES<=1920,1080;FRT==;SUT==ALL))((RES<=800,600;FRT==;SUT==ALL))
若要匹配所有分辨率,请指定等于或大于 0,0
; Match all resolutions.
RES>=0,0
帧速率筛选器
根据文档术语中的定义,帧速率筛选器定义如何根据 IMFMediaType 的MF_MT_FRAME_RATE属性进行筛选。
帧速率筛选器语法:
FrameRate : FRT[==|<=|>=|!=]Num,Denom
帧速率筛选器属性
帧速率筛选器属性使用 FRT 字符串。 此字符串不区分大小写。
帧速率筛选器比较运算符
以下是支持的帧速率标记:
| 比较运算符 | DESCRIPTION |
|---|---|
| == | 当帧速率与声明帧速率相同时,允许操作。 如果筛选器集是排除筛选器集,则如果帧速率等于声明的帧速率,则此标记将禁止。 注意:如果声明使用 == 运算符,并且筛选器值为空(例如 FRT==;),则忽略MF_MT_FRAME_RATE属性。 |
| <= | 允许帧速率等于或小于声明的帧速率。 如果筛选器集是排除筛选器集,则如果帧速率等于或小于声明的帧速率,则此标记将禁止。 |
| >= | 允许帧速率等于或大于声明的帧速率。 如果筛选器集是排除筛选器集,则如果帧速率等于或大于声明的帧速率,则此标记将禁止。 |
| != | 仅当帧速率不等于声明的帧速率时,才允许。 如果筛选器集是排除筛选器集,则如果帧速率不等于声明的帧速率,则此标记将禁止。 |
; Allow 30fps.
FRT==30,1
; Allow 30fps or lower.
FRT<=30,1
; Allow 60fps or higher.
FRT>=60,1
; Match for all frame rate.
FRT>=0,0
FRT==;,FRT>=0,0 具有微妙的语义差异。
FRT==; : Ignore all frame rate checks for the Filter Set.
FRT>=0,0 : Match any frame rate.
FRT===; 与 FRT>=0,0 之间的区别在于,前者在包含筛选器集和排除筛选器集中具有相同的含义。 而 FRT>=0,0 的含义将取决于它是包含筛选器集还是排除筛选器集。
有关排除筛选器集的说明,请参阅 筛选器集 。
子类型筛选器
子类型筛选器定义如何基于 IMFMediaType 的MF_MT_SUBTYPE属性进行筛选。
子类型筛选器语法:
Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See Below>
子类型筛选器属性
子类型筛选器属性使用 SUT 字符串。 此字符串不区分大小写。
子类型筛选器比较运算符
支持以下比较运算符:
| 比较运算符 | DESCRIPTION |
|---|---|
| == | 如果子类型等于声明的子类型,则允许。 如果筛选器集是排除筛选器集,则如果子类型等于声明的子类型,则此标记将禁止。 注意:如果声明使用 == 运算符,并且筛选器值为空(例如 FRT===;),则忽略MF_MT_SUBTYPE属性。 |
| != | 如果子类型不等于声明的子类型,则允许。 如果筛选器集是排除筛选器集,则如果子类型不等于声明的子类型,则此标记将禁止。 |
子类型筛选器不支持等于或小于(<=)和等于或大于(>=)运算符。 如果已声明,则配置文件无效,并被管道拒绝。
子类型筛选器值
子类型筛选器值可以是 FourCC 值的十六进制表示,也可以是自定义媒体类型的 GUID 字符串声明(已知的 MFVideoFormat 子类型 GUID 也可以使用),或者是已知的子类型标记(请参阅下面的列表)。
; Match any media type which has NV12 subtype
SUT==0x3231564E
; Same as above…
SUT=={3231564E-0000-0010-8000-00AA00389B71}
; Still the same (and the recommended declaration).
SUT==NV12
; Allow any subtype except for NV12
SUT!=0x3231564E
; Another way to say the same thing
SUT!={3231564E-0000-0010-8000-00AA00389B71}
; Yet another (and recommended).
SUT!=NV12
; Valid syntax. Profile allow/disallow should ignore
; the subtype and only check against resolution and
; frame rate.
SUT==;
值 0/GUID_NULL 和 ALL 均具有特殊含义。
这表示“CC 的所有四个值”。
; Match all subtypes
SUT==0
; Another way to say the same thing
SUT=={00000000-0000-0000-0000-000000000000}
; Yet another (and recommended).
SUT==ALL
从语义上讲,SUT==; 与 SUT==0 的含义有微妙的不同。
在包含筛选器中使用时,它们具有相同的效果:允许任何子类型。 但在排除筛选器中使用时,SUT==0 表示排除所有子类型。 但是,由于这与将整个引脚标记为禁用的效果相同(!),因此没有理由在排除筛选器中使用 SUT==0。
已知子类型标记
| 标记 |
|---|
| RGB32 |
| ARGB32 |
| RGB24 |
| L8 |
| L16 |
| D16 |
| AI44 |
| AYUV |
| YUY2 |
| YVYU |
| YVU9 |
| UYVY |
| NV11 |
| NV12 |
| YV12 |
| I420 |
| IYUV |
| Y210 |
| Y216 |
| Y410 |
| Y416 |
| Y41P |
| Y41T |
| Y42T |
| P210 |
| P216 |
| P010 |
| P016 |
| V210 |
| V216 |
| V410 |
| MP43 |
| MP4S |
| M4S2 |
| MP4V |
| WMV1 |
| WMV2 |
| WMV3 |
| WVC1 |
| MSS1 |
| MSS2 |
| MPG1 |
| DVSL |
| DVSD |
| DVHD |
| DV25 |
| DV50 |
| DVH1 |
| DVC |
| H264 |
| H265 |
| MJPG |
| 420O |
| HEVC |
| HEVS |
| VP80 |
| VP90 |
| ORAW |
| H263 |
| VP10 |
| AV01 |
| JPEG |
排除筛选器集
到目前为止,筛选器集的所有示例都是包含筛选器条目。 它们的语义是“如果媒体类型符合条件,则允许客户端使用该媒体类型”。
讨论中缺少的内容等效于“如果媒体类型满足条件,则禁止向客户端提供媒体类型”。
为此,我们需要一个排除筛选器集。
如果筛选器集前面有“!”:
; Allow everything except 1080p@60fps of any subtype.
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))
它是排除筛选器集。 匹配时,排除筛选器集将从可用媒体类型列表中被排除。
声明多个过滤器集时,每个过滤器集的约束检查将进行逻辑 OR 运算。
; Allow everything except 1080p@60fps or 1080p@120fps
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))(!(RES==1920,1080;FRT==120,1;SUT==))
排除与包含筛选器集
如图所示,筛选器集可以是包含筛选器集或排除筛选器集。 允许混合不同的过滤器集,但根据添加的过滤器集的类型,固定媒体类型过滤器的含义可能会更改。
如果仅为固定媒体类型筛选器声明包含筛选器条目,则与其中一个筛选器条目不匹配的任何媒体类型都将从可用媒体类型中排除。
如果仅为 Pin 媒体类型筛选器声明排除筛选条目,那么任何与筛选条目不匹配的媒体类型都将被包括在可用的媒体类型中。
如果为固定媒体类型筛选器声明包含和排除筛选器条目,则包含与包含筛选器集匹配的任何媒体类型,除非它还与排除筛选器集匹配。 排除筛选器集取代了包含筛选器集。
为了说明此示例,假设对于 Pin0,我们有以下媒体类型可用:
1920x1080@60fps,NV12
1920x1080@30fps,NV12
1280x720@60fps NV12
1280x720@30fps,NV12
640x360@60fps,NV12
640x360@30fps,NV12
如果只定义了包含筛选器集:
; Allow all media types 720p and lower resolution whose frame
; rate is 30fps or lower. for example, no 60fps is allowed and no
; 1080p is allowed.
Pin0:((RES<=1280,720;FRT<=30,1;SUT==ALL))
如果仅声明排除筛选器集:
; Disallow 1080p resolutions or higher or any media types with
; 60fps or higher. Ignore Subtypes.
Pin0:(!(RES>=1920,1080;FRT>=60,1;SUT==))
如果我们声明了一个包含过滤器集和一个排除过滤器集:
; Allow all media types except for 640x360@60fps NV12.
Pin0:((RES<=1920,1080;FRT<=60,1;SUT==ALL))
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))
注意:由于筛选器处理语句中的规则 #2,“允许除 640x360@60fps NV12 以外的所有媒体类型”的最终示例可用于示例 Pin0:
; Allow all media types except for 640x360@60fps NV12.
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))
由于仅存在一个排除筛选器集,因此除与排除筛选器集匹配的媒体类型外,允许所有媒体类型。
为了进一步说明包含和排除过滤条目,以下是几个示例:
; Allow any media type that is 30fps.
Pin0:((RES==;FRT==30,1;SUT==ALL))
; Allow any media type that is NV12.
Pin0:((RES==;FRT==;SUT==0x3132564E))
; Allow any media type, except for 4K@60fps of any subtype.
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==))
; Allow any media type less than equal to 4K resolution,
; except for YUY2 subtypes.
Pin0:((RES<=3840,2160;FRT>=0,0;SUT==ALL))
Pin0:(!(RES==;FRT==;SUT==YUY2))
; Allow any media type equal or less than 4K
; and equal or less than 60fps
Pin0:((RES<=3840,2160;FRT<=60,1;SUT==ALL))
; Allow any NV12 and YUY2 media types
Pin0:((RES==;FRT>=0,0;SUT==NV12))((RES==;FRT>=0,0;SUT==YUY2))
; Allow any except for MJPG and H264
Pin0:((RES==;FRT>=0,0;SUT!=MJPG))((RES==;FRT>=0,0;SUT!=H264))
; Allow any but exclude only 4K@60fps NV12 & 3840x2880@60fps NV12
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==NV12))(!(RES==3840,2880;FRT==60,1;SUT==NV12))