Контекстно-адаптивное двоичное арифметическое кодирование ( CABAC ) — это форма энтропийного кодирования, используемая в стандартах H.264/MPEG-4 AVC [1] [2] и High Efficiency Video Coding (HEVC). Это метод сжатия без потерь , хотя стандарты видеокодирования, в которых он используется, обычно предназначены для приложений сжатия с потерями . CABAC отличается тем, что обеспечивает гораздо лучшее сжатие, чем большинство других алгоритмов энтропийного кодирования, используемых в видеокодировании, и является одним из ключевых элементов, который обеспечивает схему кодирования H.264/AVC с лучшей способностью сжатия, чем ее предшественники. [3]
В H.264/MPEG-4 AVC CABAC поддерживается только в основном и более высоких профилях (но не в расширенном профиле) стандарта, поскольку для его декодирования требуется больший объем обработки, чем для более простой схемы, известной как контекстно-адаптивное кодирование переменной длины (CAVLC), которая используется в базовом профиле стандарта. CABAC также трудно распараллелить и векторизовать, поэтому другие формы параллелизма (например, параллелизм пространственной области) могут быть связаны с его использованием. В HEVC CABAC используется во всех профилях стандарта.
CABAC основан на арифметическом кодировании с несколькими нововведениями и изменениями, чтобы адаптировать его к требованиям стандартов кодирования видео: [4]
CABAC имеет несколько режимов вероятности для разных контекстов. Сначала он преобразует все недвоичные символы в двоичные. Затем для каждого бита кодер выбирает, какую модель вероятности использовать, затем использует информацию из соседних элементов для оптимизации оценки вероятности. Наконец, для сжатия данных применяется арифметическое кодирование .
Контекстное моделирование обеспечивает оценки условных вероятностей кодирующих символов. Используя подходящие контекстные модели, заданную межсимвольную избыточность можно использовать, переключаясь между различными моделями вероятности в соответствии с уже закодированными символами в окрестности текущего символа для кодирования. Контекстное моделирование отвечает за большую часть примерно 10% экономии битрейта CABAC по сравнению с методом энтропийного кодирования CAVLC .
Кодирование символа данных включает следующие этапы.
1. Бинаризуем значение MVDx, разницу векторов движения в направлении x .
Первый бит двоичного кодового слова — это бин 1; второй бит — это бин 2 и т. д.
2. Выберите контекстную модель для каждого бина. Для бина 1 выбирается одна из 3 моделей на основе ранее закодированных значений MVD. Рассчитывается норма L1 двух ранее закодированных значений, e k :
Если e k мало, то существует высокая вероятность того, что текущий MVD будет иметь малую величину; и наоборот, если e k велико, то более вероятно, что текущий MVD будет иметь большую величину. Мы выбираем таблицу вероятностей (контекстную модель) соответственно. Оставшиеся ячейки кодируются с использованием одной из 4 дополнительных контекстных моделей:
3. Кодировать каждый бин. Выбранная контекстная модель предоставляет две оценки вероятности: вероятность того, что бин содержит «1», и вероятность того, что бин содержит «0». Эти оценки определяют два поддиапазона, которые арифметический кодер использует для кодирования бина.
4. Обновите контекстные модели. Например, если для ячейки 1 была выбрана контекстная модель 2, а значение ячейки 1 было «0», то частота «0» увеличивается. Это означает, что в следующий раз, когда эта модель будет выбрана, вероятность «0» будет немного выше. Когда общее количество появлений модели превысит пороговое значение, частота «0» и «1» будет уменьшена, что фактически дает более высокий приоритет недавним наблюдениям.
Арифметический декодер довольно подробно описан в Стандарте. Он имеет три различных свойства:
Определение процесса декодирования разработано для облегчения реализации арифметического кодирования и декодирования с низкой сложностью. В целом, CABAC обеспечивает улучшенную эффективность кодирования по сравнению с кодированием на основе CAVLC за счет большей вычислительной сложности.
В 1986 году исследователи IBM Коттапурам М. А. Мохиуддин и Йорма Йоханнен Риссанен подали патент на алгоритм двоичного арифметического кодирования без умножения. [5] [6] В 1988 году исследовательская группа IBM, в которую входили Р. Б. Арпс, ТК Труонг, DJ Lu, WB Pennebaker, L. Mitchell и GG Langdon, представила алгоритм адаптивного двоичного арифметического кодирования (ABAC), названный Q-Coder. [7] [8]
Вышеуказанные патенты и исследовательские работы, наряду с несколькими другими от IBM и Mitsubishi Electric , позднее были процитированы CCITT и Joint Photographic Experts Group в качестве основы для адаптивного алгоритма двоичного арифметического кодирования формата сжатия изображений JPEG в 1992 году. [5] Однако кодеры и декодеры формата файлов JPEG, который имеет опции как для кодирования Хаффмана , так и для арифметического кодирования, обычно поддерживают только опцию кодирования Хаффмана, что изначально было связано с патентными проблемами, хотя патенты на арифметическое кодирование JPEG [9] с тех пор истекли из-за возраста стандарта JPEG. [10] Первое сообщение об использовании адаптивного двоичного арифметического кодирования при сжатии видео в движении было сделано в предложении исследователей IBM группе MPEG в 1989 году. [11] [12] Это предложение расширило использование арифметического кодирования с внутрикадрового JPEG на межкадровое видеокодирование.
В 1999 году Юнгджун Ю ( Texas Instruments ), Юнг Гап Квон и Антонио Ортега ( Университет Южной Калифорнии ) представили контекстно-адаптивную форму двоичного арифметического кодирования. [13] Современный алгоритм контекстно-адаптивного двоичного арифметического кодирования (CABAC) был коммерчески представлен с форматом H.264/MPEG-4 AVC в 2003 году. [14] Большинство патентов на формат AVC принадлежат Panasonic , Godo Kaisha IP Bridge и LG Electronics . [15]