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


Необязательные потоки

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

DMO может назначить некоторые из своих выходных потоков как необязательные. Необязательный поток создает данные, которые приложение может удалить полностью или на случайных примерах. Например, необязательный поток может содержать дополнительные сведения о первичном потоке.

Чтобы запросить, является ли поток необязательным, вызовите метод IMediaObject::GetOutputStreamInfo и проверка параметр pdwFlags. Необязательные потоки возвращают флаг DMO_OUTPUT_STREAMF_DISCARDABLE или флаг DMO_OUTPUT_STREAMF_OPTIONAL. Эти флаги означают почти одно и то же; одно незначительное различие между ними будет объяснено в ближайшее время.

Если поток является необязательным, клиент может указать DMO удалить данные из этого потока при обработке выходных данных. Для этого вызовите метод IMediaObject::P rocessOutput и присвойте выходному буферу значение NULL для каждого потока, который требуется отменить. (Выходной буфер указывается в элементе pBufferDMO_OUTPUT_DATA_BUFFER.) Также задайте флаг DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER в параметре dwFlags .

Для каждого потока, где указатель pBuffer имеет значение NULL, DMO попытается удалить данные. Если поток является необязательным, DMO гарантированно отменит данные. Если поток не является необязательным, DMO по возможности удаляет данные, но это не гарантируется. Если не удается удалить данные, устанавливается флаг DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE. Если для указателя pBuffer задано значение NULL , но флаг DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER не задан, DMO не отменяет данные. В этом случае DMO либо буферизует выходные данные внутри системы, либо просто завершает вызов ProcessOutput .

Единственное функциональное различие между флагом DMO_OUTPUT_STREAMF_OPTIONAL и флагом DMO_OUTPUT_STREAMF_DISCARDABLE состоит в следующем:

  • Флаг DMO_OUTPUT_STREAMF_OPTIONAL указывает, что клиенту не нужно задавать тип мультимедиа в этом потоке. Однако если клиент начинает обработку данных, не задавая тип мультимедиа для этого потока, он должен удалить данные из этого потока на весь период потоковой передачи. Если вы хотите выборочно удалять примеры, необходимо задать тип носителя.
  • Флаг DMO_OUTPUT_STREAMF_DISCARDABLE указывает, что, хотя поток является необязательным, ему всегда требуется тип мультимедиа.

Непосредственное размещение объектов DMO