Поделиться через


Расширенные элементы управления камерой

Расширенные элементы управления используют механизм KSPROPERTY для предоставления приложению элементов управления камерой.

В следующем списке стандартизованных расширенных элементов управления (определенных Media Foundation) можно включить дополнительные функции камеры Windows:

Некоторые элементы управления предоставляются приложениям как асинхронные элементы управления, а другие — как синхронные.

Синхронные элементы управления

Для этих элементов управления конвейер захвата выдает структуру управления камерой KSPROPERTY и ожидает, что драйвер синхронно вернет запрос.

Асинхронные элементы управления

Для этих элементов управления конвейер отслеживания выдает KSPROPERTY, включает KSEVENT , связанный с этим свойством, и ожидает передачи сигнала о событии. Драйвер должен выполнить KSPROPERTY синхронно и использовать его в качестве триггера для запуска асинхронной операции. После завершения асинхронной операции драйвер должен сообщить о связанном KSEVENT , на котором ожидается конвейер отслеживания. Конвейер отслеживания уведомляет приложение о завершении операции при получении сигнала.

Если асинхронный элемент управления можно отменить, он должен указать флаг KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION в элементе управления . Если элемент управления не может быть отменен, его операция не должна превышать 5 мс.

Эти расширенные элементы управления являются частью следующего набора свойств KS, определенного в ksmedia.h:

#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_METADATA , определенный в перечислении KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY , используется клиентом для запроса требований к буферу метаданных, таких как требуемый размер метаданных, требования к выравниванию памяти и требуемый тип выделения памяти для выделения буфера метаданных.

После того как компонент пользовательского режима получает требования к буферу метаданных от драйвера, он выделяет буфер метаданных соответствующего размера с требуемым выравниванием памяти из требуемого пула памяти. Этот буфер метаданных вместе с фактическим буфером кадров отправляется драйверу для выполнения, а затем возвращается обратно в компонент пользовательского режима при заполнении. В сценариях с несколькими кадрами выделяется соответствующий буфер метаданных, который доставляется драйверу камеры для каждого выделенного буфера кадров.

Структура 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. Элемент пользовательских метаданных может содержать большой двоичный объект метаданных, который может быть состоянием фокуса и (или) лицами, обнаруженными для контакта предварительного просмотра, EXIF и (или) метаданными OEM для пин-кода изображения. Точный формат пользовательского большого двоичного объекта определяется изготовителем оборудования, который реализует драйвер и MFT0. MFT0 отвечает за анализ пользовательского BLOB-объекта и присоединение каждого элемента метаданных в качестве атрибута, сгруппированного в контейнер атрибутов MFSampleExtension_CaptureMetadata в формате, доступном для чтения конвейером захвата MF и (или) WinRT.

Следующие атрибуты 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 создаются и присоединяются к MFSampleExtension_CaptureMetadata с помощью DevProxy, который содержит указатель на интерфейс 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 выполняет следующие действия:

  1. Вызывает Метод GetUnknownв MFSampleExtension_CaptureMetadata из интерфейса IMFSample, чтобы получить интерфейс IMFAttributes для контейнера атрибутов.

  2. Вызывает Метод GetUnknownMF_CAPTURE_METADATA_FRAME_RAWSTREAM из интерфейса IMFAttributes, полученного на предыдущем шаге, для получения интерфейса IMFMediaBuffer.

  3. Вызывает блокировку для получения буфера необработанных метаданных, связанного с IMFMediaBuffer.

Чтобы добавить необходимые атрибуты IMFAttributes в контейнер атрибутов MFSampleExtension_CaptureMetadata , MFT0 выполняет следующие действия:

  1. Вызывает Метод GetUnknownв MFSampleExtension_CaptureMetadata из интерфейса IMFSample, чтобы получить интерфейс IMFAttributes для контейнера атрибутов.

  2. Вызывает Методы SetUINT32, SetBlob или SetUnknown на MF_CAPTURE_METADATA_XXX из интерфейса IMFAttributes, полученного на предыдущем шаге, на основе GUID и типа данных, указанных в таблице выше.

Обязательные атрибуты метаданных

Полный список доступных атрибутов метаданных можно найти в разделе Атрибуты метаданных отслеживания статистики.

Приоритет фокусировки

Идентификатор свойства 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

Конвейеру не требуется обрабатывать или обрабатывать какие-либо данные EXIF для кодировщика HW JPEG; Поэтому формат данных EXIF предоставляется драйвером, кодировщиком MFT0 и OEM HW JPEG. Партнеры изготовителей оборудования могут определить любой настраиваемый GUID атрибута и тип варианта для атрибута EXIF и присоединить его к контейнеру атрибутов MFSampleExtension_CaptureMetaData , чтобы он использовался компонентами OEM. Если доступен кодировщик HW JPEG, компонент приемника фотографий конвейера загрузит кодировщик HW JPEG и установит данные EXIF, хранящиеся в контейнере атрибутов MFSampleExtension_CaptureMetaData , в кодировщик HW JPEG в качестве параметра кодировщика EXIF с помощью метода IPropertyBag2::Write .

Контейнер свойств параметра кодировщика содержит массив PROPBAG2 структур, указывающих доступные свойства параметра кодирования. Параметр кодировщика EXIF, заданный для кодировщика HW JPEG, определяется следующим свойством в контейнере свойств параметров кодировщика:

Имя свойства VARTYPE Значение Применимые кодеки
SampleMetaData VT_UNKNOWN Указатель на интерфейс IMFAttributes для MFSampleExtension_CaptureMetaData контейнера атрибутов, который содержит вложенный атрибут OEM, содержащий данные EXIF. JPEG

Контейнер атрибутов MFSampleExtension_CaptureMetaData может содержать только вложенный атрибут EXIF, определенный изготовителем оборудования, который кодировщик MFT0 и HW JPEG может считывать для хранения данных EXIF. Чтобы передать данные EXIF из драйвера в кодировщик HW JPEG, драйвер и MFT0 должны сделать следующее:

  1. Драйвер предоставляет пользовательские метаданные EXIF в буфере метаданных, предоставленном конвейером. Он присоединяется к MFSampleExtension_CaptureMetadata как MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute от DevProxy, когда образец возвращается обратно в DevProxy.

  2. Когда MFT0 получает imfSample, он получает буфер необработанных метаданных из MF_CAPTURE_METADATA_FRAME_RAWSTREAM , анализирует пользовательский элемент метаданных EXIF и преобразует его в определенный OEM IMFAttribute и присоединяет его к контейнеру атрибутов MFSampleExtension_CaptureMetadata .

Чтобы передать данные EXIF из MFT0 в кодировщик HW JPEG, приемник фотографий конвейера выполняет следующие действия:

  1. Вызывает Метод GetUnknownMFSampleExtension_CaptureMetadata из IMFSample, чтобы получить интерфейс IMFAttributes для контейнера атрибутов при получении IMFSample.

  2. Вызывает метод IPropertyBag2::Write , чтобы задать свойство параметра кодировщика, определенное SampleMetadata, кодировщику HW JPEG. Свойство параметра кодировщика содержит интерфейс IMFAttributes, полученный на предыдущем шаге. Этот интерфейс содержит все настраиваемые вложенные атрибуты, включая вложенный атрибут OEM EXIF и стандартизированные вложенные атрибуты в разделе Метаданные , описанном ранее в этом разделе.

Чтобы получить данные EXIF для дальнейшей обработки, кодировщик HW JPEG выполняет следующие действия:

  1. Вызывает метод IPropertyBag2::Read , чтобы получить значение свойства для свойства, определяемого именем свойства SampleMetadata и типом VT_UNKNOWN . При возврате variant.punkVal получает интерфейс IMFAttributes для MFSampleExtension_CaptureMetadata.

  2. Вызывает Методы GetBlob или GetUnknown для подапонафикации OEM EXIF из интерфейса, полученного на предыдущем шаге, чтобы получить большой двоичный объект данных EXIF на основе GUID и типа данных вложенного атрибута OEM EXIF.

Thumbnail

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 флэш-памяти.

Zoom

Идентификатор свойства KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM — это единственный элемент управления, связанный с DDI масштабирования.

Режим сцены

Идентификатор свойства KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE является единственным элементом управления, связанным с DDI в режиме сцены.