1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# теория · шаг 1 из 5

Skip, intra-освежение и связанная PB-пара

Коротко

Пропуск блока означает согласованное восстановление без передачи его обычного набора данных, а не удаление области изображения. Intra-освежение обрывает временную зависимость выбранных блоков и может распределяться по нескольким кадрам. Внутрикадровое предсказание коэффициентов использует восстановленных соседей того же кадра. PB-режим H.263 объединяет P-картинку и промежуточную B-картинку в одну связанную единицу: это отличается от самостоятельной B-картинки. Для каждого режима нужно понимать, какие данные уже доступны декодеру и откуда берётся предсказание.

Если восстанавливаешь skip, разность intra-коэффициента и учебную PB-пару, переходи к «Теперь сам».

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

В видеоконференции фон неподвижен. Кодировать каждый его блок снова дорого, а точные изменения на уровне шума могут быть несущественны. Кодировщик решает не передавать обычные коэффициенты одного блока. Что увидит зритель: чёрный прямоугольник, дыру или прежний фон?

Ответ задаётся режимом формата. В простой рассматриваемой модели пропуска декодер копирует блок с той же позиции предыдущей восстановленной картинки, без нового остатка. Он всё равно получает определённые пикселы. Решение «изменение достаточно мало» принимает кодировщик, но приёмник не должен повторять его скрытый поиск или самостоятельно решать, как заполнить пропуск.

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

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

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

Механизм: skip и адреса блоков

В H.261 обычный передаваемый макроблок имеет адрес. Разности адресов позволяют пропускать позиции, для которых не передаётся новая информация. Пропущенную область сохраняют из предыдущего восстановленного изображения без нового вектора и остатка. В других семействах skip может выводить вектор из соседей и иметь другой смысл. Правило нельзя переносить по одному имени.

Если прежний блок [10,20,30], описанный нулевой сдвиг и отсутствие остатка дадут снова [10,20,30]. Это не утверждение, что исходная камера не изменила ни одного значения. Кодировщик мог принять малое изменение как допустимую ошибку. В этом случае ошибка реконструкции существует, хотя коэффициенты вообще не были переданы.

Intra-блок использует данные текущей области без временной опоры. Его собственное квантование может быть неточным, но ошибка прежней картинки не обязана переходить в него. В классических схемах предсказанного кадра часть блоков может быть intra, а остальные inter или skip. Следовательно, освежение не требует превращать весь кадр в I-картинку.

Правило

Для любого режима выпиши доступную опору, способ получения предсказания и передаваемую поправку. Skip восстанавливай по правилам конкретного формата. Для устранения временной зависимости освежай нужные блоки независимо. Соседние intra-коэффициенты предсказывай по восстановленным значениям, а PB рассматривай как связанную пару с определённым порядком восстановления.

Для H.261(03/1993) пункт 3.4 описывает принудительное intra-обновление макроблока по числу его передач: не реже одного раза за 132 передачи. Это не требование полного I-кадра каждые 132 кадра. Такое уточнение исправляет неоднозначный пересказ в книге. В учебном примере ниже расписание специально гораздо короче и служит объяснению механизма. Первоисточник H.261, пункт 3.4.

Разбор: освежать по одному блоку

Кодировщик хранит три блока со значениями [10,20,30], а декодер из-за прежнего повреждения хранит [10,99,30]. Для неподвижной сцены skip оставлял бы ошибку 99 во всех следующих картинках. Передадим по одному независимому блоку за кадр: сначала 0, затем 1, затем 2.

После первого обновления декодер всё ещё имеет [10,99,30], потому что обновлённая область и так была верной. После второго получит [10,20,30]. Третий завершит полный проход. Не нужно создавать один большой всплеск данных на независимый целый кадр, но разные области оздоравливаются в разное время.

video_modes.py
old = [10, 20, 30]
encoder = old[:]
decoder = [10, 99, 30]
for t in range(3):
    block = t
    decoder[block] = encoder[block]
    print("intra блока", block, "приёмник", decoder)
left_dc, top_dc, actual_dc = 12, 16, 18
prediction = (left_dc+top_dc)//2
print("intra DC:", prediction, "+", actual_dc-prediction, "=", actual_dc)
previous_p, future_p, actual_b = 8, 16, 13
pred_b = (previous_p+future_p)//2
print("PB: сначала P", future_p, "затем B", pred_b,
      "+", actual_b-pred_b, "=", actual_b)
print("skip:", old[:], "остаток не передан")
↳  выводpython3 video_modes.py
intra блока 0 приёмник [10, 99, 30]
intra блока 1 приёмник [10, 20, 30]
intra блока 2 приёмник [10, 20, 30]
intra DC: 14 + 4 = 18
PB: сначала P 16 затем B 12 + 1 = 13
skip: [10, 20, 30] остаток не передан

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

Разбор: intra может предсказывать по соседу

Слово intra запрещает временную зависимость в рассматриваемом режиме, но не означает отсутствия любых предсказаний. Внутри текущего кадра уже восстановлены DC соседних блоков: слева 12, сверху 16. В нашей модели предсказание p=(12+16)//2=14. Для текущего DC=18 передаётся разность 4. Декодер повторяет 14+4=18.

Если кодировщик вместо восстановленного левого 12 использует исходное 13, иной способ округления или другой выбор направления, получатель может прибавить 4 к другому предсказанию. Возникнет рассогласование внутри кадра. Конкретное расширение H.263 задаёт более подробные режимы, масштабы DC/AC и доступных соседей. Наше целое среднее показывает принцип передачи разности коэффициента; оно не объявляется точной формулой каждого Annex-режима.

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

Разбор: P и B одной связанной единицы

В базовом PB-режиме H.263 одна единица содержит P-картинку и промежуточную по времени B-картинку. P предсказывается из предыдущей P-опоры. B использует прежнюю P и уже восстановленную P-часть текущей пары; параметры движения организованы совместно. Это не просто отдельная B-картинка, которой дали две буквы. Режим является необязательным инструментом. Определение PB в H.263, пункт 3.4.5.

Учебный скалярный пример: P0=8, новая P2=16, между ними нужна B1=13. Сначала восстановим P2. Для B1 возьмём среднее опор (8+16)/2=12 и передадим остаток 1. После сложения получится 13. Порядок показа P0,B1,P2 отличается от порядка готовности необходимых опор P0,P2,B1. Если P2 ещё нет, одно число остатка 1 не определяет B1.

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

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

Считают skip командой «камера ничего не изменила» и используют его как доказательство полного отсутствия потерь. Или считают первый intra-блок сбросом всех опор и преждевременно объявляют декодер восстановленным. В обоих случаях вывод шире реально переданных независимых данных.

Ещё одна ошибка - принять любое внутрикадровое предсказание за временное. Надо спросить, откуда пришло значение: из другого момента или из уже восстановленного соседа текущей картинки. Различие определяет доступность данных, направление распространения ошибки и нужный порядок обработки.

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

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

При изучении старого потока H.263 сначала прочитай включённые опции. Наличие в семействе PB или предсказания intra-коэффициентов не означает, что они применяются к каждому блоку. Для корректной трассы достаточно выписать реально выбранные режимы и их зависимости.

Теперь сам

Прежний блок равен [4,8]. Выбран описанный skip. Что восстановится? В другом блоке восстановленные DC соседей 10 и 14, текущий DC15, предсказание - их среднее. Какая разность нужна? Почему intra соседей не требует прошлой картинки?

Ответ. Skip даст [4,8]. Предсказание DC равно 12, разность 3. Соседи находятся в том же кадре и уже восстановлены в согласованном порядке. Временная опора не нужна, но зависимость от текущих соседних блоков остаётся.

Главное

Экономия режима определяется доступными декодеру данными. Пропуск, intra-освежение, внутрикадровая разность и PB используют разные зависимости; восстанавливай каждую по её собственному контракту.

Комментарии

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

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

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