Обработка изменений потока
В этом разделе описывается, как преобразование Media Foundation (MFT) должно обрабатывать изменения формата во время потоковой передачи.
Важно!
Этот раздел не относится к кодировщикам. Кодировщики не должны распространять изменения формата, как описано в этом разделе. Кодировщики должны принимать только тип входных данных, соответствующий текущему настроенному типу вывода.
Общие сведения об изменениях формата
Как правило, существует две причины, по которым формат может измениться во время потоковой передачи.
- Клиент может переключиться на поток с новым форматом. Например, в цифровом телевидении это может произойти из-за изменения канала.
- В некоторых форматах видео, таких как H.264, битовый поток может сигнализировать об изменении формата. Такие изменения могут включать изменения в доминировании полей, разрешении видео или пропорции пикселей.
Если тип кодирования изменяется, клиенту может потребоваться удалить MFT из конвейера и заменить его другим MFT. (Например, клиенту может потребоваться переключиться в новый декодер.) Этот раздел не охватывает эту ситуацию. В этом разделе рассматривается только тот случай, когда текущий MFT может обрабатывать новый формат.
Если формат изменяется, MFT может потребовать нового типа ввода, нового типа вывода или обоих.
- Изменения входного типа инициируются клиентом. MFT никогда не изменяет свой собственный тип ввода.
- Изменения типа вывода инициируются MFT. MFT сигнализирует о том, что он требует нового выходного типа, и клиент согласовывает новый тип вывода с MFT.
Таким образом, возможны три отдельных случая:
- Клиент задает новый тип ввода. MFT использует новый формат без изменения выходного типа.
- Клиент задает новый тип входных данных, и это активирует изменение выходного типа.
- Тип входных данных не изменяется, но MFT обнаруживает изменение формата в битовом потоке, для которого требуется новый тип вывода.
Реализация изменений формата
В оставшейся части этого раздела описывается, как клиент должен обработать изменение формата и как реализовать изменения формата в MFT.
Тип выходных данных
Любой MFT может инициировать изменение типа выходных данных следующим образом:
- Клиент вызывает IMFTransform::P rocessOutput. MFT отвечает следующим образом:
- MFT не создает выходной пример в ProcessOutput.
- MFT задает флаг MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE в элементе dwStatus структуры MFT_OUTPUT_DATA_BUFFER .
- Метод ProcessOutput возвращает код ошибки MF_E_TRANSFORM_STREAM_CHANGE.
- Клиент вызывает IMFTransform::GetOutputAvailableType. Этот метод возвращает обновленный набор типов выходных данных.
- Клиент вызывает SetOutputType , чтобы задать новый тип вывода.
- Клиент возобновляет вызов ProcessInputProcessOutput/.
Тип входных данных
Изменения входного типа инициируются клиентом, никогда не MFT. Если тип входных данных изменяется, он может активировать изменение выходного типа.
Точную последовательность событий зависит от значения атрибута MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE .
Значение | Описание |
---|---|
FALSE | Прежде чем клиент задает новый тип ввода, он должен очистить MFT. |
TRUE | Клиент может задать новый тип ввода без очистки MFT. |
MFT предоставляет этот атрибут с помощью метода IMFTransform::GetAttributes . Значение по умолчанию этого атрибута — FALSE; Если MFT не задает атрибут, обработайте значение как FALSE.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE — FALSE
- Клиент отправляет сообщение MFT_MESSAGE_COMMAND_DRAIN .
- Клиент очищает MFT путем вызова IMFTransform::P rocessOutput до тех пор, пока ProcessOutput не вернет MF_E_TRANSFORM_NEED_MORE_INPUT.
- Клиент вызывает IMFTransform::SetInputType , чтобы задать новый тип входных данных.
- MFT проверяет тип входных данных. Если тип недопустим, SetInputType возвращает MF_E_INVALIDMEDIATYPE или другой код ошибки. В противном случае SetInputType возвращает S_OK.
- Если входной тип является допустимым, MFT оценивает, изменяется ли тип выходных данных. Если нет, потоковая передача продолжается и дальнейшие действия не требуются.
- Если тип выходных данных изменяется:
- MFT делает недействительным текущий тип выходного носителя и обновляет список доступных типов выходных носителей.
- Следующий вызов ProcessOutput возвращает MF_E_TRANSFORM_STREAM_CHANGE, как описано в предыдущем разделе.
- Клиент вызывает IMFTransform::GetOutputAvailableType , чтобы получить обновленный список типов выходных данных.
- Клиент вызывает SetOutputType.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE имеет значение TRUE
- Клиент вызывает IMFTransform::SetInputType , чтобы задать новый тип входных данных.
- MFT проверяет тип входных данных. Если тип недопустим, SetInputType возвращает MF_E_INVALIDMEDIATYPE или другой код ошибки. В противном случае SetInputType возвращает S_OK.
- Если входной тип является допустимым, MFT оценивает, изменяется ли тип выходных данных. Если нет, потоковая передача продолжается и дальнейшие действия не требуются.
- Перед изменением типа выходных данных MFT должен обрабатывать все кэшированные входные образцы следующим образом:
- MFT не делает недействительным текущий тип выходных данных.
- MFT создает столько выходных данных, сколько это может быть из кэшированных входных образцов.
- Необязательно, принимает ли MFT новые входные образцы во время обработки кэшированных образцов. В этом случае новые образцы ввода будут использовать новый формат ввода, поэтому MFT должен отслеживать точку при изменении формата.
- После обработки MFT всех образцов, полученных до изменения входного типа, функция IMFTransform::P rocessOutput возвращает MF_E_TRANSFORM_STREAM_CHANGE.
- MFT делает недействительным текущий тип выходных данных и обновляет список доступных типов выходных носителей.
- Клиент согласовывает новый тип вывода, как описано выше.
Асинхронные MFT должны возвращать значение TRUE для атрибута MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE . При использовании асинхронного MFT клиент может предположить, что атрибут MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE имеет значение TRUE.
Если MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE имеет значение TRUE, основное различие заключается в том, что клиенту не требуется очищать MFT перед установкой нового типа входных данных. В результате входной тип может измениться, пока MFT удерживает входные образцы. Важно, чтобы MFT не просто сбрасывал эти образцы. Кроме того, тип выходных данных не может изменяться, пока MFT не обрабатывает все кэшированные данные.
Предыдущий абзац особенно применяется к декодерам видео, которые могут получать межкодированные кадры из темпорального порядка и, следовательно, необходимо кэшировать их. Если MFT не кэширует входные образцы, очистка по сути не выполняется. В этом случае MFT может задать для MFT_SUPPORT_DYNAMIC_FORMAT_CHANGEзначение FALSE (или оставить атрибут неустановленным).
Кроме того, обратите внимание, что каждый MFT должен правильно обрабатывать изменения формата после очистки. Атрибут MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE указывает, поддерживает ли MFT изменения формата без очистки.
Изменение в режиме чередовки
Изменения в режиме чередовки видео являются особым случаем, так как они не делают недействительными текущий тип носителя. Вместо этого для каждого кадра видео задается режим чередовки, задав атрибуты в образце мультимедиа. Видео MFT должен проверять каждый входной пример на наличие этих флагов.
Режим чередовки может измениться, когда доминирование поля переключается с верхнего поля на нижнее или когда видео переключается между прогрессивными и чередуются изображениями.
Дополнительные сведения см. в разделе "Переплетные флаги" в примерах.
Связанные темы