О референсных изображениях
Для реализации Inter-предсказания кодирующая и декодирующая системы имеют буфер памяти, в котором хранятся декодированные изображения. Этот буфер называют DPB (от англ. Decoded Picture Buffer). Часть из изображений в DPB «ожидают», когда наступит их очередь для отображения на экране (в декодирующей системе), другая часть остается в буфере для того, чтобы обеспечить возможность выполнять Inter-предсказание при кодировании других видеокадров. Те видеокадры, которые будут использоваться для Inter-предсказания, отмечаются при кодировании, а информация об этих отметках помещается в закодированный видеопоток. В HEVC предусмотрено два типа таких отметок. Первый из них называют short-term reference. Так помечают те изображения в DPB, которые могут использоваться в качестве референсных кадров при Inter-предсказании блоков изображения текущего кадра или двух ближайших к нему (в порядке декодирования) последующих видеокадров. Отметки второго типа называются long-term reference и касаются тех кадров в DPB, которые могут быть использованы при предсказании блоков изображения в кадрах, отстоящих от текущего больше, чем на 2 кадра (в порядке декодирования). Все изображения в DPB без таких отметок считаются unused for reference и не используются для Inter-предсказания. Информация об этих отметках помещается в закодированный видеопоток для каждого видеокадра (в заголовочную часть закодированного кадра). Эту информацию называют Reference Picture Set (RPS).
Каждый кадр в закодированном видеопотоке имеет свой идентификатор POC (от англ. Picture Order Counter). В наиболее упрощенном варианте значение POC можно интерпретировать как порядковый номер изображения в видеопоследовательности*. Все декодированные изображения в DPB имеют свои уникальные значения 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.
Значения POC кадров в DPB, помеченных как short-term reference или long-term reference, при подготовке к выполнению Inter-предсказания используются для построения списков референсных изображений (reference picture list). Когда выполняется однонаправленное предсказание (P-prediction), строится один такой список, называемый RefPicList0. Для B-предсказания выполняется построение двух списков: RefPicList0 и RefPicList1. Понятно, что в эти списки заносятся только те значения POC, для которых в 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 блока. Если и после этого список оказывается не заполнен, то оставшиеся пустыми позиции заполняются нулевыми векторами движения.
Рис.1. Примеры расположения блоков-кандидатов относительно текущего кодируемого блока (указан на рисунке серым цветом)
Блок-кандидат CandB выбирается из трех блоков CandB0, CandB1 и CandB2, которые определяются положением трех пикселов, отмеченных на рис.1 как PB0, PB1 и PB2. Блоком CandB0 является блок, содержащий пиксел PB0, блоком CandB1 – содержащий пиксел PB1, блоком CandB2 – PB2.
Итак, на первом этапе посторения списка из двух блоков {CandA, CandB} производится отбор одного кандидата из блоков CandA0 и CandA1, и одного кандидата из блоков CandB0, CandB1 и CandB2. Отбор производится в порядке нумерации блоков-кандидатов. Таким образом, при выборе блока CandA, сначала проверяется блок CandA0, а затем – блок CandA1. Проверка заключается в выполнении следующих условий.
- Блок-кандидат уже закодирован, причем закодирован в режиме Inter.
- Блок-кандидат имеет тот же референсный кадр, что и кодируемый блок.
Рис.2. Обозначения, используемые при масштабировании. В примере на рисунке tb=25-23=2, td=23-19=4.
Как уже было сказано, когда список {CandA, CandB} оказывается не заполнен после проверки пространственных блоков-кандидатов, в него добавляется, так называемый, co-located блок. Этот блок находится на референсном кадре, номер которого передается в заголовочной части кодируемого кадра. В качестве co-located блока может использоваться один из двух кандидатов, координаты которых в референсном кадре определяется относительно координат кодируемого блока так, как показано на рис.3. Если блок-кандидат, содержащий пиксел C0, может использоваться в качестве co-located блока (т. е. он закодирован в Inter режиме и принадлежит к LCU с тем же номером, что и кодируемый блок), то он помещается на первое свободное место в список {CandA, CandB}. В противном случае на это место помещается блок-кандидат, содержащий пиксел С1 (опять же, если он может использоваться в качестве co-located блока).
После добавления в список {CandA, CandB} co-located блока все оставшиеся свободными места в списке заполняются нулевыми векторами движения.
Рис. 3
Олег Пономарев — специалист в области распространения радиоволн, статистической радиофизики, доцент кафедры радиофизики НИ ТГУ, кандидат физико-математических наук. 16 лет занимается вопросами видео кодирования и цифровой обработки сигналов. Руководитель исследовательской лаборатории Elecard.