Согласование типов мультимедиа

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Когда диспетчер графа фильтров вызывает метод IPin::Connect , он имеет несколько параметров для указания типа носителя:

  • Полный тип: Если тип носителя указан полностью, контакты пытаются подключиться к нему. Если они не могут, попытка подключения завершается сбоем.
  • Частичный тип носителя: Тип мультимедиа является частичным , если основной тип, подтип или тип формата GUID_NULL. Значение GUID_NULL действует как "подстановочный знак", указывающий, что любое значение приемлемо. Контакты согласовывают тип, соответствующий разделяемму типу.
  • Нет типа носителя: Если диспетчер графа фильтров передает указатель NULL , контакты могут согласиться с любым типом мультимедиа, приемлемым для обоих контактов.

Если контакты подключаются, соединение всегда имеет полный тип носителя. Тип мультимедиа, заданный диспетчером фильтров Graph, заключается в ограничении возможных типов соединений.

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

Выбор типов мультимедиа в выводе зависит от реализации. В базовых классах DirectShow выходной контакт вызывает IPin::EnumMediaTypes для входного закрепления. Этот метод возвращает перечислитель, который перечисляет предпочтительные типы мультимедиа входных контактов. В противном случае выходной контакт перечисляет собственные предпочтительные типы.

Работа с типами мультимедиа

В любой функции, которая получает параметр AM_MEDIA_TYPE , всегда проверяйте значения cbFormat и formattype перед разыменованием элемента pbFormat . Следующий код неверен:

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

Следующий код является правильным:

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}