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


Переговоры типов носителей

[Функция, связанная с этой страницей, 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 и форматирования перед отменой ссылки на элемент 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.
}