Сведения о MFT

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

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

MFT — это эволюция модели преобразования, впервые появилась с объектами мультимедиа (DMOS) DirectX. На самом деле создать преобразование, поддерживающее обе модели, относительно легко. По сравнению с МДО необходимое поведение MFT более четко указано, что упрощает написание правильной реализации. Кроме того, MFT могут поддерживать аппаратное ускорение обработки видео.

В этом разделе приводится краткий обзор модели обработки 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