IHD 和 OEM 的詳細設計 (相機配置檔 V2)
為了協助瞭解新的相機配置檔 V2 架構,我們會從簡單的配置檔宣告開始,並加以剖析以了解個別區段。
我們採用支援新高幀速率配置檔的假設相機。 我們會先定義裝置的一些假設硬體條件約束。
預覽釘選為 Pin 0。 在相機驅動程式定義的KSFILTER_DESCRIPTOR中,定義KSPIN_DESCRIPTOR_EX陣列時,第一個KSPIN_DESCRIPTOR_EX是預覽釘選的描述項。 同樣地,釘選 1 是擷取釘選,釘選 2 則是相片釘選。
由於硬體限制,有問題的裝置無法處理幀速率為 60 fps 或更高的縮放比例。 因此,預覽和擷取數據流必須具有相同的解析度。
同樣地,裝置也無法處理 60 fps 或更高版本的色彩空間轉換,因此在預覽和擷取之間,子類型必須相同。
相機能夠以 60 fps 串流 4K 16x9 視訊。 相機也可以在 60 fps) 3840x2880@60fps (4:3 視訊。
相機無法在 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"
每個配置檔都必須是配置檔金鑰下使用設定檔識別碼。
配置檔識別碼是配置檔類型、配置檔索引的組合。
設定檔類型可以是下列其中一個字串,或是 {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 | 已停用。 如果此條件約束用於配置檔條件約束,則會忽略釘選媒體類型篩選器,並將視為無效的配置檔語法。 此標籤不能與任何其他配置檔條件約束標籤結合。 |
UAR | 允許在針腳之間任意組合解析度外觀比例。 根據預設,針腳之間的外觀比例必須相同。 此標籤會移除該預設條件約束。 注意:建議應用程式在可用的針腳之間維持相同的外觀比例。 |
如果未在配置檔宣告上設定 UAR 標籤,則針腳之間的所有外觀比例都必須相同。 具體而言,不支援從擷取釘選 4:3 進行相片或串流時,於 16:9 串流預覽。 嘗試這樣做會導致錯誤。
處理上述範例設定檔:
[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 over 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 編碼子類型。
建議的 B 框架計數
建議的 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會透過CODECAPI_AVENCCOMMONMEANBITRATE屬性透過 IMFSensorProfile 的 MF 屬性存放區公開。
由 OEM 指定時,eSPMaxBitRate_XXXXX會透過CODECAPI_AVENCCOMMONMAXBITRATE透過 IMFSensorProfile 的 MF 屬性存放區公開。
範例編碼器條件約束
下列範例 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 宣告 Video HDR (VHDR) 、Photo Sequence (PHSEQ) ,這是 KSPROPERTY 的自定義控件。Set = {E0766E84-36A2-4945-906D-092ECBD87445} 和 KSPROPERTY.Id = 2,不支援 Pin1 的熱啟動。
選取此配置檔時,管線會明確封鎖這些控件,而無法發出給 DMFT/數位相機驅動程式。 這可讓 DMFT/數位相機驅動程式公開所有相機控制件的支援,而且管線可確保使用相機配置檔的應用程式不會嘗試觸控封鎖的控制項。
封鎖的控件可以使用下列其中一個標記來定義已定義的相機控件,或使用 {GUID},標識符格式。
標籤 | 控制件描述 |
---|---|
PHSEQ | 擴充相機控制件 - 相片序列 注意:封鎖相片序列也會封鎖可變相片序列。 |
溫暖# | 擴充相機控制件 - 暖開始控制件。 # 代表要停用暖開始控件的釘選標識符。 |
現場 | 擴充相機控制件 - 場景模式。 |
火炬 | 擴充相機控制件 - 手電筒筒模式。 |
閃光 | 擴充相機控制件 - 閃爍模式。 |
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#
其中 # 代表控制項識別碼:
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#
其中 # 代表控制項識別碼:
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 型索引序數。
若要解譯 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:(!)"
如語法所示,釘選媒體類型篩選器可以是單一 (!) 宣告,這表示該釘選沒有支持的媒體格式, (沒有支援的媒體類型,將會隱藏到用戶端) 。
再次移至視訊錄製配置檔,因為假設相機只會公開 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
針對相片釘選,我們會宣告 BlockedControls 與 PHSEQ 宣告為不允許的控件,以宣告不支援相片序列。
; 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屬性。 |
<= | 允許 Resolution 等於或小於宣告的解析度。 解析度比較是根據寬度 *高度) 的總圖元計數 (乘積,並根據外觀比例來進行。 如果在配置檔條件約束中宣告 AAR,則總像素計數會套用至所有外觀比例。 否則,請只比對外觀比例。 如果篩選集是排除篩選集,則如果解析等於或小於宣告的解析度,此標籤將會不允許。 |
>= | 允許 Resolution 等於或大於宣告的解析。 解析度比較是根據寬度 * 高度 () 乘積的總像素計數,以及根據外觀比例來完成。 如果在配置檔條件約束中宣告 AAR,則總像素計數會套用至所有外觀比例。 否則,請只比對外觀比例。 如果篩選集是排除篩選集,則如果 Resolution 等於或大於宣告的解析度,此標籤將會不允許。 |
!= | 如果 Resolution 不等於宣告的解析,則允許。 如果篩選集是排除篩選集,則如果解析不等於宣告的解析度,此標籤將會不允許。 |
解析篩選值
解析篩選值的 Width 和 Height 必須以逗號 (“,”) 以逗號分隔,且沒有任何空格符:
; 1080p only.
RES==1920,1080
下列範例將:
; 1080p and any lower resolution.
RES<=1920,1080
如果在配置檔條件約束中未宣告 AAR 標籤,則只會比對 16:9 解析度等於或小於 1080p。 不過,如果宣告 AAR,它會比對寬度 * 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字串。 此字串不區分大小寫。
幀速率篩選比較運算符
以下是支援的幀速率標籤:
比較運算子 | 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 |
---|---|
== | 如果 Subtype 等於宣告的 Subtype,則允許。 如果篩選集是排除篩選集,則如果 Subtype 等於宣告的 Subtype,此標籤將會不允許。 注意:如果宣告使用 == 運算符,而且篩選值是空的 (,例如FRT==;) ,則會忽略MF_MT_SUBTYPE屬性。 |
!= | 如果 Subtype 不等於宣告的 Subtype,則允許。 如果篩選集是排除篩選集,則如果 Subtype 不等於宣告的 Subtype,此標籤將會不允許。 |
子類型篩選不支援 Equal 或 Less (<=) 和 Equal 或 Greater (=) >運算符。 如果宣告,則配置檔無效,並由管線拒絕。
子類型篩選值
子類型篩選值可能是 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 |
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==))
這是排除篩選集。 如果媒體類型相符,則會從可用的媒體類型清單中排除排除排除篩選集。
宣告多個篩選集會導致每個篩選集的條件約束檢查以邏輯方式或彼此搭配使用:
; Allow everything except 1080p@60fps or 1080p@120fps
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))(!(RES==1920,1080;FRT==120,1;SUT==))
排除與包含篩選集
如前所示,篩選集可以是包含篩選集或排除篩選集。 允許混合不同的篩選集,但視新增的篩選集類型而定,釘選媒體類型篩選的意義可能會變更:
如果只針對釘選媒體類型篩選宣告包含篩選專案,則任何不符合其中一個篩選專案的媒體類型都會從可用的媒體類型中排除。
如果只有針對釘選媒體類型篩選宣告排除篩選專案,則任何不符合其中一個篩選專案的媒體類型都會包含在可用的媒體類型中。
如果 [包含] 和 [排除篩選專案] 都宣告為 [釘選媒體類型篩選條件] ,除非它也符合排除篩選集,否則會包含符合包含篩選集的任何媒體類型。 排除篩選集會取代包含篩選集。
為了說明此範例,假設 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,因此針對我們的範例 Pin0,「允許除了 640x360@60fps NV12 以外的所有媒體類型」的最後一個範例:
; 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))