다음을 통해 공유


확장된 카메라 컨트롤

확장된 컨트롤은 KSPROPERTY 메커니즘을 사용하여 카메라 컨트롤을 애플리케이션에 노출합니다.

다음 표준화된 확장 컨트롤 목록(Media Foundation에서 정의)은 추가 Windows 카메라 기능을 사용하도록 설정합니다.

일부 컨트롤은 비동기 컨트롤로 애플리케이션에 노출되고 다른 컨트롤은 동기 컨트롤로 노출됩니다.

동기 컨트롤

이러한 컨트롤의 경우 캡처 파이프라인은 KSPROPERTY 카메라 컨트롤 구조를 실행하며 드라이버가 요청을 동기적으로 반환할 것으로 예상합니다.

비동기 컨트롤

이러한 컨트롤의 경우 캡처 파이프라인은 KSPROPERTY를 발급하고, 해당 속성과 연결된 KSEVENT 를 사용하도록 설정하고, 이벤트가 신호를 받을 때까지 기다립니다. 드라이버는 KSPROPERTY 를 동기적으로 완료하고 이를 트리거로 사용하여 비동기 작업을 시작해야 합니다. 비동기 작업이 완료되면 드라이버는 캡처 파이프라인이 대기 중인 관련 KSEVENT 에 신호를 전송해야 합니다. 캡처 파이프라인은 신호를 받을 때 작업의 완료에 대해 애플리케이션에 알릴 수 있습니다.

비동기 컨트롤을 취소할 수 있는 경우 컨트롤에서 플래그 KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION 지정해야 합니다. 컨트롤을 취소할 수 없는 경우 컨트롤의 작업은 5ms를 초과하면 안 됩니다.

이러한 확장된 컨트롤은 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 속성 ID는 메타데이터 버퍼 할당을 위해 필요한 메타데이터 크기, 메모리 맞춤 요구 사항 및 원하는 메모리 할당 유형과 같은 메타데이터 버퍼 요구 사항을 쿼리하는 데 클라이언트에서 사용됩니다.

사용자 모드 구성 요소가 드라이버에서 메타데이터 버퍼 요구 사항을 가져오면 원하는 메모리 풀에서 원하는 메모리 맞춤을 사용하여 적절한 크기의 메타데이터 버퍼를 할당합니다. 이 메타데이터 버퍼는 실제 프레임 버퍼와 함께 처리할 드라이버로 전송된 다음 채워지면 사용자 모드 구성 요소로 다시 반환됩니다. 멀티샷 시나리오의 경우 해당 메타데이터 버퍼가 할당되어 할당된 각 프레임 버퍼에 대해 카메라 드라이버에 전달됩니다.

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이 포함될 수 있습니다. 사용자 지정 Blob의 정확한 형식은 드라이버 및 MFT0을 구현하는 OEM에 의해 결정됩니다. MFT0은 사용자 지정 Blob을 구문 분석하고 각 메타데이터 항목을 MF 캡처 파이프라인 및/또는 WinRT에서 읽을 수 있는 형식으로 MFSampleExtension_CaptureMetadata 특성 모음 아래에 그룹화된 특성으로 연결합니다.

다음 IMFAttributes는 mfapi.h에 정의되어 있습니다. MF 캡처 파이프라인 및/또는 WinRT에 필요합니다. 사진 확인 프레임이 DevProxy를 넘어 흐르지 않으므로 MFT0은 사진 확인을 위해 IMFAttributes를 설정하지 않습니다.

특성(GUID) 데이터 형식
MF_CAPTURE_METADATA_FOCUSSTATE Uint32
MF_CAPTURE_METADATA_FACEROIS Blob
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes는 원시 메타데이터 버퍼(KSSTREAM_METADATA_INFO와 연결된 IMFMediaBuffer 인터페이스에 대한 포인터를 포함하는 DevProxy에 의해 MFSampleExtension_CaptureMetadata 만들어지고 연결됩니다. 데이터).

MFT0은 IMFSample을 받으면 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 원시 메타데이터 버퍼를 가져오고 포커스 상태와 같은 추가 사용자 지정 메타데이터 항목을 구문 분석하여 위에 정의된 해당 IMFAttributes로 변환하고 MFSampleExtension_CaptureMetadata 특성 모음에 연결합니다. 다음 IMFAttributes는 MF 파이프라인 및 타사 제공 MFT에 의해 이월되어야 합니다.

Name 형식
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (부울)
MFSampleExtension_PhotoThumbnail IUnknown (IMFMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (IMFMediaType)

원시 메타데이터 버퍼에 액세스하기 위해 MFT0은 다음을 수행합니다.

  1. IMFSample 인터페이스에서 MFSampleExtension_CaptureMetadataGetUnknown을 호출하여 특성 모음에 대한 IMFAttributes 인터페이스를 가져옵니다.

  2. 이전 단계에서 가져온 IMFAttributes 인터페이스에서 MF_CAPTURE_METADATA_FRAME_RAWSTREAMGetUnknown을 호출하여 IMFMediaBuffer 인터페이스를 가져옵니다.

  3. Lock을 호출하여 IMFMediaBuffer와 연결된 원시 메타데이터 버퍼를 가져옵니다.

필요한 IMFAttributes를 MFSampleExtension_CaptureMetadata 특성 모음에 추가하려면 MFT0에서 다음을 수행합니다.

  1. IMFSample 인터페이스에서 MFSampleExtension_CaptureMetadataGetUnknown을 호출하여 특성 모음에 대한 IMFAttributes 인터페이스를 가져옵니다.

  2. 위의 표에 지정된 GUID 및 데이터 형식을 기반으로 이전 단계에서 가져온 IMFAttributes 인터페이스에서 MF_CAPTURE_METADATA_XXXSetUINT32, SetBlob 또는 SetUnknown을 호출합니다.

필수 메타데이터 특성

사용 가능한 메타데이터 특성의 전체 목록은 캡처 통계 메타데이터 특성에서 찾을 수 있습니다.

포커스 우선 순위

KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY 속성 ID는 포커스 우선 순위 DDI와 연결된 유일한 컨트롤입니다.

포커스 상태

KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE 속성 ID는 포커스 상태 DDI와 연결된 유일한 컨트롤입니다.

관심 영역 확장 ROI

다음 속성 ID는 ROI DDI와 연결된 컨트롤입니다.

사진 확인

KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION 속성 ID는 사진 확인 DDI와 연결된 유일한 컨트롤입니다.

사진 시퀀스 하위 노드

KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE 속성 ID는 사진 시퀀스 DDI와 연결된 유일한 컨트롤입니다.

EXIF 및 HW JPEG 인코더

파이프라인은 HW JPEG 인코더에 대한 EXIF 데이터를 처리하거나 왜곡할 필요가 없습니다. 따라서 EXIF 데이터 형식은 드라이버, MFT0 및 OEM HW JPEG 인코더에서 제공됩니다. OEM 파트너는 EXIF 특성에 대한 사용자 지정 특성 GUID 및 변형 형식을 정의하고 OEM 구성 요소에서 사용할 MFSampleExtension_CaptureMetaData 특성 모음에 연결할 수 있습니다. HW JPEG 인코더를 사용할 수 있는 경우 파이프라인 사진 싱크 구성 요소는 HW JPEG 인코더를 로드하고 IPropertyBag2::Write 메서드를 사용하여 HW JPEG 인코더 옵션으로 MFSampleExtension_CaptureMetaData 특성 모음에 저장된 EXIF 데이터를 HW JPEG 인코더로 설정합니다.

인코더 옵션 속성 모음에는 사용 가능한 인코딩 옵션 속성을 지정하는 PROPBAG2 구조체 배열이 포함되어 있습니다. HW JPEG 인코더에 설정된 EXIF 인코더 옵션은 인코더 옵션 속성 모음에서 다음 속성으로 식별됩니다.

속성 이름 VARTYPE 적용 가능한 코덱
SampleMetaData VT_UNKNOWN EXIF 데이터를 포함하는 OEM 하위 특성을 포함하는 MFSampleExtension_CaptureMetaData 특성 모음에 대한 IMFAttributes 인터페이스에 대한 포인터입니다. JPEG

MFSampleExtension_CaptureMetaData 특성 모음에는 MFT0 및 HW JPEG 인코더가 EXIF 데이터를 보관하기 위해 읽을 수 있는 OEM 정의 EXIF 하위 특성만 포함될 수 있습니다. 드라이버에서 HW JPEG 인코더로 EXIF 데이터를 전달하려면 드라이버와 MFT0에서 다음을 수행해야 합니다.

  1. 드라이버는 파이프라인에서 제공하는 메타데이터 버퍼에 사용자 지정 EXIF 메타데이터를 제공합니다. 샘플이 DevProxy 로 다시 반환되면 DevProxy에서 MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute로 MFSampleExtension_CaptureMetadata 연결됩니다.

  2. MFT0은 IMFSample을 받으면 MF_CAPTURE_METADATA_FRAME_RAWSTREAM 원시 메타데이터 버퍼를 가져오고 사용자 지정 EXIF 메타데이터 항목을 구문 분석하여 OEM 정의 IMFAttribute로 변환하고 MFSampleExtension_CaptureMetadata 특성 모음에 연결합니다.

MFT0에서 HW JPEG 인코더로 EXIF 데이터를 전달하기 위해 파이프라인 사진 싱크는 다음을 수행합니다.

  1. IMFSample에서 MFSampleExtension_CaptureMetadataGetUnknown을 호출하여 IMFSample이 수신될 때 특성 모음에 대한 IMFAttributes 인터페이스를 가져옵니다.

  2. IPropertyBag2::Write를 호출하여 SampleMetadata로 식별되는 인코더 옵션 속성을 HW JPEG 인코더로 설정합니다. 인코더 옵션 속성은 이전 단계에서 가져온 IMFAttributes 인터페이스를 포함합니다. 이 인터페이스에는 OEM EXIF 하위 특성을 포함한 모든 사용자 지정 하위 특성과 이 항목의 앞부분에서 설명한 메타데이터 섹션의 표준화된 하위 특성이 포함됩니다.

추가 처리를 위해 EXIF 데이터를 검색하기 위해 HW JPEG 인코더는 다음을 수행합니다.

  1. IPropertyBag2::Read를 호출하여 SampleMetadata 속성 이름 및 VT_UNKNOWN 형식으로 식별된 속성의 속성 값을 검색합니다. 반환되면 VARIANT.punkValMFSampleExtension_CaptureMetadata 대한 IMFAttributes 인터페이스를 받습니다.

  2. 이전 단계에서 가져온 인터페이스에서 OEM EXIF 하위 특성에서 GetBlob 또는 GetUnknown 을 호출하여 OEM EXIF 하위 특성의 GUID 및 데이터 형식을 기반으로 EXIF 데이터 Blob을 가져옵니다.

미리 보기

MFT0은 카메라 드라이버에 대한 썸네일을 생성할 필요가 없습니다. 카메라 앱은 자체 썸네일을 생성해야 합니다. 썸네일은 사진 확인 이미지, HW JPEG 인코더 또는 전체 크기 이미지 크기 조정에서 생성될 수 있습니다. 이는 앱 개발자에게 달려 있습니다. Windows 8.1 앱과의 API 및 앱 호환성을 유지하려면 카메라 드라이버가 KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL 컨트롤을 구현해서는 안됩니다.

정수 ISO

KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED 속성 ID는 정수 ISO DDI와 연결된 유일한 컨트롤입니다.

고급 포커스

KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE 속성 ID는 정수 ISO DDI와 연결된 유일한 컨트롤입니다.

깜박임

KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE 속성 ID는 플래시 DDI와 연결된 유일한 컨트롤입니다.

Zoom

KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM 속성 ID는 확대/축소 DDI와 연결된 유일한 컨트롤입니다.

장면 모드

KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE 속성 ID는 장면 모드 DDI와 연결된 유일한 컨트롤입니다.