Компенсация движения в HEVC

Компенсация движения в HEVC

ГЛАВА 4

Video_compression_book

Алгоритмы предсказания векторов движения: информация о референсных изображениях, реализация предсказания векторов движения.

 

 

В стандарте HEVC реализованы все выше перечисленные идеи, обеспечивающие максимальное «качество» межкадрового Inter-предсказания. Векторы предсказания можно задавать с четвертьпиксельной точностью, использовать одно- и двунаправленное предсказание, адаптивно варьировать форму и размер участков изображения, для которых предсказание выполняется, формировать длинные (до 15) списки референсных кадров, использовать алгоритмы предсказания векторов движения, так что в закодированный видеопоток помещается только информация об разностных векторах mvd. Как все это реализовано? Попробуем разобраться.

Информация о референсных изображениях.

Понятно, что для реализации Inter-предсказания кодирующая и декодирующая системы должны иметь в своем составе буфер памяти, в котором хранятся декодированные изображения. Этот буфер называют DPB (от англ. Decoded Picture Buffer). Часть из изображений в DPB «ожидают», когда наступит их очередь для отображения на экране (в декодирующей системе), другая часть остается в буфере для того, чтобы обеспечить возможность выполнять Inter-предсказание при кодировании других видеокадров. Те видеокадры, которые будут использоваться для Inter-предсказания должны быть каким-то образом отмечены при кодировании, а информация об этих отметках должна быть помещена в закодированный видеопоток. В HEVC предусмотрено два типа таких отметок. Первый из них называют short-term reference. Так помечают те изображения в DPB, которые могут использоваться в качестве референсных кадров при Inter-предсказании блоков изображения текущего кадра или двух ближайших к нему (в порядке декодирования) последующих видеокадров. Отметки второго типа носят название long-term reference и касаются тех кадров в DPB, которые могут быть использованы при предсказании блоков изображения в кадрах, отстоящих от текущего больше, чем на 2 кадра (в порядке декодирования). Все изображения в DPB, которые не помечены как short-term reference или long-term reference считаются unused for reference и не могут быть в дальнейшем использованы для выполнения Inter-предсказания. Информация об этих отметках помещается в закодированный видеопоток для каждого видеокадра (в заголовочную часть закодированного кадра). Эту информацию называют Reference Picture Set (RPS).

Каждый из кадров в закодированном видеопотоке имеет свой идентификатор POC (от англ. Picture Order Counter). В наиболее упрощенном варианте значение POC можно интерпретировать как порядковый номер изображения в видеопоследовательности*. Информация, позволяющая определить POC, помещается кодирующей системой в закодированный поток для каждого изображения. Таким образом, все декодированные изображения в DPB имеют свои уникальные значения POC. Именно значения POC используются для маркировки short-term reference или long-term reference видеокадров в DBP.

Прежде всего в описание RPS в закодированном потоке помещается информация о значениях POC тех кадров, которые должны быть помечены как short-term reference. Так как не все референсные изображения, попавшие в RPS, используются для предсказания текущего видеокадра, то к каждому значению POC в описании RPS добавляется флаг (один бит), значение которого равное нулю указывает, что это референсное изображение не используется при предсказании текущего видеокадра. Значение флага равное 1, соответственно, указывает на то, что данное референсное изображение используется при предсказании текущего видеокадра.

*Примечание. На самом деле значение POC каждого кадра не является уникальным для всей видеопоследовательности. В закодированном видеопотоке стандарта HEVC, как правило, присутствуют кадры, закодированные с использованием внутрикадрового Intra-предсказания. Очевидно, что для декодирования таких кадров референсные изображения не нужны. В том случае, когда для предсказания (прямого или двунаправленного) всех кадров, следующих в видеопоследовательности за таким I-кадром, используются только референсные кадры, расположенные в видеопоследовательности после I-кадра, значение POC этого I-кадра устанавливается равным нулю. Таким образом, значения POC являются уникальными только в пределах группы видеокадров, связанных P- или B-предсказанием. Кроме того, заметим, что при декодировании (кодировании) таких I-кадров все содержимое DPB помечается как unused for reference, т.е. набор помеченных кадров RPS очищается.

Информация о позиции кадров, помеченных как long-term reference, формирует в RPS отдельный список. Этот список состоит из значений POC (тут возможны варианты, но не будем загромождать изложение слишком большим количеством деталей), каждое из которых сопровождается значением однобитного флага. Назначение флага то же, что и для short-term reference. Значение флага, равное 1 указывает на то, что это изображение используется при предсказании текущего видеокадра.

Значения POC кадров в DPB, помеченных как short-term reference или long-term reference, при подготовке к выполнению Inter-предсказания используются для построения списков референсных изображений (reference picture list). В том случае, когда выполняется однонаправленное предсказание (P-prediction) строится один такой список, называемый RefPicList0. Для B-предсказания выполняется построение двух списков: RefPicList0 и RefPicList1. Понятно, что в эти списки заносятся только те значения POC помеченных кадров в DPB, для которых в RPS значение флага установлено в 1. Длины списков передаются в закодированном видеопотоке. Добавление значений POC в списки происходит до тех пор, пока весь список не будет заполнен. В список RefPicList0 сначала заносятся значения POC референсных кадров short-term reference, которые предшествуют текущему кадру в видеопоследовательности, т.е. POC которых меньше POC текущего кадра. Эти кадры отсортированы в порядке убывания POC, т.е. наименьший индекс в списке RefPicList0 имеет short-term reference кадр, у которого значение POC является ближайшим к POC текущего кадра, но не превосходит его. Если после добавления список не заполнен, то в него последовательно добавляются все референсные кадры, помеченные как short-term reference и значения POC которых больше, чем POC текущего изображения. Эти кадры отсортированы в порядке возрастания значений POC. Наконец, если и на этом этапе список заполнен не полностью, то в него добавляются референсные кадры, помеченные в RPS как long-term reference.

Список RefPicList1 заполняется аналогично с той лишь разницей, что сначала в него заносятся short-term reference кадры, значение POC которых больше, чем POC текущего изображения. Эти кадры по-прежнему отсортированы в порядке возрастания POC. На следующем этапе в список добавляются short-term reference кадры, значения POC которых меньше, чем у текущего, отсортированные в порядке убывания POC. Наконец, на заключительном этапе в список RefPicList1 заносятся значения POC кадров, помеченных как long-term reference.

Формирование списков RefPicList0 и RefPicList1 позволяет в закодированном видеопотоке использовать индексы референсных изображений в этих списках в качестве указания на тот или иной кадр в DPB, который должен использоваться при выполнении предсказания кодируемого блока изображения на текущем видеокадре.

Предсказание векторов движения.

В HEVC результатом выполнения процедуры предсказания вектора движения для каждого кодируемого (декодируемого) блока изображения является список, состоящий из двух векторов движения. В закодированном видеопотоке для каждого блока кодируемого изображения передается индекс, равный 0 или 1, указывающий какой из элементов списка использовать в качестве mvp.

Основная идея при формировании списка заключается в том, что с высокой вероятностью вектор движения для текущего блока мало отличается от векторов движения соседних ранее закодированных блоков, которые и можно использовать в качестве предсказания. К этой простой идее добавлена еще одна. С высокой вероятностью в списке референсных кадров может оказаться кадр, который мало отличается от текущего. Тогда вектор движения блока, находящегося на кадре из списка в той же или почти той же позиции, что и кодируемый блок, вполне может служить хорошим предсказанием. В целом, в формировании списка участвуют два вектора движения соседних блоков CandA и CandB из текущего кадра и вектор движения из, так называемого, co-located блока, который расположен на одном из референсных кадров. Индекс референсного кадра, содержащего co-located блоки для всех блоков текущего изображения, передается в заголовочной части кодируемого изображения.

Список из двух кандидатов формируется следующим образом. Прежде всего, в список добавляются вектора блоков CandA и CandB, если оба они доступны (существуют и уже закодированы), закодированы в режиме Inter-предсказания и отличаются друг от друга. Если эти блоки имеют одинаковые вектора движения, то в список добавляется только один вектор. В том случае, когда после добавления векторов соседних блоков CandA и CandB список не содержит два элемента, в него добавляется вектор co-located блока. Если и после этого список оказывается не заполнен, то оставшиеся пустыми позиции заполняются нулевыми векторами движения.

Video4.1

Рис.1. Примеры расположения блоков-кандидатов относительно текущего кодируемого блока (указан на рисунке серым цветом)

Блок-кандидат CandA выбирается из двух блоков CandA0 и CandA1, находящихся слева от текущего. В HEVC, как уже говорилось, предусмотрено адаптивное разбиение видеоизображения на блоки кодирования. В связи с этим, может существовать множество вариантов конфигураций блоков, расположенных слева от текущего. Несколько таких вариантов иллюстрируются на рис.1. Выбор блоков CandA0 и CandA1 определяется положением двух пикселов, обозначенных на рис.1 как PA0  и PA1. Блоком  CandA0 является блок изображения, содержащий пиксел PA0, а блоком CandA1 – пиксел PA1.

Блок-кандидат CandB выбирается из трех блоков CandB0, CandB1 и CandB2, которые определяются положением трех пикселов, отмеченных на рис.1 как PB0, PB1 и PB2. Блоком CandB0 является блок, содержащий пиксел PB0, блоком CandB1 – содержащий пиксел PB1, блоком CandB2 – PB2.

Итак, на первом этапе посторения списка из двух блоков {CandA, CandB} производится отбор одного кандидата из блоков CandA0 и CandA1, и одного кандидата из блоков CandB0, CandB1 и CandB2. Отбор производится в порядке нумерации блоков-кандидатов. Таким образом, при выборе блока CandA, сначала проверяется блок CandA0, а затем – блок CandA1. Проверка заключается в выполнении следующих условий.

  1. Блок-кандидат уже закодирован, причем закодирован в режиме Inter.
  2. Блок-кандидат имеет тот же референсный кадр, что и кодируемый блок.

В том случае, когда выполняются оба условия, блок-кандидат помещается в список {CandA, CandB} на соответствующую позицию. Так, например, если блок CandA0 закодирован в режиме Inter и у него тот же референсный кадр, что и у кодируемого блока, то он помещается в список в качестве элемента CandA. Если условие 2 не выполняется ни для одного из блоков-кандидатов, то в список помещается первый из блоков-кандидатов, для которого выполнено условие 1. В этом случае для использования его вектора движения в качестве mvp необходимо провести процедуру масштабирования, определяемую следующим выражением:

\begin{array}{l} mvp=\frac{t_{b}}{t_{d}} \cdot mv \\\end{array}

где $\displaystyle t_{b} $ разница значений POC кодируемого видеокадра и референсного кадра для кодируемого блока; $\displaystyle t_{d} $ разница значений POC кадра, содержащего блок из списка, и его референсного кадра; $\displaystyle mv $ вектор движения блока из списка. Введенные обозначения иллюстрируются на рис. 2.

Video4.2

Рис.2. Обозначения, используемые при масштабировании.

В примере на рисунке $\displaystyle t_{b} =25-23=2t_{d} =23-19=4 $

В том случае, когда ни один из блоков-кандидатов CandA0, CandA1 не удовлетворяют условию 1, в качестве элемента CandA в списке используется первый из доступных блоков-кандидатов CandB0, CandB1, CandB2.

Как уже было сказано, в том случае, когда список {CandA, CandB} оказывается не заполнен после проверки пространственных блоков-кандидатов, в него добавляется, так называемый, co-located блок. Этот блок находится на референсном кадре, номер которого передается в заголовочной части кодируемого кадра. В качестве co-located блока может использоваться один из двух кандидатов, координаты которых в референсном кадре определяется относительно координат кодируемого блока так, как показано на рис.3. Если блок-кандидат, содержащий пиксел C0, может использоваться в качестве co-located блока (т.е. он закодирован в Inter режиме и принадлежит к LCU с тем же номером, что и кодируемый блок), то он помещается на первое свободное место в список {CandA, CandB}. В противном случае на это место помещается блок-кандидат, содержащий пиксел С1 (опять же, если он может использоваться в качестве co-located блока).

После добавления в список {CandA, CandB} co-located блока все оставшиеся свободными места в списке заполняются нулевыми векторами движения.

Video4.3

Рис.3. Положение co-located блока

 

12 февраля 2019

Читать другие статьи:

Глава 1. Просто о видеокодировании

Глава 2. Межкадровое (Inter) предсказание в HEVC

Глава 3. Пространственное (Intra) предсказание в HEVC

Глава 5. Постпроцессинг в HEVC

Глава 6. Контекстно-адаптивное двоичное арифметическое кодирование. Часть 1

Глава 7. Контекстно-адаптивное двоичное арифметическое кодирование. Часть 2

Глава 8. Контекстно-адаптивное двоичное арифметическое кодирование. Часть 3

Глава 9. Контекстно-адаптивное двоичное арифметическое кодирование. Часть 4

Глава 10. Контекстно-адаптивное двоичное арифметическое кодирование. Часть 5

 

 

Автор:

Олег Пономарев - 16 лет занимается вопросами видео кодирования и цифровой обработки сигналов, специалист в области распространения радиоволн, статистической радиофизики, доцент кафедры радиофизики НИ ТГУ, кандидат физико-математический наук. Руководитель исследовательской лаборатории Elecard.

 

Инструмент для детального анализа этапов кодирования видеопоследовательности - Elecard StreamEye

Инструмент для сравнения параметров видео, закодированного разными энкодерами