Типы носителей DMO
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Тип носителя описывает формат, связанный с потоком данных мультимедиа. В этой статье описывается, как dmOS обрабатывают типы носителей. Он предназначен в первую очередь для разработчиков, которые пишут собственные пользовательские динамические объекты интеллектуального анализа данных.
Типы носителей определяются с помощью структуры DMO_MEDIA_TYPE. Эта структура содержит следующие сведения:
- основной тип является глобально уникальным идентификатором (GUID), который определяет широкую категорию, например аудио или видео.
- подтипа — это GUID, определяющий более конкретные аспекты типа. Например, в видео подтипы включают 16-разрядную RGB, 24-разрядную RGB, UYVY, видео в кодировке DV и т. д.
- Блок формата — это вторичная структура, которая полностью задает формат. Макет блока форматирования зависит от типа данных. Например, звук PCM использует структуру WAVEFORMATEX. Видео использует различные другие структуры, включая VIDEOINFOHEADER и VIDEOINFOHEADER2. Макет блока форматирования определяется идентификатором GUID типа формата. Например, FORMAT_WaveFormatEx указывает структуру WAVEFORMATEX.
При первом создании DMO потоки не имеют типа носителя. Прежде чем DMO может обрабатывать любые данные, клиент должен задать тип носителя для каждого потока. Этот процесс описывается с точки зрения клиента в настройке типов носителей вDMO.
Типы носителей в реестре
DMO может добавить список типов носителей, поддерживаемых в реестре, вызвав функцию DMORegister. Приложение может использовать эти сведения для поиска dmos, которые соответствуют определенному формату. Информация в реестре не должна быть всеобъемлющей. Как правило, можно включить только основные типы, поддерживаемые DMO. Запись реестра имеет отдельные ключи для входных и выходных типов, но не отличается от отдельных потоков.
Функция DMORegister использует структуру DMO_PARTIAL_MEDIATYPE для описания типов носителей. Эта структура содержит подмножество сведений, найденных в структуре DMO_MEDIA_TYPE, а именно основной тип и подтип. Он не включает блок формата, так как блок форматирования обычно содержит сведения, которые слишком детализированные, чтобы включить в реестр, например высоту и ширину изображения видео.
предпочитаемые типы носителей
После создания DMO приложение может запросить DMO для поддерживаемых типов носителей. Для каждого потока DMO создает список типов носителей (возможно, пустых), ранжированных по порядку предпочтений. Методы IMediaObject::GetInputType и IMediaObject::GetOutputType перечисляют предпочтительные типы. Предпочтительные типы потока могут динамически изменяться, когда приложение задает типы носителей в других потоках. Например, список предпочтительных типов выходных данных может измениться после установки входного типа или наоборот. Однако DMO не требуется для динамического обновления предпочитаемых типов. Приложение не может предположить, что каждый тип, который он получает, является допустимым. По этой причине методы IMediaObject::SetInputType и IMediaObject::SetOutputType поддерживают флаг для тестирования определенного типа.
Методы GetInputType GetInputType и GetOutputType возвращают структуру DMO_MEDIA_TYPE. DMO может оставить некоторые сведения в этой структуре пустыми, чтобы указать диапазон типов. Основной тип или подтип может быть GUID_NULL, а блок форматирования может быть пустым (ноль байтов). Если блок формата пуст, тип формата должен быть GUID_NULL.
После того как приложение задает все входные типы DMO, DMO обычно должен возвращать по крайней мере один полный тип для каждого выходного потока. Полный тип выходных данных упрощает тестирование, и приложения могут использовать его в качестве разумного по умолчанию. Тестовое приложение DMO зависит от этого поведения. (См. использование приложения DMOTest.)
настройка типов носителей
Приложения используют методы SetInputType и SetOutputType для тестирования, задания или очистки типов в указанном потоке. Приложение должно полностью указать тип. DMO проверяет, может ли он принять предлагаемый тип. Ответ может зависеть от типов, заданных в других потоках. Флаг DMO_SET_TYPEF_CLEAR очищает тип потока, поэтому приложение может "вернуться" и попробовать другое сочетание.
примеры сценариев
В следующих примерах описываются некоторые типичные сценарии, иллюстрирующие точки, сделанные в предыдущих разделах.
- Декодеры видео. В типичном декодировщике видео тип входных данных частично определяет тип вывода. Например, как правило, оба потока должны иметь одинаковые частоту кадров и размеры изображений. Одним из вариантов является не определение предпочитаемых типов выходных данных, пока не будет задан тип ввода. Другим вариантом является перечисление набора неполных типов, опустив блок форматирования. Используйте подтип, чтобы указать поддерживаемые несжатые типы, такие как 16-разрядная RGB, 24-разрядная RGB и т. д. Кроме того, декодеры видео обычно не поддерживают настройку выходного типа перед входным типом. Обычный сценарий заключается в декодировании из известного входного формата, поэтому это ограничение разумно.
- Декодеры звука. Декодирования звука может поддерживать ограниченный фиксированный набор форматов вывода. В этом случае можно создать список предпочтительных выходных форматов до известного входного формата.
- Компрессоры. В большинстве случаев видеокомпрессор не может полностью указать предпочитаемые форматы выходных данных, пока приложение не устанавливает входной формат, и наоборот. Вместо этого DMO должен возвращать неполный тип без блока формата. Для сжатия звука и видео приложение обычно должно задать различные выходные параметры, такие как скорость передачи данных. Тем не менее, после установки входного типа, компрессор должен возвращать по крайней мере один полный выходной тип, по причинам, упомянутым ранее.
Связанные разделы
-
написание DMO