Базовые видео понятия

Базовое Видео является новой моделью для обработки цифрового видео в OS X. Это обеспечивает две основных функции для упрощения обработки видеоданных:

В этой главе описываются понятия позади этих функций.

Базовый видео конвейер

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

Рисунок 1-1  Базовый Видео конвейер
The Core Video pipeline

Данные кадра фильма прибывают из Вашего источника видеосигнала (QuickTime, например) и присваиваются визуальному контексту. Визуальный контекст просто указывает место назначения получения, в котором Вы хотите представить свое видео. Например, этот контекст может быть Базовым Графическим контекстом или контекстом OpenGL. В большинстве случаев визуальный контекст связан с целью в окне, но возможно иметь внеэкранные контексты также.

После указания контекста получения Вы свободны управлять кадром, как Вы желаете. Например, можно обработать кадр с помощью Базовых фильтров Изображения или указать деформирующиеся эффекты в OpenGL. После выполнения так, Вы вручаете от кадра OpenGL, тогда выполняющему Ваши инструкции рендеринга (если таковые имеются) и передающему завершенный кадр к дисплею.

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

Ссылка дисплея

Для упрощения синхронизации видео с частотой обновления дисплея Базовое Видео обеспечивает, специальный таймер вызвал ссылку дисплея. Ссылка дисплея работает как отдельный высокоприоритетный поток, не затронутый взаимодействиями в Вашем порядке подачи заявки.

Если у Вас также было аудио, в прошлом синхронизация Ваших видеокадров с частотой обновления дисплея часто была проблемой, особенно. Вы могли только высказать простые предположения для того, когда вывести кадр (при помощи таймера, например), который не принимал во внимание возможную задержку от взаимодействия с пользователем, загрузки CPU, окно, составляющее композит и т.д. Базовая ссылка Видеодисплея может сделать интеллектуальные оценки для того, когда кадр должен быть выведен, на основе типа дисплея и задержек.

Рисунок 1-2 показывает, как ссылка дисплея взаимодействует с Вашим приложением при обработке видеокадров.

Рисунок 1-2  , Обрабатывающий видеокадры со ссылкой дисплея
Processing video frames with the display link

Если по некоторым причинам обработка занимает больше времени, чем ожидаемый (т.е. оценка ссылки дисплея выключена), видео видеокарта может все еще отбросить кадры или иначе компенсировать ошибку синхронизации по мере необходимости.

Организация буферизации данных

Если Ваше приложение фактически генерирует кадры для дисплея или сжатия входящее необработанное видео, то необходимо будет сохранить данные изображения при выполнении так. Базовое Видео обеспечивает различные буферные типы для упрощения этого процесса.

Ранее, было много издержек, если Вы хотели, например, управляйте кадрами QuickTime с помощью OpenGL. Преобразование между различными буферными типами и обработка обслуживания внутренней памяти были тяжелой работой. Теперь, с Базовым Видео, буферы являются Базовыми Объектами стиля основы, которые просто создать и уничтожить, и простой преобразовать от одного буферного типа до другого.

Базовое Видео определяет абстрактный буфер типа CVBuffer. Все другие буферные типы получены из типа CVBuffer (и вводятся как таковые). CVBuffer может содержать видео, аудио, или возможно некоторый другой тип данных. Можно использовать APIs CVBuffer на любом Базовом Видео буфере.

При использовании буферов часто полезно управлять ими в пулах буферов. Пул буферов выделяет много буферов, которые могут тогда быть снова использованы по мере необходимости. Преимущество здесь состоит в том, что система не должна посвящать дополнительное время, выделяя и освобождая память; при выпуске буфера он возвращается в пул. У Вас могут быть пиксельные пулы буферов в оперативной памяти и пулы буферов OpenGL в видеопамяти.

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

Подобным способом необходимо выделить текстуры OpenGL с помощью кэша текстуры, содержащего много текстур, которые могут быть снова использованы.

Рисунок 1-3 показывает возможную реализацию кадра, обрабатывающего, который происходит под капотом при обработке фильмов в формате QuickTime, показе использования многих буферов и пулов буферов для хранения видеоданных, в то время как это развивается от данных сжатого файла до появляющихся на экране изображений фактического пикселя.

  Распаковка рисунка 1-3 и обработка кадра QuickTime
Decompressing and processing a QuickTime frameDecompressing and processing a QuickTime frame

Шаги в обработке кадра следующие:

Что находится в кадре?

Видеокадру часто связывали информацию с ним, который полезен для системы, выводящей на экран его. В Базовом Видео эта информация связана с видеокадром как присоединение. Присоединения являются Базовыми объектами Основы, представляющими различные типы данных, такие как следующие общие видео свойства:

Вы указываете присоединения как пары ключ/значение. Если у Вас есть пользовательская информация о кадрах, можно или использовать предопределенные ключи, как описано в Базовой Ссылке на видеоролик, или определить собственное. Если Вы указываете, что присоединение может быть распространено, можно легко передать эти присоединения последовательным буферам, например, при создании текстуры OpenGL из пиксельного буфера.