擴充相機控制件
擴充控件使用 KSPROPERTY 機制,將相機控件公開給應用程式。
媒體基礎所定義的標準化擴充控件清單) 啟用其他 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屬性標識碼來查詢元數據緩衝區需求,例如所需的元數據大小、記憶體對齊需求,以及所需的記憶體配置類型。
使用者模式元件從驅動程式取得元數據緩衝區需求之後,它會從所需的記憶體集區配置適當大小的元數據緩衝區,以及所需的記憶體對齊方式。 此元數據緩衝區以及實際的畫面緩衝區會傳送至驅動程式以履行,然後在填滿時傳回給使用者模式元件。 針對多重shot 案例,系統會針對配置的每個畫面緩衝區配置對應的元數據緩衝區,並傳遞給相機驅動程式。
KSSTREAM_METADATA_INFO 結構以及下列旗標會用來將元數據緩衝區傳送至驅動程式。
#define KSSTREAM_HEADER_OPTIONSF_METADATA 0x00001000
一旦緩衝區 (元數據 + 框架) 排入驅動程式,DevProxy 就會傳送標準 KSSTREAM_HEADER 結構,後面接著 KS_FRAME_INFO 結構,後面接著 KSSTREAM_METADATA_INFO 結構。 DevProxy 會進一步遮罩 KSSTREAM_HEADER。OptionFlags with 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所識別。 自定義元數據專案可以包含元數據 Blob,可以是預覽釘選、EXIF 和/或影像釘選的 OEM 元數據偵測到的焦點狀態和/或臉部。 自定義 Blob 的確切格式是由實作驅動程式和 MFT0 的 OEM 所決定。 MFT0 負責剖析自定義 Blob,並以 MF 擷取管線和/或 WinRT 可讀取的格式,將每個元數據專案附加為群組在 MFSampleExtension_CaptureMetadata 屬性包下的屬性。
下列IMFAttributes定義於 mfapi.h 中。 MF 擷取管線和/或 WinRT 需要這些專案。 請注意,MFT0 不會針對相片確認設定任何 IMFAttributes,因為相片確認畫面不會流向 DevProxy 之外。
屬性 (GUID) | 資料類型 |
---|---|
MF_CAPTURE_METADATA_FOCUSSTATE | UINT32 |
MF_CAPTURE_METADATA_FACEROIS | Blob |
MF_CAPTURE_METADATA_FRAME_RAWSTREAM | IUnknown |
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes 是由 DevProxy 建立並附加至MFSampleExtension_CaptureMetadata,其中包含與原始元數據緩衝區相關聯的 IMFMediaBuffer 介面指標 (KSSTREAM_METADATA_INFO。數據) 。
當 MFT0 收到 IMFSample 時,它會從 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 取得原始元數據緩衝區,並剖析任何其他自定義元數據專案,例如焦點狀態,並將其轉換成上面定義的對應 IMFAttributes,並將其附加至 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
下列屬性識別碼是與 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 編碼器選項是由編碼器選項屬性包中的下列屬性所識別:
屬性名稱 | VARTYPE | 值 | 適用的編解碼器 |
---|---|---|---|
SampleMetaData | VT_UNKNOWN | MFSAMPLEEXTENSION_CAPTUREMETADATA 屬性包 的 IMFAttributes 介面指標,其中包含包含 EXIF 數據的 OEM 子屬性。 | JPEG |
MFSampleExtension_CaptureMetaData屬性包只能包含 MFT0 和 HW JPEG 編碼器可以讀取以儲存 EXIF 資料的任何 OEM 定義的 EXIF 子屬性。 若要將 EXIF 數據從驅動程式傳遞至 HW JPEG 編碼器,驅動程式和 MFT0 必須執行下列動作:
驅動程式會在管線所提供的元數據緩衝區中提供自定義 EXIF 元數據。 當範例傳回至 DevProxy 時,這會附加至MFSampleExtension_CaptureMetadata作為 devProxy MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute。
當 MFT0 收到 IMFSample 時,它會從 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 取得原始元數據緩衝區,並剖析自定義 EXIF 元數據專案,並將其轉換成 OEM 定義的 IMFAttribute,並將其附加至 MFSampleExtension_CaptureMetadata 屬性包。
若要將EXIF資料從MFT0傳遞至 HW JPEG 編碼器,管線相片接收會執行下列動作:
從 IMFSample 呼叫MFSampleExtension_CaptureMetadata上的 GetUnknown,以在收到 IMFSample 時取得屬性包的 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 相關聯的控件。
閃爍
KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE屬性標識碼是唯一與快閃 DDI 相關聯的控件。
放大
KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM屬性標識碼是唯一與縮放 DDI 相關聯的控件。
場景模式
KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE屬性標識碼是唯一與場景模式 DDI 相關聯的控件。