Базовые видео понятия
Базовое Видео является новой моделью для обработки цифрового видео в OS X. Это обеспечивает две основных функции для упрощения обработки видеоданных:
Стандартная модель буферизации, упрощающая переключаться между несжатыми видеокадрами (такой как от QuickTime) и OpenGL.
Решение для синхронизации дисплея.
В этой главе описываются понятия позади этих функций.
Базовый видео конвейер
Базовое Видео принимает конвейер дискретных шагов при обработке видео от входящих данных фильма до фактических видеокадров, выведенных на экран на экране. Этот конвейер делает намного проще добавить пользовательскую обработку.
Данные кадра фильма прибывают из Вашего источника видеосигнала (QuickTime, например) и присваиваются визуальному контексту. Визуальный контекст просто указывает место назначения получения, в котором Вы хотите представить свое видео. Например, этот контекст может быть Базовым Графическим контекстом или контекстом OpenGL. В большинстве случаев визуальный контекст связан с целью в окне, но возможно иметь внеэкранные контексты также.
После указания контекста получения Вы свободны управлять кадром, как Вы желаете. Например, можно обработать кадр с помощью Базовых фильтров Изображения или указать деформирующиеся эффекты в OpenGL. После выполнения так, Вы вручаете от кадра OpenGL, тогда выполняющему Ваши инструкции рендеринга (если таковые имеются) и передающему завершенный кадр к дисплею.
В Базовом Видео конвейере самые важные фасеты для разработчиков являются ссылкой дисплея, обрабатывающей синхронизацию дисплея и общую модель буферизации, упрощающую управление памятью при перемещении кадров между различными буферными типами. Большинство приложений, управляющих видео, должно использовать только ссылку дисплея. Необходимо волноваться об использовании Базовых Видео буферов, только если Вы генерируете (или сжимаетесь), видеокадры.
Ссылка дисплея
Для упрощения синхронизации видео с частотой обновления дисплея Базовое Видео обеспечивает, специальный таймер вызвал ссылку дисплея. Ссылка дисплея работает как отдельный высокоприоритетный поток, не затронутый взаимодействиями в Вашем порядке подачи заявки.
Если у Вас также было аудио, в прошлом синхронизация Ваших видеокадров с частотой обновления дисплея часто была проблемой, особенно. Вы могли только высказать простые предположения для того, когда вывести кадр (при помощи таймера, например), который не принимал во внимание возможную задержку от взаимодействия с пользователем, загрузки CPU, окно, составляющее композит и т.д. Базовая ссылка Видеодисплея может сделать интеллектуальные оценки для того, когда кадр должен быть выведен, на основе типа дисплея и задержек.
Рисунок 1-2 показывает, как ссылка дисплея взаимодействует с Вашим приложением при обработке видеокадров.
Ссылка дисплея периодически вызывает Ваш обратный вызов, запрашивая кадры.
Ваш обратный вызов должен тогда получить кадр в течение требуемого времени. Вы получаете этот кадр как текстуру OpenGL. (Этот пример предполагает, что Ваши кадры прибывают из QuickTime, но можно использовать любой источник видеосигнала, который может обеспечить кадровые буферы.)
Можно теперь использовать любые запросы OpenGL к текстуре для управления им.
Если по некоторым причинам обработка занимает больше времени, чем ожидаемый (т.е. оценка ссылки дисплея выключена), видео видеокарта может все еще отбросить кадры или иначе компенсировать ошибку синхронизации по мере необходимости.
Организация буферизации данных
Если Ваше приложение фактически генерирует кадры для дисплея или сжатия входящее необработанное видео, то необходимо будет сохранить данные изображения при выполнении так. Базовое Видео обеспечивает различные буферные типы для упрощения этого процесса.
Ранее, было много издержек, если Вы хотели, например, управляйте кадрами QuickTime с помощью OpenGL. Преобразование между различными буферными типами и обработка обслуживания внутренней памяти были тяжелой работой. Теперь, с Базовым Видео, буферы являются Базовыми Объектами стиля основы, которые просто создать и уничтожить, и простой преобразовать от одного буферного типа до другого.
Базовое Видео определяет абстрактный буфер типа CVBuffer. Все другие буферные типы получены из типа CVBuffer (и вводятся как таковые). CVBuffer может содержать видео, аудио, или возможно некоторый другой тип данных. Можно использовать APIs CVBuffer на любом Базовом Видео буфере.
Буфер изображения является абстрактным буфером, используемым в частности для хранения видеоизображений (или кадры). Пиксельные буферы и буферы OpenGL получены из буферов изображения.
Пиксель буферная память изображение в оперативной памяти.
Базовый буфер OpenGL Видео является оберткой вокруг стандартного буфера OpenGL (или pbuffer), который хранит изображение в видео (видеокарта) память.
Базовая текстура OpenGL Видео является оберткой вокруг стандартной текстуры OpenGL, которая является неизменным изображением, сохраненным в памяти видеокарты. Текстуры получены из пиксельного буфера или буфера OpenGL, содержащего фактические данные кадра. Текстура должна быть обернута на примитив (такой как прямоугольник или сфера), чтобы быть выведенной на экран.
При использовании буферов часто полезно управлять ими в пулах буферов. Пул буферов выделяет много буферов, которые могут тогда быть снова использованы по мере необходимости. Преимущество здесь состоит в том, что система не должна посвящать дополнительное время, выделяя и освобождая память; при выпуске буфера он возвращается в пул. У Вас могут быть пиксельные пулы буферов в оперативной памяти и пулы буферов OpenGL в видеопамяти.
Можно думать о пуле буферов как о маленьком парке автомобилей, купленных для корпоративного использования. Сотрудник просто берет машину от флота при необходимости и возвращает его, когда она сделана с ним. Выполнение так требует намного меньше наверху, чем покупка и продажа автомобиля каждого раза. Для максимизации ресурсов число автомобилей во флоте может быть скорректировано базируемое по требованию.
Подобным способом необходимо выделить текстуры OpenGL с помощью кэша текстуры, содержащего много текстур, которые могут быть снова использованы.
Рисунок 1-3 показывает возможную реализацию кадра, обрабатывающего, который происходит под капотом при обработке фильмов в формате QuickTime, показе использования многих буферов и пулов буферов для хранения видеоданных, в то время как это развивается от данных сжатого файла до появляющихся на экране изображений фактического пикселя.
Шаги в обработке кадра следующие:
QuickTime предоставляет поток видеоданных, который будет превращен в отдельные кадры.
Кадры распаковываются с помощью указанного кодека. Пиксельный пул буферов используется для содержания ключевых кадров, B кадры, и т.д., которые необходимы для рендеринга отдельных кадров.
Отдельные кадры сохранены, поскольку OpenGL текстурирует в видеопамяти. Дополнительная обработка изображений для кадра (такого как деинтерлейсинг) может быть сделана здесь с результатами, сохраненными в буфере OpenGL.
Когда Вы запрашиваете кадр от Базового Видео (в ответ на обратный вызов ссылки дисплея), содержимое буфера OpenGL преобразовывается в текстуру OpenGL, тогда врученную Вам.
Что находится в кадре?
Видеокадру часто связывали информацию с ним, который полезен для системы, выводящей на экран его. В Базовом Видео эта информация связана с видеокадром как присоединение. Присоединения являются Базовыми объектами Основы, представляющими различные типы данных, такие как следующие общие видео свойства:
Уберите апертуру и предпочтенную чистую апертуру. Обработка видеоданных (такая как фильтрация) часто производит артефакты в краях кадра. Чтобы избежать отображать такие артефакты, большинство видеоизображений содержит больше информации об экране, чем фактически выведено на экран, и просто обрежьте края. Предпочтительная чистая апертура является предложенной обрезкой, установленной, когда сжато видео. Чистая апертура является обрезкой, фактически использующейся при отображении.
Цветовое пространство. Цветовое пространство является моделью, используемой для представления изображения, такого как RGB или YCbCr. Вызывается «цветовым пространством», потому что большинство моделей использует несколько параметров, которые могут быть отображены на точке в пространстве. Например, цветовое пространство RGB использует три параметра, красные, зеленые, и синие, и каждая возможная комбинация трех карт к уникальной точке в трехмерном пространстве.
Квадрат по сравнению с прямоугольными пикселями. Цифровые видео на компьютерах обычно используют квадратные пиксели. Однако TV использует прямоугольные пиксели, таким образом, необходимо компенсировать это расхождение при создании видео для широковещательной передачи.
Гамма уровень. Гамма является “фактором выдумки”, раньше соответствовал вывод аппаратных средств дисплея к тому, что наши глаза ожидают видеть. Например, напряжение к отношению интенсивности цвета дисплея обычно нелинейно; удвоение «синего» напряжения сигнала не обязательно производит изображение, выглядящее «вдвое более синим». Гамма является экспонентой в кривой что лучшие соответствия ввод по сравнению с выходным ответом.
Метки времени. Когда определенный кадр появляется в фильме, обычно представленный как часы, минуты, секунды, и части, метка времени представляет. Размер дробной части зависит от timebase, который использует Ваш фильм. Метки времени упрощают изолировать определенные кадры фильма и упрощать синхронизацию многократных видеотреков и аудиотреков.
Вы указываете присоединения как пары ключ/значение. Если у Вас есть пользовательская информация о кадрах, можно или использовать предопределенные ключи, как описано в Базовой Ссылке на видеоролик, или определить собственное. Если Вы указываете, что присоединение может быть распространено, можно легко передать эти присоединения последовательным буферам, например, при создании текстуры OpenGL из пиксельного буфера.