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


Класс CDynamicOutputPin

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

Класс CDynamicOutputPin реализует выходной контакт, который поддерживает динамическое повторное подключение и изменение формата.

Этот класс является производным от класса CBaseOutputPin и реализует интерфейс IPinFlowControl . Он поддерживает несколько операций, важных для динамического построения графов:

  • Динамическое повторное подключение. Контакт может отключаться и повторно подключаться, пока фильтр все еще активен (приостановлен или работает).
  • Динамическое изменение формата. Контакт может согласовывать новый тип мультимедиа, пока фильтр все еще активен, без повторного подключения.
  • Управление потоком. Фильтр-владение (или приложение) может блокировать поток данных из контакта, не останавливая фильтр.

Дополнительные сведения см. в разделе Dynamic Graph Building.

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

Для координации между несколькими потоками фильтр-владельцев должен соответствовать определенным правилам. (Дополнительные сведения о потоках в графе фильтра см. в разделе Потоки и критические разделы.) Во-первых, поток потоковой передачи всегда должен вызывать метод CDynamicOutputPin::StartUsingOutputPin , прежде чем вызывать любой из следующих методов:

Затем он должен вызвать метод CDynamicOutputPin::StopUsingOutputPin .

Во-вторых, поток приложения не должен вызывать методы из предыдущего списка. В-третьих, поток потоковой передачи не должен вызывать методы класса, которые блокируют или разблокируют закрепление. Это следующие методы: CDynamicOutputPin::Block, CDynamicOutputPin::SynchronousBlockOutputPin, CDynamicOutputPin::AsynchronousBlockOutputPin и CDynamicOutputPin::UnblockOutputPin.

Эти правила гарантируют, что поток приложения не сможет заблокировать закрепление, пока поток потоковой передачи использует его, и наоборот. После вызова потока потоковой передачи StartUsingOutputPin закрепление не будет блокироваться, пока поток потоковой передачи не вызовет StopUsingOutputPin. И наоборот, если закрепление заблокировано, StartUsingOutputPin ожидает, пока закрепление не будет разблокировано.

Чтобы не забыть вызывать StopUsingOutputPin, можно использовать класс CAutoUsingOutputPin . Он вызывает StopUsingOutputPin автоматически при выходе из область.

Когда фильтр-владение соединяет или покидает граф фильтра (в методе IBaseFilter::JoinFilterGraph ), он должен вызвать метод CDynamicOutputPin::SetConfigInfo контакта.

Защищенные переменные-члены Описание
m_BlockStateLock Критический раздел, защищающий состояние блокировки.
m_hUnblockOutputPinEvent Событие, которое подается, если закрепление не заблокировано.
m_hNotifyCallerPinBlockedEvent Событие, которое подается, когда закрепление успешно блокируется или пользователь отменяет ожидающий блок.
m_BlockState Состояние блокировки.
m_dwBlockCallerThreadID Идентификатор потока, который последним вызывал метод IPinFlowControl::Block для этого контакта.
m_dwNumOutstandingOutputPinUsers Количество потоковой передачи, использующих этот контакт.
m_hStopEvent Событие, которое подается, когда фильтр останавливается или контакт сбрасывает данные.
m_pGraphConfig Указатель на интерфейс IGraphConfig для выполнения динамических повторных подключений.
m_bPinUsesReadOnlyAllocator Флаг, указывающий, доступны ли образцы из распределителя контактов только для чтения.
Защищенные методы Описание
SynchronousBlockOutputPin Блокирует закрепление; не возвращается, пока закрепление не будет заблокировано.
AsynchronousBlockOutputPin Блокирует закрепление; может вернуться, прежде чем закрепление будет заблокировано.
РазблокироватьOutputPin Разблокирует закрепление.
BlockOutputPin Блокирует закрепление.
WaitEvent Ожидает, пока не будет поймечено указанное событие.
Открытые методы Описание
CDynamicOutputPin Метод конструктора.
~CDynamicOutputPin Метод деструктора.
SetConfigInfo Указывает указатель IGraphConfig и событие остановки.
DeliverBeginFlush Запрашивает подключенный входной пин-код для начала операции очистки.
DeliverEndFlush Запрашивает подключенный входной пин-код для завершения операции очистки.
Неактивно Уведомляет контакт о том, что фильтр остановлен.
Активен Уведомляет контакт о том, что фильтр теперь активен.
CompleteConnect Завершает подключение к пин-коду ввода. Виртуальной.
StartUsingOutputPin Получает доступ к пин-коду для операции потоковой передачи. Виртуальной.
StopUsingOutputPin Освобождает доступ к пин-коду после операции потоковой передачи. Виртуальной.
StreamingThreadUsingOutputPin Определяет, выполняет ли какой-либо поток операцию потоковой передачи с закреплением. Виртуальной.
ChangeOutputFormat Динамически изменяет тип носителя для подключения и предоставляет сведения о новых сегментах.
ChangeMediaType Динамически изменяет тип носителя для подключения.
DynamicReconnect Выполняет динамическое повторное подключение с новым типом мультимедиа.
Методы IPin Описание
Отключение Нарушает текущее закрепление подключения.
Методы IPinFlowControl Описание
Блокировать Блокирует или разблокирует поток данных из закрепления.

Требования

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