Содержание статьи +
- TL;DR
- Почему это важно
- Что такое «mode» в современном кодеке
- Задача rate-distortion в одном абзаце
- Lambda – единственное число, управляющее всем
- Полная RDO-петля по шагам
- Как настоящие программисты обманывают – fast mode decision
- RDOQ – RDO в квантовании
- Восемь ручек, которые реально крутят
- Где это ломается – два частых режима отказа
- Где Фора Софт вписывается
- Что впереди – нейросетевое RDO и обучаемое mode decision
- Ключевые выводы
- Что читать дальше
TL;DR
Mode decision – это выбор, который кодер совершает тысячи раз на каждый кадр: для каждого блока изображения нужно определить, какой из десятков доступных методов кодирования (направление intra-предсказания, опорный кадр для inter, размер блока, преобразование) обеспечит наилучший результат. Rate-distortion optimization, или RDO, – это математически обоснованный способ сделать такой выбор: каждый кандидат кодируется ровно настолько, чтобы измерить его битовую стоимость и степень искажения. Эти две величины объединяются в одно число с помощью множителя Лагранжа λ, и побеждает тот кандидат, у которого минимальная суммарная стоимость. Все современные кодеки – H.264, HEVC, VP9, AV1, VVC – используют ту же идею, которую Салливан и Виганд описали в своей статье 1998 года, и глубина поиска RDO определяет компромисс «качество против скорости» сильнее, чем любой другой параметр. Настройка RDO – это то, что превращает x265 из --preset ultrafast в --preset placebo и делает SVT-AV1 preset 4 вдвое медленнее, чем preset 8, ради 5–8% экономии размера файла.
Почему это важно
Пресет кодера – по сути, рецепт того, насколько глубоко проводить RDO. Именно понимание mode decision отличает выбор пресета «на глаз» от осознанного подхода, когда ты понимаешь, что именно он делает. Продакт-менеджер, знающий, что --rd 5 в x265 включает rate-distortion-оптимизированное квантование, а --rd 3 – нет, перестанет считать, что «выше всегда лучше», и начнёт задавать вопрос: оправданы ли дополнительные ~20% нагрузки на CPU теми несколькими процентами битрейта, которые имеют значение на его масштабе. Стриминг-инженер, умеющий читать логи кодера и видящий, сколько из 35 intra-направлений было отобрано SATD перед полным RDO, точно поймёт, куда ушла производительность. Основатель, сравнивающий AV1-кодеры от разных вендоров, осознает, что два кодера с одинаковым номером пресета могут использовать совершенно разные стратегии поиска и выдавать разные результаты. В этой статье мы разберём, что такое mode decision, почему RDO – математически обоснованный способ выбора, как λ вычисляется из QP, как реальные кодеры аппроксимируют полный поиск, чтобы оставаться быстрыми, и какие практические параметры при этом доступны.
Что такое «mode» в современном кодеке
Современный видеокодер не сжимает кадр целиком. Он разбивает кадр на quadtree-кодирующие блоки (CTU до 64×64 в HEVC, superblocks 128×128 в AV1, CTU 128×128 в VVC), а затем внутри каждого блока независимо выбирает кодирующие решения. Набор таких решений для одного блока и называется его mode. Mode – это совокупность небольших решений:
- Как предсказать пиксели. Использовать соседний блок в том же кадре (intra) или скопировать патч из другого кадра (inter). Внутри intra – выбрать одно из 35 направлений в HEVC, 56 в AV1 или 67 в VVC. Внутри inter – выбрать один или два опорных кадра, motion vector для каждого и фильтр субпиксельной интерполяции.
- Как разбить блок. Оставить одним большим блоком или разделить на четыре меньших; HEVC поддерживает только квадратные разбиения, AV1 – квадратные и несколько прямоугольных, VVC – гораздо более богатый набор, включая тернарные сплиты.
- Какое преобразование применить к остатку предсказания. По умолчанию – DCT-II, но HEVC предлагает альтернативное преобразование для 4×4 intra-блоков, AV1 – 16 комбинаций DCT / ADST / identity, а VVC – Multiple Transform Selection (MTS) и Low-Frequency Non-Separable Transform (LFNST) поверх.
- Насколько агрессивно квантовать каждый коэффициент преобразования. Block-QP можно изменять относительно slice-QP; RDOQ (rate-distortion-оптимизированное квантование) может заменить округлённый коэффициент на близкое значение, которое кодируется дешевле.
Каждое из этих решений – это дискретный выбор, и кодер должен принять их все, прежде чем сможет узнать реальную битовую стоимость и качество реконструкции блока. Количество правдоподобных комбинаций на блок огромно: в VVC, если действительно перебирать всё, число легальных режимов внутри одного CTU исчисляется сотнями миллионов. Кодер, работающий в реальном времени, не может проверить их все. RDO – это каркас, который определяет, как сравнивать любые два кандидата и выбирать лучший; практический кодер – это тщательно подобранный набор сокращений, позволяющий свести поиск к тысячам кандидатов на CTU, а не к сотням миллионов.
Задача rate-distortion в одном абзаце
Задача rate-distortion заключается в определении минимального объёма информации (битрейта), необходимого для представления сигнала с заданной степенью искажения, при этом баланс между сжатием и качеством остаётся ключевым. Она формализует компромисс между скоростью передачи данных и точностью восстановления сигнала, позволяя оценить теоретические пределы эффективного кодирования при допустимых потерях.
Сжатие – это всегда компромисс. Чем больше битов тратить, тем точнее реконструкция по сравнению с оригиналом; чем меньше – тем дальше она от него. График зависимости искажения от битрейта, известный как rate-distortion-кривая, монотонно убывает – качество растёт с увеличением битрейта – и хороший кодер работает на нижней огибающей этой кривой для любого контента. Задача mode decision – как раз и состоит в том, чтобы оставаться на этой огибающей: из всех возможных способов кодирования одного блока, допустимых синтаксисом кодека, выбрать такой, который лежит на огибающей, а не выше неё.
Математически это задача ограниченной оптимизации: нужно минимизировать суммарное искажение $ D $ по изображению при условии, что суммарный битрейт $ R \leq R_{\text{target}} $. Прямая формулировка с ограничениями сложна, поскольку решения для одного блока влияют на решения для других (из-за общего бюджета битов). Трюк, позволяющий сделать задачу решаемой (Sullivan и Wiegand, 1998, статья «Rate-distortion optimization for video compression» в IEEE Signal Processing Magazine), – переписать ограниченную задачу как безусловную с помощью множителя Лагранжа:
J = D + λ · RJ – rate-distortion-стоимость одного кодирующего выбора. D – его искажение (обычно sum of squared differences, SSD, между оригиналом и реконструкцией). R – его битовая скорость. λ – положительное число, множитель Лагранжа, определяющий наклон компромисса. Когда λ мала, член λR незначителен, и кодер в основном минимизирует D – щедро расходует биты ради качества. Когда λ велика, член λR доминирует, и кодер в основном минимизирует R – соглашается на большее искажение ради меньшего количества битов. Для любого контента существует определённое значение λ, при котором достигается rate-distortion-огибающая. Выберите λ, затем в каждом блоке выберите режим, минимизирующий J, – и вы получите наименьшее суммарное искажение при том битрейте, который соответствует этому λ.
Глубинная причина, по которой это работает, – выпуклость. По мере того как λ изменяется от нуля до бесконечности, оптимальная рабочая точка описывает выпуклую оболочку rate-distortion-кривой. Каждая точка на этой оболочке достижима при некотором λ. Поэтому вместо трудоёмкого глобального поиска кодер выполняет простой локальный поиск в каждом блоке – и при подходящем глобальном λ локальные решения в совокупности дают почти оптимальное кодирование. Эта конструкция строго обоснована для выпуклых задач и представляет собой отличную эвристику для невыпуклых реальных случаев.
Lambda – единственное число, управляющее всем
Каждый современный кодер выбирает λ как функцию параметра квантования QP. Зависимость экспоненциальная: при увеличении QP на 6 шаг квантования удваивается, кодер вдвое агрессивнее отбрасывает детали – соответственно, и λ примерно удваивается. Эталонный кодер HEVC HM использует
λ_mode = α · 2^((QP − 12) / 3)где α – коэффициент, зависящий от содержимого: 0.85 для конфигурации Random Access, ниже для I-кадров, немного выше для B-кадров на глубоких темпоральных уровнях. Та же семья формул с разными константами используется в x264, x265, VVenC, libvpx, libaom, SVT-AV1 и VTM. Классическая работа – статья Wiegand–Girod «Lagrange multiplier selection in hybrid video coder control» (2001); современный обзор – Frontiers 2023 «The disparity between optimal and practical Lagrangian multiplier estimation in video encoders».
Разберём пример. Допустим, кодируем при QP = 27 – обычный стриминговый QP для 1080p H.264.
- QP − 12 = 15.
- (QP − 12) / 3 = 5.
- 2⁵ = 32.
- λ_mode = 0,85 × 32 = 27,2.
Значит, при QP = 27 кодер оценивает каждый бит скорости против примерно 27 единиц квадратичного искажения. Если кандидат A стоит на 100 битов дороже, чем B, но снижает SSD на 3000, то дополнительная стоимость A в J составляет 100 × 27,2 = 2720, а выигрыш – 3000, так что A побеждает с преимуществом в 280. Если бы A снизил SSD лишь на 2500, он проиграл бы с разницей в 220 – даже будучи блоком более высокого качества – потому что дополнительные 100 битов не окупились при данном λ.
Вторая формула, λ_motion = √λ_mode, применяется при оценке движения, когда искажение измеряется в единицах суммы абсолютных разностей (SAD), а не суммы квадратов разностей (SSD). Поскольку SAD масштабируется примерно как квадратный корень из SSD, величина √λ_mode обеспечивает согласование шкал. В нашем примере λ_motion = √27.2 ≈ 5.21 – это означает, что поиск движения выберет вектор движения, требующий на один дополнительный бит, только если он снизит SAD хотя бы на 5 единиц абсолютной разности.
Численная чувствительность λ – это реальная инженерная проблема. Вендор, решивший умножить λ на 1,2 «ради экономии битрейта на высоком QP», получит измеримое падение PSNR; вендор, разделивший λ на 1,2, потратит лишние биты, не добившись заметного прироста качества. Production-кодеры работают с тщательно настроенными λ-таблицами, и большинство тюнингов – --tune psnr, --tune ssim, --tune vmaf – по сути являются небольшими корректировками значения λ, которое кодер использует внутри своих RDO-петель.
Полная RDO-петля по шагам
Полный процесс принятия решения о режиме RDO для одного блока в учебнике выглядит так. Обозначения соответствуют эталонному кодеру HEVC HM, однако любой современный кодер реализует какую-либо версию этого алгоритма.
- Перечислить кандидатные режимы. Составить список всех режимов, разрешённых синтаксисом для данного блока. Для inter-блока 32×32 в HEVC такой список включает 35 intra-направлений, два кандидата skip, несколько кандидатов merge, различные комбинации опорного кадра и вектора движения, четыре варианта разбиения и так далее – всего сотни записей.
- Для каждого кандидата: а. Запустить реальные инструменты кодирования. Сгенерировать предсказание. Вычесть его из оригинала – получить остаток. Преобразовать остаток (DCT-II или то, что выбирает данный кандидат). Квантовать коэффициенты преобразования с текущим QP. б. Применить RDOQ, если уровень RD позволяет: вместо прямого округления попробовать несколько соседних целых значений для каждого значимого коэффициента и оставить то, которое минимизирует J = D + λR_coeff. в. Энтропийно закодировать квантованные коэффициенты с помощью реального контекстно-адаптивного кодера (CABAC для HEVC и VVC; CABAC-подобные кодеры для AV1 и AVS3). Посчитать реальное число битов R. г. Обратно проквантовать коэффициенты, обратно преобразовать остаток, прибавить предсказание и получить реконструированный блок. Замерить SSD относительно оригинала – это D. д. Вычислить J = D + λ · R.
- Выбрать кандидата с минимальным J. Зафиксировать выбранный режим, записать его биты в битовый поток, сохранить реконструкцию в буфере опорных кадров.
Эта петля точная в том смысле, что каждая стоимость – реальная: реальные биты от настоящего энтропийного кодера, реальное искажение от фактической реконструкции. Чистое RDO – это то, что получается при --rd 6 в x265 с --no-fast-ina и строгим --rd-refine, либо при запуске VTM (эталонного кодера VVC) в стандартной конфигурации Random Access. Это также то, что никто не использует в продакшене. Одно полное RDO-кодирование 4K-видео на современном CPU может занимать в сотни раз больше времени, чем его воспроизведение: VTM в стандартной конфигурации кодирует 4K-видео со скоростью менее одного кадра в минуту даже на 16-ядерной рабочей станции. Именно описанные ниже сокращения делают реальный софт применимым на практике.
Как настоящие программисты обманывают – fast mode decision
У продакшен-кодера есть бюджет качества (потерять не более X% BD-rate по сравнению с полным RDO) и бюджет скорости (работать быстрее, чем Y× реального времени на Z ядрах). Принятие решений по режимам – это то место, где сосредоточено почти всё компромиссное соотношение скорость против качества. Доминируют шесть семейств методов сокращения.
Предварительный отбор кандидатов по низкой стоимости. Прежде чем запускать полное RDO на кандидате, кодер вычисляет дешёвый суррогат – обычно Sum of Absolute Transformed Differences (SATD), то есть L1-норму остатка после преобразования Адамара. SATD примерно в 50 раз дешевле полного RDO и хорошо коррелирует с итоговой rate-distortion-стоимостью. Кодер ранжирует всех кандидатов по SATD, оставляет топ-K (обычно K = 3–8) и запускает полное RDO только для них. Это основной приём быстрого выбора внутрикадрового режима: вместо полного RDO по всем 35 направлениям HEVC x265 вычисляет SATD для всех 35, выбирает лучшие 3 и проводит полное RDO только для этих трёх. Потеря качества обычно составляет менее 0,2 % BD-рейта; ускорение – около 10 раз.
Раннее завершение на родительском блоке. Когда кодер решает, стоит ли делить CTU 64×64 на четыре блока 32×32, он сначала кодирует весь блок 64×64 в лучшем режиме без разделения. Если полученная стоимость J оказывается «достаточно низкой» – ниже адаптивного порога, рассчитанного на основе затрат соседних блоков, – кодер пропускает дальнейший рекурсивный перебор и фиксирует размер 64×64. Та же логика применяется на каждом уровне quadtree. В x265 это называется early-CU termination; порог настраивается с помощью флагов --limit-modes, --limit-refs, --early-skip.
Пространственное наследование. Соседние блоки коррелированы: если левый блок выбрал горизонтальное intra-направление, текущий блок с высокой вероятностью сделает то же самое. Большинство кодеров смещают поиск режимов в сторону соседей – на быстрых пресетах тестируются только те режимы, которые выбрали соседние блоки, плюс небольшой набор режимов, которые всегда проверяются по умолчанию. Такое смещение небезопасно на границах кадров и при склейках сцен, поэтому кодеры отключают его при обнаружении смены сцены.
Lookahead и классификация сложности. Отдельный проход кодера, идущий на десятки кадров вперёд, классифицирует сложность каждого кадра. Простой плоский контент с малым движением получает упрощённый режим поиска (mode-search), а сложный, с высокой динамикой – более трудоёмкий. x264 называет эту структуру mb-tree, x265 – CU-tree. Именно этот классификатор объясняет, почему статичный поток с веб-камеры кодируется в разы дешевле, чем спортивная трансляция того же разрешения.
Многопроходный тюнинг. Двух- и трёхпроходные кодеры в первом проходе определяют сложность каждой области, а затем во втором или третьем применяют более точную настройку RDO-петли, тратя больше вычислительных ресурсов там, где это действительно необходимо. Пайплайны VOD (Netflix, YouTube, Disney+) используют до шести проходов на один видеофайл; live-кодеры работают за один проход с агрессивным lookahead.
Поблочная модуляция QP. Внутри RDO кодер может изменять QP вверх или вниз на уровне блока (в пределах, разрешённых синтаксисом). Меньший QP означает большее значение λ относительно искажения – больше битов тратится на кодирование – и применяется к лицам, а также к регионам, которые модель saliency определяет как важные, и к центру кадра в VR-контенте. Это основа per-title и per-scene encoding, используемых в современных VOD-пайплайнах.
Совокупный эффект – скорость поиска в сотни раз выше, чем у полного RDO, при потере всего нескольких процентов BD-rate. «Налог» за использование быстрого пресета в x265 на уровне medium (по умолчанию) составляет около 4–6% BD-rate по сравнению с --preset placebo; для ultrafast – уже 25–30%. В SVT-AV1 та же картина: пресет 8 отстаёт от пресета 4 примерно на 4% (по данным бенчмарков Streaming Learning Center), а пресет 12 – на 15–20%. Большая часть этой разницы обусловлена именно этапом mode decision; преобразование, квантование и энтропийное кодирование вносят куда меньший вклад.
RDOQ – RDO в квантовании
Второе место, где применяется RDO и где его часто упускают из виду, – это само квантование. После преобразования каждый коэффициент делится на шаг квантования и округляется до целого числа. Наивное округление всегда выбирает ближайшее целое. Rate-distortion-оптимизированное квантование (RDOQ) действует иначе: для каждого значимого коэффициента оно рассматривает два-три соседних целых уровня и выбирает тот, который минимизирует J для этого коэффициента с учётом битовой стоимости его кодирования в энтропийном кодере.
Пример. Допустим, коэффициент преобразования после деления на шаг QP стал равен 4.4. Наивное округление даёт 4. RDOQ задаёт вопрос: «Если закодировать 3, искажение увеличится на ((4.4 − 3)² − (4.4 − 4)²) × step² = ((1.4)² − (0.4)²) × step² = 1.8 × step² единиц, но энтропийному кодеру потребуется примерно на 0.3 бита меньше, чтобы закодировать 3 вместо 4 в этом контексте. При λ_coeff = 27 сэкономленная J = 0.3 × 27 = 8.1 единицы. Если 1.8 × step² < 8.1 (то есть step < 2.12), побеждает 3. Иначе – 4».
RDOQ также управляет обнулением коэффициентов по решётке (trellis): если несколько последних ненулевых коэффициентов блока вносят в D вклад, меньший, чем их стоимость R, их обнуляют. Решётчатый (trellis) подход важен, потому что контекстно-адаптивный CABAC делает стоимость одного коэффициента зависимой от соседних; оптимальный паттерн нулей и ненулей находится с помощью динамического программирования, а не покоэффициентно.
RDOQ – это то, что x265 включает при --rd 4 и выше, а HEVC HM использует по умолчанию. Такой подход даёт прирост эффективности кодирования на 1–3% по сравнению с обычным mode-decision RDO. Однако вычислительная стоимость на коэффициент возрастает на 30–40%, поэтому отключение RDOQ – первое, что делают все кодеры с низким задержкой. В SVT-AV1 аналогичный механизм называется trellis quantization, а в aomenc – trellis coefficient optimization, которое можно отключить флагом --disable-trellis-quant. Статья Ramos et al. 2015 «Rate-distortion optimized quantization in HEVC: Performance limitations» – стандартная ссылка по математике и пределам эффективности такого подхода.
Восемь ручек, которые реально крутят
В продакшене λ почти никогда не меняют напрямую. Настройка сводится к выбору пресета кодера и небольшому набору параметров, управляющих глубиной mode-search. Ниже приведена таблица с основными кодерами.
| Кодер | Главная ручка глубины | Ручка RDO-квантования | Битрейтовый эффект шага глубже | Типичная стоимость CPU |
|---|---|---|---|---|
| x264 (H.264) | --preset (ultrafast → placebo) | --trellis 0/1/2 | 0.5–2% на шаг пресета | ~1.5× на шаг пресета |
| x265 (H.265) | --preset и --rd 0–6 | --rdoq-level 0/1/2 | 1–3% на шаг --rd | ~1.3× на шаг --rd |
| libvpx (VP9) | --cpu-used 0–9 | --tune-content default/screen/film | 2–5% на шаг cpu-used | ~1.4× на шаг |
| libaom (AV1) | --cpu-used 0–8 | --disable-trellis-quant (off = с RDOQ) | 2–6% на шаг cpu-used | ~1.5× на шаг |
| SVT-AV1 (AV1) | --preset 0–13 | --rdoq-level 0/1 | 2–5% на шаг пресета в диапазоне 4–8 | ~1.4× на шаг пресета |
| VVenC (VVC) | --preset faster → slower | --rdoq 0/1/2 | 3–7% на шаг пресета | ~1.7× на шаг пресета |
| VTM (VVC) | эталонный кодер, без пресетов | RDOQ, SignHideFlag в cfg | территория эталонного кодера, в 10×+ медленнее VVenC | n/a |
Закономерность везде одинакова: одна основная ручка управляет шириной поиска и глубиной RDO, вторая – включает или отключает RDOQ, а одна-две дополнительные отвечают за настройки вроде psy-rd (x264, x265) и tune (libvpx, SVT-AV1).
Где это ломается – два частых режима отказа
Отказ 1: lambda не подходит под контент. Стандартные таблицы λ_mode во всех кодерах настроены на тестовые наборы, в которых преобладает natural-контент и мало screen-контента. Screen-контент (презентации, видеоигры, демо-программы) обладает совершенно иными rate-distortion-характеристиками: резкие границы, большие однородные области, повторяющийся текст. Стандартная λ поощряет чрезмерное использование transform-кодирования на screen-контенте там, где эффективнее применили бы palette-режим или intra-блоковое копирование. Исправление в HEVC и VVC – SCC-инструменты (Screen Content Coding); в кодерах – --tune zerolatency + --tune-content screen или аналог. Без этого screen-контент при типичных значениях QP сжимается на 15–20% хуже теоретического минимума.
Отказ 2: SATD-префильтр отбрасывает реального победителя. SATD работает быстро, но не учитывает контекст энтропийного кодера – его можно обмануть, если у действительно лучшего кандидата высокий SATD из-за необычного распределения энергии остатка, но при этом коэффициенты хорошо сжимаются. В результате появляются артефакты «пропущенного режима»: кодер выбирает чуть неверное intra-направление на границах, что вызывает заметные «ступеньки» вдоль высококонтрастных диагоналей. У большинства кодеров есть опции --max-tu-size или --analyse all, отключающие агрессивную SATD-фильтрацию для проблемного контента; это даёт реальную нагрузку на CPU (5–15%), но на титрах, где качество критично, выигрыш в визуальной чистоте очевиден. Это одна из самых частых причин, по которым студии сопротивляются требованию операционной команды перейти на более быстрый пресет.
Ловушка, на которую стоит обратить внимание: не отключайте RDO полностью на быстром пресете и не сравнивайте пресеты при одинаковом CRF. RDO и CRF тесно связаны – при одинаковом CRF быстрый пресет использует более высокий битрейт (поскольку кодер делает менее оптимальные решения и требует больше битов для компенсации). Сравнивайте пресеты при одинаковом битрейте или одинаковом VMAF, а не при одинаковом CRF.
Где Фора Софт вписывается
Мы разрабатываем видеопайплайны для стриминга, OTT/Internet TV, видеонаблюдения, e-learning, телемедицины и видеоконференцсвязи. В каждой из этих областей оптимальная настройка RDO своя. Поток телемедицины, который должен работать на 4-ядерной ARM-платформе с частотой 30 кадров в секунду и разрешением 1080p, требует быстрого пресета с RDO, ограниченного плотным CTU-списком режимов и минимально включённым RDOQ. Для OTT VOD-энкодинга в стриминговом сервисе используется SVT-AV1 preset 4 или x265 --rd 5 с полным RDOQ – это позволяет сэкономить 5–8% пропускной способности на одном контенте, а в масштабах – это реальные деньги. Рекордер для видеонаблюдения работает круглосуточно, поэтому RDO здесь должен стремиться к максимальной вычислительной эффективности, а не к качеству. Мы оцениваем компромиссы с помощью внутренних A/B-стендов с измерением BD-rate на «ground-truth»-контенте из каждой отрасли, а не на универсальных UVG-клипах.
Что впереди – нейросетевое RDO и обучаемое mode decision
Следующий этап – замена внутренних петель RDO нейросетями. В научной литературе 2024–2025 годов выделяются два направления. Первое, обзорное, представлено в работе Zhang et al. (CVPR 2025, «Balanced Rate-Distortion Optimization in Learned Image Compression») – сбалансированная RDO в полностью обучаемых кодеках для изображений и видео, где end-to-end нейрокодек обучается на основе лагранжевой функции, а сеть принимает имплицитные решения о режимах; в AV2 появятся нейро-оптимизированные пути именно в таком ключе (см. будущее нейрокодеков). Второе направление – нейросетевые помощники для принятия решений о режимах, которые можно интегрировать в традиционные кодеры: небольшая CNN анализирует блок и предсказывает, какие три из 67 режимов intra-кодирования VVC следует включить в шорт-лист для полного RDO, заменяя при этом SATD-префильтр. Статья с ECCV 2024 «Learned Rate Control for Frame-Level Adaptive Neural Video Compression» сообщает о среднем выигрыше 14,8% по BD-рейту на уровне кадра по сравнению с обычным rate-control + RDO; более компактные блочные помощники обычно дают прирост в 1–2% к уже сильному бенчмарку.
Классический каркас RDO остаётся в силе. Функция потерь λ-cost от Sullivan и Wiegand продолжает использоваться в нейросетевом варианте. Изменяется политика поиска – алгоритм выбора кандидатов и порядка их тестирования. Именно это в течение тридцати лет приближённо моделировали быстрые пресеты. Замена их обучаемой политикой – перспективное направление для следующего поколения кодеков.
Ключевые выводы
- Mode decision – поблочный выбор режима предсказания, разбиения, преобразования и квантования; в современных кодеках на один CTU приходится сотни миллионов допустимых режимов.
- RDO – лагранжева оптимизация, сравнивающая режимы по формуле J = D + λR; побеждает кандидат с наименьшим значением J.
- λ – экспоненциальная функция от QP: в HEVC используется λ ≈ 0,85 × 2^((QP − 12)/3) – это единственная настройка, управляющая компромиссом между битрейтом и качеством.
- Реальные кодеки ограничивают поиск с помощью SATD-префильтра, раннего завершения, приоритизации соседних блоков и многопроходной классификации сложности.
- RDOQ переносит ту же идею внутрь квантования, выбирая уровни коэффициентов, минимизирующие J, включая стоимость их энтропийного кодирования.
- Пресет – в основном рецепт глубины поиска: каждый дополнительный уровень стоит 30–50% CPU, но экономит 1–5% BD-rate.
Что читать дальше
- Архитектура гибридного видеокодека – где RDO занимает своё место в общей структуре.
- Quantization: где теряется качество – тот QP, который влияет на λ.
- Rate control: CBR, VBR, CRF, ABR, capped CRF – внешняя петля, управляющая выбором режима кодирования.