擴充控制項會使用 KSPROPERTY 機制,將相機控制項公開給應用程式。
下列標準化擴充控制項清單 (由 Media Foundation 定義) 會啟用其他 Windows 相機功能:
部分控制項會以非同步控制項的形式公開給應用程式,而其他控制項則公開為同步控制項。
同步控制
針對這些控制項,擷取管線會發出 KSPROPERTY 相機控制結構,並預期驅動程式會同步傳回要求。
非同步控制項
針對這些控制項,擷取管線會發出 KSPROPERTY、啟用與該屬性相關聯的 KSEVENT ,並等候事件收到訊號。 驅動程式必須同步完成 KSPROPERTY ,並使用它作為觸發程式來啟動非同步作業。 非同步作業完成之後,驅動程式必須向擷取管線等候之相關聯 KSEVENT 發出訊號。 擷取管線會在收到訊號時通知應用程式作業完成。
如果可以取消非同步控制項,則必須指定控制項中 KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION 的旗標。 如果無法取消控制項,則控制項的作業不得超過 5 毫秒。
這些擴充控制項是 ksmedia.h 中定義的下列 KS 屬性集的一部分:
#define STATIC_KSPROPERTYSETID_ExtendedCameraControl \
0x1CB79112, 0xC0D2, 0x4213, 0x9C, 0xA6, 0xCD, 0x4F, 0xDB, 0x92, 0x79, 0x72
DEFINE_GUIDSTRUCT("1CB79112-C0D2-4213-9CA6-CD4FDB927972", KSPROPERTYSETID_ExtendedCameraControl);
#define KSPROPERTYSETID_ExtendedCameraControl DEFINE_GUIDNAMED(KSPROPERTYSETID_ExtendedCameraControl);
後設資料
若要擷取中繼資料,使用者模式元件 (DevProxy) 必須查詢驅動程式,以取得中繼資料緩衝區需求。 使用者模式元件具有這項資訊之後,它會配置適當的中繼資料緩衝區,讓驅動程式填入並傳回使用者模式元件。
用戶端會使用 KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY 列舉中定義的KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA屬性識別碼來查詢中繼資料緩衝區需求,例如必要的中繼資料大小、記憶體對齊需求,以及中繼資料緩衝區配置所需的記憶體配置類型。
使用者模式的元件從驅動程式取得中繼資料緩衝區的需求之後,會從所需的記憶體集區中分配大小適當且具有所需記憶體對齊方式的中繼資料緩衝區。 此中繼資料緩衝區以及實際的畫面緩衝區會傳送至驅動程式以完成,然後在填滿時傳回使用者模式元件。 針對多鏡頭案例,會針對每個配置的畫面緩衝區配置對應的中繼資料緩衝區,並將其傳遞至相機驅動程式。
KSSTREAM_METADATA_INFO 結構以及下列旗標可用來將中繼資料緩衝區傳送至驅動程式。
#define KSSTREAM_HEADER_OPTIONSF_METADATA 0x00001000
一旦緩衝區 (中繼資料 + 框架) 排入驅動程式佇列,DevProxy 會傳送標準 KSSTREAM_HEADER 結構,接著是 KS_FRAME_INFO 結構,後面接著是 KSSTREAM_METADATA_INFO 結構。 DevProxy 將進一步屏蔽 KSSTREAM_HEADER.OptionFlags,並結合 KSSTREAM_HEADER_OPTIONSF_METADATA,再將緩衝區傳遞到驅動程式下層。
如果驅動程式不支援中繼資料,或未實作KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA,KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA屬性控制將會失敗。 在此情況下,DevProxy 不會配置中繼資料緩衝區,而且從 DevProxy 向下傳遞至驅動程式的承載不會包含 KSSTREAM_METADATA_INFO 結構。
如果驅動程式支援中繼資料,且用戶端不需要任何中繼資料,則 DevProxy 在將緩衝區傳送至驅動程式時,既不會配置中繼資料緩衝區,也不會傳遞 KSSTREAM_METADATA_INFO 。 如果應用程式不需要指定針腳上的中繼資料,此行為會減少不必要的中繼資料記憶體配置。
相機驅動程式要在中繼資料緩衝區中填入的中繼資料項目的配置如下所述。
下列清單包含中繼資料項目的版面配置。 這必須是 8 位元組對齊。
相片確認中繼資料由 MetadataId_PhotoConfirmation識別。 如果存在,則表示關聯的預覽框是相片確認框。 照片確認元資料由 DevProxy 解析。
自訂中繼資料是由從 MetadataId_Custom_Start 開始的 MetadataId 所識別。 自定義中繼資料專案可以包含一塊中繼資料,這塊中繼資料可能包括預覽針腳或影像針腳的焦點狀態及/或臉部偵測結果,還有 EXIF 和/或 OEM 的中繼資料。 自訂 Blob 的確切格式是由實作驅動程式和 MFT0 的 OEM 所決定。 MFT0 負責剖析自訂資料塊,並將每個中繼資料項目附加為 MFSampleExtension_CaptureMetadata 屬性包中的一組屬性,其格式可被 MF 擷取管線和/或 WinRT 讀取。
下列 IMFAttributes 定義在 mfapi.h 中。 這些是 MF 擷取管線和/或 WinRT 所需要的。 請注意,MFT0 不會為相片確認設定任何 IMFAttributes,因為相片確認框架不會流向 DevProxy。
| 屬性(GUID) | 數據類型 |
|---|---|
| MF_CAPTURE_METADATA_FOCUSSTATE | UINT32 |
| MF_CAPTURE_METADATA_FACEROIS | 塊狀物 |
| MF_CAPTURE_METADATA_FRAME_RAWSTREAM | IUnknown |
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes 是由 DevProxy 建立並附加至 MFSampleExtension_CaptureMetadata,其中包含與原始中繼資料緩衝區相關聯的 IMFMediaBuffer 介面的指標(KSSTREAM_METADATA_INFO.Data)。
當 MFT0 收到 IMFSample 時,它會從 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 取得原始中繼資料緩衝區,並剖析任何其他自訂中繼資料專案,例如焦點狀態,並將其轉換成上述定義的對應 IMFAttribute,並將其附加至 MFSampleExtension_CaptureMetadata 屬性包。 下列 IMFAttributes 必須由 MF 管線和任何協力廠商提供的 MFT 繼承:
| 名稱 | 類型 |
|---|---|
| MFSampleExtension_CaptureMetadata | IUnknown (IMFAttributes) |
| MFSampleExtension_EOS | UINT32 (布林值) |
| MFSampleExtension_PhotoThumbnail | IUnknown (IMFMediaBuffer) |
| MFSampleExtension_PhotoThumbnailMediaType | IUnknown (IMFMediaType) |
若要存取原始中繼資料緩衝區,MFT0 會執行下列動作:
從 IMFSample 介面上的 MFSampleExtension_CaptureMetadata 呼叫 GetUnknown,以取得屬性包的 IMFAttributes 介面。
從上一個步驟取得的 IMFAttributes 介面在MF_CAPTURE_METADATA_FRAME_RAWSTREAM上呼叫 GetUnknown,以取得 IMFMediaBuffer 介面。
呼叫 Lock 以取得與 IMFMediaBuffer 相關聯的原始中繼資料緩衝區。
若要將必要的 IMFAttributes 新增至 MFSampleExtension_CaptureMetadata 屬性包,MFT0 會執行下列動作:
在 IMFSample 介面上,對 MFSampleExtension_CaptureMetadata 呼叫 GetUnknown,以獲取屬性包的 IMFAttributes 介面。
根據上表中指定的 GUID 和資料類型,從上一個步驟取得的 IMFAttributes 介面,在 MF_CAPTURE_METADATA_XXX 上呼叫 SetUINT32、SetBlob 或 SetUnknown。
必要中繼資料屬性
如需可用中繼資料屬性的完整清單,請參閱 擷取統計資料中繼資料屬性
焦點優先
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY屬性識別碼是與焦點優先順序 DDI 相關聯的唯一控制項。
焦點狀態
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE屬性識別碼是與焦點狀態 DDI 相關聯的唯一控制項。
擴展感興趣區域的投資回報率
下列屬性識別碼是與 ROI DDI 相關聯的控制項:
相片確認
KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION屬性識別碼是與相片確認 DDI 相關聯的唯一控制項。
照片序列子模式
KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE屬性識別碼是唯一與相片序列 DDI 相關聯的控制項。
EXIF 和 HW JPEG 編碼器
管線不需要處理或扭曲 HW JPEG 編碼器的任何 EXIF 資料;因此,EXIF 數據格式是由驅動程式、MFT0 和 OEM HW JPEG 編碼器所提供。 OEM 合作夥伴可以定義 EXIF 屬性的任何自訂屬性 GUID 和變體類型,並將其附加至 MFSampleExtension_CaptureMetaData 屬性包,以便 OEM 元件取用。 如果 HW JPEG 編碼器可用,管線相片接收元件會載入 HW JPEG 編碼器,並使用 IPropertyBag2::Write 方法,將 MFSampleExtension_CaptureMetaData 屬性包中保留的 EXIF 資料設定為 EXIF 編碼器選項。
編碼器選項屬性包包含指定可用編碼選項屬性的PROPBAG2結構陣列。 設定在 HW JPEG 編碼器的 EXIF 編碼器選項是由編碼器選項屬性包中的下列屬性所識別:
| 屬性名稱 | 變數類型 | 價值觀 | 適用的編解碼器 |
|---|---|---|---|
| 範例中繼資料 | VT_UNKNOWN | 指向 IMFAttributes 介面的指標,用於 MFSampleExtension_CaptureMetaData 屬性包,該包包含一個含有 EXIF 資料的 OEM 子屬性。 | JPEG |
MFSampleExtension_CaptureMetaData屬性包只能包含任何 OEM 定義的 EXIF 子屬性,MFT0 和 HW JPEG 編碼器可以讀取以保留 EXIF 數據。 若要將 EXIF 數據從驅動程式傳遞至 HW JPEG 編碼器,驅動程式和 MFT0 必須執行下列動作:
驅動程式會在管線所提供的中繼資料緩衝區中提供自定義 EXIF 中繼資料。 當範例回傳給 DevProxy 時,這會作為 DevProxy 的 MFSampleExtension_CaptureMetadata 屬性附加至 MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute。
當 MFT0 收到 IMFSample 時,它會從 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 取得原始中繼資料緩衝區,並剖析自訂 EXIF 中繼資料專案,並將它轉換成 OEM 定義的 IMFAttribute,並將它附加至 MFSampleExtension_CaptureMetadata 屬性包。
若要將 EXIF 數據從 MFT0 傳遞至 HW JPEG 編碼器,管線相片接收會執行下列動作:
在收到 IMFSample 時,從中呼叫 GetUnknown,以在 MFSampleExtension_CaptureMetadata 上取得屬性包的 IMFAttributes 介面。
呼叫 IPropertyBag2::Write ,將 SampleMetadata 所識別的編碼器選項屬性設定為 HW JPEG 編碼器。 編碼器選項屬性包含從上一個步驟取得的 IMFAttributes 介面。 此介面包含所有自訂子屬性,包括 OEM EXIF 子屬性,以及本主題稍早討論的 [中繼資料 ] 區段中的標準化子屬性。
若要擷取 EXIF 資料以進行進一步處理,HW JPEG 編碼器會執行下列動作:
呼叫 IPropertyBag2::Read 來擷取 SampleMetadata 屬性名稱和 VT_UNKNOWN 類型所識別之屬性的屬性值。 傳回時,VARIANT.punkVal 會取得 MFSampleExtension_CaptureMetadata 的 IMFAttributes 介面。
從上一個步驟取得的介面中,對 OEM EXIF 子屬性呼叫 GetBlob 或 GetUnknown,以根據該 OEM EXIF 子屬性的 GUID 和資料類型獲得 EXIF 資料 Blob。
縮圖
不需要 MFT0 來產生相機驅動程式的任何縮圖。 相機應用程序預計將生成自己的縮略圖。 縮略圖可以從照片確認圖像、HW JPEG 編碼器或調整全尺寸圖像大小生成。 這取決於應用程序開發人員。 若要維護 API 和應用程式與 Windows 8.1 應用程式的相容性,相機驅動程式不得實作 KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL 控制項。
整數 ISO
KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED屬性識別碼是與整數 ISO DDI 相關聯的唯一控制項。
進階焦點
KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE屬性識別碼是與整數 ISO DDI 相關聯的唯一控制項。
Flash
KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE屬性識別碼是唯一與快閃記憶體 DDI 相關聯的控制項。
縮放
KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM屬性識別碼是與縮放 DDI 相關聯的唯一控制項。
場景模式
KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE屬性識別碼是與場景模式 DDI 相關聯的唯一控制項。