IHV 和 OEM 的详细设计 (相机配置文件 V2)

为了帮助了解新的相机配置文件 V2 架构,我们从一个简单的配置文件声明开始,并对其进行剖析,以了解各个部分。

我们采用一个支持新高帧速率配置文件的假设相机。 我们首先定义设备的一些假设硬件约束。

  1. 预览图钉为固定 0。 在相机驱动程序定义的KSFILTER_DESCRIPTOR,定义KSPIN_DESCRIPTOR_EX数组时,第一个KSPIN_DESCRIPTOR_EX是预览引脚的描述符。 同样,引脚 1 是捕获引脚,引脚 2 是照片引脚。

  2. 由于硬件限制,有问题的设备无法处理帧速率为 60 fps 或更高的缩放。 因此,预览流和捕获流必须具有相同的分辨率。

  3. 同样,设备也无法处理 60 fps 或更高的颜色空间转换,因此预览和捕获之间的子类型必须相同。

  4. 相机能够以 60 fps 的速度流式传输 4K 16x9 视频。 相机还能够以 60 fps) 3840x2880@60fps (4:3 视频。

  5. 以 60 fps 的速度运行时,相机无法提供任何照片操作。

  6. 除了高帧速率配置文件外,我们还声明了视频录制配置文件。

  7. 视频录制配置文件允许媒体类型的任意组合,但不能以大于 30 fps 的速度使用媒体类型。

  8. 视频录制配置文件还支持单张照片操作 (例如非照片序列) 。

对于基于 INF 的声明,在 DDInstall.Interfaces 部分中,AddReg 指令用于发布配置文件信息。

必须为每个固定媒体类型筛选器分配一个注册表项名称。 此名称必须是 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 的基础分为两个main架构条目:

  • 配置文件约束

  • 固定媒体类型筛选器

配置文件约束

配置文件约束是影响固定媒体类型筛选器处理的配置文件范围声明。 这些是支持的六个标记。 它们可能以“;”分隔的任何顺序显示:

配置文件约束 说明
LRS 锁定所有引脚的分辨率。 配置文件中声明的所有引脚在活动时必须具有相同的分辨率。
LFR 锁定所有引脚的帧速率。 配置文件中声明的所有引脚在活动时必须具有相同的帧速率。
LST 跨所有引脚锁定子类型。 配置文件中声明的所有引脚在活动时必须具有相同的子类型。
Aar 将 Pin 级别配置文件声明应用于所有纵横比。

基于分辨率的筛选通过使用分辨率的宽度 * 高度乘积来完成,并将该乘积用作比较值。 但是,如果未设置 AAR 标记,则仅对纵横比相同的分辨率执行比较。
DIS 已禁用。 如果此约束用于配置文件约束,则忽略固定媒体类型筛选器,并被视为无效的配置文件语法。

此标记不能与任何其他配置文件约束标记组合使用。
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] 配置文件,所有引脚的分辨率和子类型必须相同。 这与假设的相机的 HW 约束相匹配, (以 60 fps 或更高) 运行时没有缩放/颜色空间转换。

编码器约束

对于选择配置文件进行视频编码操作的应用程序,一组可选的配置文件约束可能包含推荐的编码器参数。 例如,当媒体类型在分辨率和/或帧速率方面超过预定阈值时,对于某些系统,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_Monochrome_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 编码的子类型有效。

建议的 BFrame 计数约束为 OEM 提供了一种指示编码视频的建议 B 帧计数的方法:

  • eSPBFCount_X

其中 X 表示 BFrame 计数:例如,eSPBFCount_0指示 0 B 帧计数。

声明推荐的 BFrame 计数约束时,IMFSensorProfile 的 MF 属性存储使用 CODECAPI_AVEncMPVDefaultBPictureCount 属性公开声明的推荐 BFrame 计数。

使用适当的编码速率控制模式时,建议的比特率约束为 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 演示 OEM 如何声明编码器约束:

[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 扩展相机控件 - 照片序列

注意:阻止照片序列也会阻止可变照片序列。
温暖# 扩展的相机控件 - 热启动控件。

# 表示要禁用暖启动控件的固定 ID。
现场 扩展的相机控制 - 场景模式。
火炬 扩展的相机控制 - 火炬模式。
闪光 扩展的相机控制 - 闪光灯模式。
ISO 扩展相机控制 - ISO
EVCOMP 扩展相机控制 - EV 补偿
WBAL 扩展相机控制 - 白平衡
博览会 扩展相机控制 - 曝光
重点 扩展相机控件 - 焦点
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结构的从 0 开始的索引序号。

若要解释固定媒体类型筛选器和相应的筛选器集,需要定义语法架构:

此字符串定义使用以下固定媒体类型筛选器架构。 其中显示 [] 时,包含的字符串是可选的,否则,在语法中声明的所有字符串都是强制性的, (约束语法不区分大小写) :

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

对于 Pin1,此配置文件仅允许帧速率为 60 fps 或更高的媒体类型。

虽然对于 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:(!)"

正如语法所暗示的,固定媒体类型筛选器可以选择是单个 (!) 声明,这意味着对于该引脚,没有受支持的媒体格式 (引脚将隐藏给客户端) 。

转到视频录制配置文件,我们再次对预览引脚没有限制,因为我们假设的相机仅公开 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))"

但对于捕获引脚,我们需要将其限制为仅 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 字符串。 此字符串不区分大小写。

分辨率筛选器比较运算符

以下是支持的运算符:

比较运算符 说明
== 如果 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,则它匹配其 Width * Height 乘积等于或小于 (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 字符串。 此字符串不区分大小写。

帧速率筛选器比较运算符

以下是支持的帧速率标记:

比较运算符 说明
== 如果帧速率等于声明的帧速率,则允许。

如果筛选器集是排除筛选器集,则如果帧速率等于声明的帧速率,此标记将禁止。

注意:如果声明使用 == 运算符,并且 filter Value 为空, (例如 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.

The difference between FRT==;和 FRT>=0,0 是前者对包含筛选器集和排除筛选器集具有相同的含义。 而 FRT>=0,0 的含义将取决于它是包含筛选器集还是排除筛选器集。

有关排除 筛选器集 的说明,请参阅筛选器集。

子类型筛选器

子类型筛选器定义如何基于 IMFMediaType 的 MF_MT_SUBTYPE 属性进行筛选。

子类型筛选器语法:

Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See Below>

子类型筛选器属性

子类型筛选器属性使用 SUT 字符串。 此字符串不区分大小写。

子类型筛选器比较运算符

支持以下比较运算符:

比较运算符 说明
== 如果子类型等于声明的子类型,则允许。

如果筛选器集是排除筛选器集,则当子类型等于声明的子类型时,此标记将禁止。

注意:如果声明使用 == 运算符,并且 filter Value (为空,例如 FRT==;) ,则忽略 MF_MT_SUBTYPE 属性。
!= 如果子类型不等于声明的子类型,则允许。

如果筛选器集是排除筛选器集,则子类型不等于声明的子类型时,此标记将禁止。

子类型筛选器不支持 Equal 或 Less Than (<=) 和 Equal 或大于 (>=) 运算符。 如果声明,则配置文件无效,并被管道拒绝。

子类型筛选器值

子类型筛选器值可以是 FourCC 值的十六进制表示形式,如果使用自定义媒体类型 (已知的 MFVideoFormat 子类型 GUID,也可以使用 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
DVDSD
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==))

排除与包含筛选器集

如图所示,筛选器集可以是包含筛选器集或排除筛选器集。 允许混合不同的筛选器集,但根据添加的筛选器集类型,固定媒体类型筛选器的含义可能会更改:

  1. 如果仅为固定媒体类型筛选器声明包含筛选器条目,则将从可用媒体类型中排除与其中一个筛选器条目不匹配的任何媒体类型。

  2. 如果仅为固定媒体类型筛选器声明了排除筛选器条目,则任何与筛选器条目之一不匹配的媒体类型都将包含在可用媒体类型中。

  3. 如果为固定媒体类型筛选器声明了包含和排除筛选器条目,则包含与包含筛选器集匹配的任何媒体类型,除非它也与排除筛选器集匹配。 排除筛选器集取代包含筛选器集。

为了说明此示例,假设 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))

相机配置文件 V2 开发人员规范