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