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


Типы носителей 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, соответствующих определенному формату. Сведения в реестре не должны быть исчерпывающими. Как правило, вы включаете только main типы, поддерживаемые DMO. Запись реестра содержит отдельные разделы для типов входных и выходных данных, но не отличается между отдельными потоками.

Функция DMORegister использует структуру DMO_PARTIAL_MEDIATYPE для описания типов мультимедиа. Эта структура содержит подмножество сведений, найденных в структуре DMO_MEDIA_TYPE , а именно основной тип и подтип. Он не включает блок форматирования, так как блок форматирования обычно содержит сведения, которые слишком детализированные, чтобы включить в реестр, например высоту и ширину видеоинима.

Предпочитаемые типы мультимедиа

После создания DMO приложение может запрашивать в DMO поддерживаемые типы мультимедиа. Для каждого потока DMO создает список типов мультимедиа (возможно, пустых), ранжированных в порядке предпочтения. Методы IMediaObject::GetInputType и IMediaObject::GetOutputType перечисляют предпочтительные типы. Предпочтительные типы потока могут динамически изменяться, когда приложение задает типы мультимедиа в других потоках. Например, список предпочтительных типов выходных данных может измениться после установки входного типа или наоборот. Однако DMO не требуется динамически обновлять предпочитаемые типы. Приложение не может предполагать, что каждый получаемый тип является допустимым. По этой причине методы IMediaObject::SetInputType и IMediaObject::SetOutputType поддерживают флаг для тестирования определенного типа.

Методы 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