Метод CBaseStreamControl.CheckStreamState
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Метод CheckStreamState
определяет, следует ли доставить или удалить образец носителя.
Синтаксис
enum CheckStreamState(
IMediaSample *pSample
);
Параметры
-
pSample
-
Указатель на интерфейс IMediaSample примера.
Возвращаемое значение
Возвращает одно из следующих значений.
Код возврата | Описание |
---|---|
|
Отмена этого примера. |
|
Доставьте этот пример. |
Комментарии
Вызовите этот метод, когда пин-код получает пример. Доставляйте пример, только если возвращаемое значение равно STREAM_FLOWING. Если возвращаемое значение STREAM_DISCARDING, удалите пример.
Если закрепление удаляет какие-либо образцы, он должен пометить следующий пример, который он предоставляет, как разрыв, вызвав метод IMediaSample::SetDiscontinuity .
Если фильтр реализует интерфейс IAMDroppedFrames для подсчета количества кадров, которые он удаляет, не следует считать удаленный кадр как удаленный кадр.
Если возвращаемое значение STREAM_DISCARDING, метод блокируется до тех пор, пока эталонное время не достигнет времени начала примера. Это предотвращает слишком быстрое удаление примеров. Если фильтр приостановлен, время ожидания будет бесконечным, пока фильтр не запустит, не остановит или не сбросит данные. (Изменение состояния фильтра и потоковая передача происходят в отдельных потоках, поэтому это не приводит к взаимоблокировке.)
Перечисление CBaseStreamControl::StreamControlState определяется следующим образом:
enum StreamControlState{
STREAM_FLOWING = 0x1000,
STREAM_DISCARDING
};
Примеры
В следующем примере предполагается, что контакт использует переменную-член с именем m_fLastSampleDiscarded для отслеживания несоответствий.
CMyPin::Receive(IMediaSample *pSample)
{
if (!pSample) return E_POINTER;
int iStreamState = CheckStreamState(pSample);
if (iStreamState == STREAM_FLOWING)
{
if (m_fLastSampleDiscarded)
pSample->SetDiscontinuity(TRUE);
m_fLastSampleDiscarded = FALSE;
/* Deliver the sample. */
}
else
{
m_fLastSampleDiscarded = TRUE;
// Discard this sample. Do not deliver it.
}
}
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|