Класс 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::ChangeOutputFormat
- CDynamicOutputPin::ChangeMediaType
- CDynamicOutputPin::D ynamicReconnect
- CBaseOutputPin::D eliver
- CBaseOutputPin::D eliverEndOfStream
- CBaseOutputPin::D eliverNewSegment
- IMemInputPin::Receive
- IMemInputPin::ReceiveMultiple
- IPin::EndOfStream
- IPin::NewSegment
Затем он должен вызвать метод 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 | Описание |
Блокировать | Блокирует или разблокирует поток данных из закрепления. |
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|