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


Сведения о MFTs

Преобразования Media Foundation (MFTs) предоставляют универсальную модель обработки данных мультимедиа. MFT используются для декодирования, кодировщиков и процессоров цифровых сигналов (DSPs). Короче говоря, всё, что находится в мультимедийном конвейере между источником мультимедиа и приемником мультимедиа, является MFT.

Для большинства приложений сведения об обработке данных MFT скрыты более высоким уровнем архитектуры Media Foundation. Многие приложения Microsoft Media Foundation никогда не будут напрямую обращаться к MFT. Однако, безусловно, можно разместить MFT непосредственно в приложении.

MFTs — это эволюция модели преобразования, впервые представленной с DirectX Media Objects (DMOs). На самом деле, довольно легко создать преобразование, которое поддерживает обе модели. По сравнению с DMO, необходимые действия для MFT более четко указаны, что упрощает создание правильной реализации. Кроме того, MFTs может поддерживать аппаратно-ускоренную обработку видео.

В этом разделе представлен краткий обзор модели обработки MFT, ориентированной на общую структуру, а не на конкретные вызовы методов. Более подробное пошаговое описание см. в разделе Базовая модель обработки MFT.

Потоки

MFT имеет входные потоки и выходные потоки. Входные потоки получают данные, а выходные потоки создают данные. Например, декодатор имеет один входной поток, который получает закодированные данные и один выходной поток, который создает декодированные данные.

Потоки на MFT не представлены в виде отдельных COM-объектов. Вместо этого каждый поток имеет указанный идентификатор потока, а методы в интерфейсе IMFTransform принимают идентификаторы потока в качестве входных параметров.

Некоторые MFT имеют фиксированное количество потоков. Например, декодеры и кодировщики обычно имеют ровно один входной и один выход. Другие MFT имеют динамическое количество потоков. Если MFT поддерживает динамические потоки, клиент может добавить новые входные потоки. Клиент не может добавлять выходные потоки, но MFT может добавлять или удалять выходные потоки во время обработки. Например, мультиплексоры обычно позволяют клиенту добавлять входные потоки и иметь один выход для мультиплексированного потока. Демультиплексеры являются обратными, с одним входным вводом, но динамическим числом выходных потоков в зависимости от содержимого входного потока. На следующем рисунке показана разница между мультиплексером и демультиплексером.

диаграмма, показывающая кодировщик/декодатор (1 вход, 1 выходные данные), мультиплексер (2 входных, 1 выходных данных) и демультиплексер (1 входные, 2 выходные данные)

Типы носителей

При первом создании MFT ни один из потоков не имеет установленного формата. Прежде чем MFT может обрабатывать данные, клиент должен задать форматы потоков. Например, с декодатором входной формат — это формат сжатия, используемый в исходном исходном файле, а выходной формат — несжатый формат, например звук PCM или RGB-видео. Форматы потоков определяются типами мультимедиа .

В зависимости от внутреннего состояния MFT он может предоставить список возможных типов мультимедиа для каждого потока. Этот список можно использовать в качестве указания при настройке типов носителей. Установка типа носителя в одном потоке может изменить список возможных типов для другого потока. Например, декодатор обычно не может предоставлять какие-либо типы выходных данных, пока клиент не задает тип входных данных. Тип входных данных содержит сведения, необходимые декодировщику для возврата списка возможных типов выходных данных.

Чтобы задать тип носителя в потоке, вызовите IMFTransform::SetInputType или IMFTransform::SetOutputType. Чтобы получить список возможных типов мультимедиа для потока, вызовите IMFTransform::GetInputAvailableType или IMFTransform::GetOutputAvailableType.

Обработка данных

После того как клиент задает типы носителей в потоках, MFT готов к обработке данных. Чтобы сделать это, клиент чередуется между предоставлением входных данных MFT и получением выходных данных из MFT:

Метод ProcessInput принимает указатель на образец мультимедиа, выделенный клиентом. Пример носителя содержит один или несколько буферов, а каждый буфер содержит входные данные для обработки MFT.

Метод ProcessOutput поддерживает две разные модели распределения: MFT выделяет выходные буферы или клиент выделяет выходные буферы. Некоторые MFT поддерживают обе модели выделения, но поддержка обеих моделей не является обязательной для MFT. Например, MFT может потребовать, чтобы клиент выделил выходные буферы. Метод IMFTransform::GetOutputStreamInfo возвращает сведения о выходном потоке, включая модель распределения, которую поддерживает MFT.

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

  • MFT требует больше входных данных. В этом состоянии MFT не может производить выходные данные, пока клиент не вызывает ProcessInput по крайней мере один раз.
  • MFT не будет принимать больше входных данных, пока клиент не вызовет ProcessOutput по крайней мере один раз.

Например, предположим, что вы используете декодировщик видео для декодирования видеопотока, содержащего сочетание ключевых кадров и разностных кадров. Изначально MFT требует некоторых входных данных, прежде чем он сможет декодировать любые кадры. Клиент вызывает ProcessInput для доставки первого кадра. Предположим, что первый кадр является разностным кадром (показан на следующей схеме как "P" для прогнозируемого кадра). Декодатор держится на этом кадре, но он не может производить какие-либо выходные данные, пока не получит следующий ключевой кадр.

диаграмма, показывающая, что mft требует входных данных и указывает на прогнозируемый кадр

Клиент продолжает вызывать ProcessInput и в конечном итоге достигает следующего ключевого кадра (показан на следующей схеме как "I" для внутрикодированного кадра). Теперь декодировщик имеет достаточно кадров, чтобы начать декодирование. На этом этапе он перестает принимать входные данные, и клиент должен вызвать ProcessOutput, чтобы получить декодированные кадры.

диаграмма, показывающая mft, которая не принимает входные данные, и указывает на один внутрикадровый закодированный кадр и три прогнозируемых кадра

Самый простой подход для клиента — это просто чередовать вызовы ProcessInput и ProcessOutput. Более сложный алгоритм описан в разделе базовая модель обработки MFT.

преобразования Media Foundation