После инверсного квантования вычисляется обратное ДКП. Вычисленные значения приводятся к диапазону -256…255. Если макроблок пропущен или если блок в макроблоке не кодировался, то соответствующие отсчеты будут равны нулю.
Компенсация движения основана на объединении предсказания пикселов по предыдущим кадрам с использованием вычисленных для данного кадра отсчетов на выходе ОДКП. Упрощенная схема этого процесса показана на рис.1.6.3.
Рис.1.6.3. Упрощенная блок-схема процесса компенсации движения
В общем случае для каждого блока формируется до 4 предсказаний, объединяющиеся вместе для получения результирующего предсказания блока p[y][x]. Показанный на рис.1.1.2.14 режим насыщения нужен для предотвращения получения отрицательных значений. В случае интра блоков предсказание не выполняется и p[y][x]=0. Хотя и в интра макроблоках могут быть вектора компенсации движения, которые могут использоваться в случае ошибок битового потока, приводимых к невозможности извлечения информации и коэффициентах. Как должен декодер действовать в этом случае в стандарте не описано. Далее будут приведены некоторые соображения.
В случае если блок не кодировался, в том числе и по причине пропуска макроблока, то f[y][x]=0 и декодер оперирует только с p[y][x].
Существует два основных режима предсказания: предсказание на уровне поля и на уровне кадра. Поля и кадры на основе которых делается предсказание могут быть как КК, так и ПК типа. В ПК кадрах используется только предсказание на уровне поля, а в КК кадрах – оба режима. Кроме двух основных режимов предсказания существует еще две разновидности подрежимов предсказания.
Для уменьшения требуемого числа бит, отводимых на вектора компенсации движения, они кодируются разностно по отношению к предыдущим векторам. Для восстановления векторов декодер должен управлять 4 предсказателями (для горизонтальной и для вертикальной компоненты), обозначаемыми PMV[r][s][t]. Для каждого предсказания вначале вычисляется вектор движения vector’[r][s][t]. Потом он масштабируется в зависимости от формата цвета (4:2:0, 4:2:2 или 4:4:4), и получаются вектора для каждой цветовой компоненты vector[r][s][t]. Индексы r, s, t описаны в табл.П.2.42.
Вектора компенсации движения vector’[r][s][t] могут быть вычислены следующим образом:
r_size = f_code[s][t] - 1 f = 1 << r_size high = ( 16 * f ) - 1; low = ( (-16) * f ); range = ( 32 * f ); if ( (f == 1) || (motion_code[r][s][t] == 0) ) delta = motion_code[r][s][t] ; else { delta = ( ( Abs(motion_code[r][s][t]) - 1 ) * f ) + motion_residual[r][s][t] + 1; if (motion_code[r][s][t] < 0) delta = - delta; } prediction = PMV[r][s][t]; if ( (mv_format == “field”) && (t==1) && (picture_structure == “Frame picture”) ) prediction = PMV[r][s][t] DIV 2; vector’[r][s][t]= prediction + delta; if (vector’[r][s][t] < low ) vector’[r][s][t] = vector’[r][s][t] + range; if (vector’[r][s][t] > high) vector’[r][s][t] = vector’[r][s][t] - range; if ( (mv_format == “field”) && (t==1) && (picture_structure == “Frame picture”) ) PMV[r][s][t] = vector’[r][s][t] * 2; else PMV[r][s][t] = vector’[r][s][t]; |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.