1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8

# теория · шаг 2 из 8

Замкнутый контур: почему кодировщик тоже декодирует

Коротко

Декодер не располагает исходными предыдущими кадрами: у него есть только восстановленные. Поэтому кодировщик должен строить предсказание из такой же опоры, локально отменяя собственное квантование и преобразование остатка. Полученное изображение сохраняется для последующих предсказаний. Это замкнутый контур реконструкции. Он не устраняет выбранную потерю качества, но не даёт подменять опоры и накапливать ошибку из-за их несогласованности. Постобработку для показа нельзя автоматически применять к нормативной опоре.

Если можешь провести два шага кодирования с квантованным остатком и объяснить дрейф разных опор, переходи к «Теперь сам».

Как думаешь, зачем при сжатии восстанавливать собственный результат

Кодировщик только что сжал кадр с потерями. Казалось бы, декодирование понадобится только проигрывателю, а у кодировщика уже есть оригинал. Однако следующий кадр может ссылаться на предыдущий. Какую его версию использует получатель?

Исходной картинки у него нет. Если отправитель вычтет из нового кадра предсказание по оригиналу, а получатель прибавит результат к изменённой копии, формулы перестанут быть обратными даже для точно переданного остатка. Ошибка возникнет не из-за плохого сжатия остатка, а из-за разных исходных данных.

На что это похоже

Два человека ведут общий список правок документа. После каждой передачи отправитель должен продолжать с той версией, которую действительно смог восстановить получатель. Если один правит идеальный оригинал, а другой чуть отличающуюся копию, одинаковые последующие команды будут применяться к разным документам и не обязаны приводить к одному тексту.

Локальное декодирование подтверждает общую версию. При этом сохраняется разница между общей версией и исходным документом. Замкнутый контур согласовывает состояние участников; он не превращает передачу с потерями в передачу точного оригинала.

Механизм: один полный оборот

Пусть Xₜ - исходный текущий блок, R - сохранённая восстановленная опора, P(R,v) - предсказание по переданному вектору v. Кодировщик вычисляет E=Xₜ−P(R,v), преобразует E и квантует коэффициенты. Затем у себя выполняет те же действия восстановления, которые доступны декодеру: умножение кодов на шаги, обратное преобразование, сложение с P. Обозначим восстановленный после декодирования, обратного квантования и обратного преобразования остаток через Ê (читается «E с крышкой»). При потерях он может отличаться от исходного E. Получается Rₜ=P(R,v)+Ê.

Обе стороны должны одинаково учитывать разрядность, диапазон, округление, интерполяцию и фильтры, включённые в контракт реконструкции. Для учебной модели предполагаем одинаковый точный обратный алгоритм. Реальные стандарты задают собственные требования точности и допустимые расхождения; произвольная обработка изображения в эти требования не входит.

В конвейере появляется обратная ветвь:

оригинал -> остаток -> преобразовать -> квантовать -> коды
              ^                              |
опоры -> предсказание                восстановить остаток
              |                              |
              +---------> сложить <----------+
                              |
                          новые опоры

Буфер хранит кадры, реально используемые для будущих предсказаний. Не каждый показанный кадр обязан быть опорным. Жизнь картинки для показа и жизнь как опоры связаны, но это две разные причины держать её в памяти.

Правило

Кодировщик и декодер должны продолжать цепь предсказаний из согласованной реконструкции. Восстановленный текущий кадр становится опорой по правилам выбранной схемы. Удаление ошибки относительно оригинала не является задачей замкнутого контура: его задача - одинаковое состояние при дальнейших операциях.

Параметры квантования и режимы передаются или однозначно выводятся из потока. Выбор кодировщика может быть сложным и зависеть от оригинала, но итоговое декодирование не должно требовать скрытого оригинала. Это полезный тест любого предлагаемого нового способа предсказания.

Разбор: один пиксел с изменённой опорой

Исходная опора равна 100, сохранённая реконструкция 96, текущий оригинал 110. Правильный остаток относительно доступной опоры равен 14. При шаге квантования 8 и округлении половин от нуля код равен 2, восстановленный остаток 16. Обе стороны получают 96+16=112. Ошибка относительно текущего оригинала равна +2 и объясняется квантованием.

Если отправитель предсказывал из 100, его остаток 10 восстанавливается как 8. При своей опоре он ожидал бы 108. Получатель использует 96 и получает 104. Разница 4 связана с разными опорами. Её нельзя убрать, просто подтвердив, что код остатка прочитан правильно: прибавление выполнено к другому числу.

Разбор: дрейф на четырёх кадрах

video_loop.py
def reconstruct_residual(value, step):
    sign = 1 if value >= 0 else -1
    code = sign * ((2 * abs(value) + step) // (2 * step))
    return code * step


good = bad = 100
previous_original = 100
for original in [110, 120, 130, 140]:
    residual = original - good
    good += reconstruct_residual(residual, 8)
    wrong_residual = original - previous_original
    bad += reconstruct_residual(wrong_residual, 8)
    previous_original = original
    print("оригинал", original, "замкнутый", good,
          "неверная опора", bad,
          "ошибки", good - original, bad - original)
print("один пиксел:", 96 + 16)
↳  выводpython3 video_loop.py
оригинал 110 замкнутый 108 неверная опора 108 ошибки -2 -2
оригинал 120 замкнутый 124 неверная опора 116 ошибки 4 -4
оригинал 130 замкнутый 132 неверная опора 124 ошибки 2 -6
оригинал 140 замкнутый 140 неверная опора 132 ошибки 0 -8
один пиксел: 112

Оригинал растёт на 10 в каждом кадре. Неверный отправитель каждый раз кодирует остаток 10 относительно предыдущего оригинала. После квантования получатель прибавляет только 8: его ошибка становится −2,−4,−6,−8. Разница с оригиналом растёт даже на таком простом движении.

Правильная ветвь вычитает собственную реконструкцию. На втором шаге 120−108=12; половина округляется от нуля и даёт восстановленный остаток 16. Получается 124, то есть ошибка +4. На следующих шагах ошибка меняется, а не обязана каждый раз увеличиваться на прежние два уровня. Это иллюстрирует ограничение текущего квантования в данной модели, но не доказывает универсальной границы для любых фильтров и преобразований.

Что ломается без этого

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

Другая ошибка - хранить только исходные I-кадры и забыть реконструкции P, которые выбраны опорами. Даже если между кадрами маленькая разница, адрес вектора относится к конкретному восстановленному кадру, а не к любой похожей картинке из памяти.

Зачем это в работе

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

Замкнутый контур также ограничивает параллелизм. Предсказание из будущей опоры нельзя завершить до её восстановления. Независимые блоки и преобразования можно распределять по исполнителям, если не нарушены дополнительные зависимости контекстов и фильтров.

Теперь сам

Восстановленная опора равна 40, текущий оригинал 45, шаг остатка 4. Чему равны код, восстановленный остаток и новый опорный пиксел? Что случится, если следующий кадр отправитель предскажет из 45 вместо результата?

Ответ. Остаток 5, код 1, восстановление 4, новый пиксел 44. У получателя будет 44. Предсказание из 45 у отправителя нарушит общую опору и добавит расхождение сверх того, которое определял выбранный код остатка.

Главное

Правильный код остатка ещё не обеспечивает согласованное видео, если опоры различаются. Локальное восстановление кодировщика сохраняет общий контур состояния, а допустимая ошибка относительно оригинала определяется выбранными потерями.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.