Метод CBaseInputPin.Receive

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

Метод Receive получает следующий пример мультимедиа в потоке. Этот метод реализует метод IMemInputPin::Receive .

Синтаксис

HRESULT Receive(
   IMediaSample *pSample
);

Параметры

pSample

Указатель на интерфейс IMediaSample примера.

Возвращаемое значение

Возвращает значение HRESULT . Возможные значения включают значения, перечисленные в следующей таблице.

Код возврата Описание
S_OK
Успешно.
S_FALSE
В настоящее время закрепления выполняется очистка; пример был отклонен.
E_POINTER
Аргумент указателя NULL.
VFW_E_INVALIDMEDIATYPE
Недопустимый тип носителя.
VFW_E_RUNTIME_ERROR
Произошла ошибка во время выполнения.
VFW_E_WRONG_STATE
Закрепление остановлено.

Комментарии

Выходной пин-код вышестоящий вызывает этот метод для доставки примера во входной контакт. Входной контакт должен выполнять одно из следующих действий:

  • Обработайте пример перед возвратом.
  • Возврат и обработка примера в рабочем потоке.
  • Отклоните пример.

Если контакт использует рабочий поток для обработки примера, добавьте в пример счетчик ссылок внутри этого метода. После возврата метода вышестоящий пин-код освобождает образец. Когда количество ссылок примера достигает нуля, образец возвращается в распределитель для повторного использования.

Этот метод является синхронным и может блокироваться. Если метод может блокировать, метод CBaseInputPin::ReceiveCanBlock должен возвращать S_OK.

В базовом классе этот метод выполняет следующие действия:

  1. Вызывает метод CBaseInputPin::CheckStreaming , чтобы убедиться, что контакт может обрабатывать примеры. Если это не удается, например, если закрепление остановлено, метод завершается ошибкой.
  2. Извлекает пример свойств и проверяет, изменился ли формат (см. ниже).
  3. Если формат изменился, метод вызывает метод CBasePin::CheckMediaType , чтобы определить, приемлем ли новый формат.
  4. Если новый формат недопустим, метод вызывает метод CBasePin::EndOfStream , публикует событие EC_ERRORABORT и возвращает код ошибки.
  5. Если ошибок не было, метод возвращает S_OK.

Проверьте изменение формата следующим образом:

  • Если пример поддерживает интерфейс IMediaSample2, проверка элемент dwSampleFlags структуры AM_SAMPLE2_PROPERTIES. Если флаг AM_SAMPLE_TYPECHANGED присутствует, формат изменился.
  • В противном случае, если пример не поддерживает IMediaSample2, вызовите метод IMediaSample::GetMediaType . Если метод возвращает значение, отличное от NULL , формат изменился.

В базовом классе этот метод не обрабатывает образец. Производный класс должен переопределить этот метод для выполнения обработки. (Что это влечет за собой, полностью зависит от фильтра.) Производный класс должен вызывать метод базового класса, чтобы проверка ошибок, описанных выше.

Требования

Требование Значение
Заголовок
Amfilter.h (включая Streams.h)
Библиотека
Strmbase.lib (розничные сборки);
Strmbasd.lib (отладочные сборки)

См. также раздел

Класс CBaseInputPin