Рассмотрим теперь процесс декодирования для DC-коэффициентов интра блоков. Они кодированы кодом переменной длины, записанным в числе dct_dc_size. Если оно не равно нулю, то далее идет код фиксированной длины dc_dct_differential длиной dct_dc_size бит. Таким образом, из закодированных данных получается разностное значение, которое складывается с предсказанным, в результате чего получается DC-коэффициент.
Если сс=0, то для определения dct_dc_size используется табл.П.2.39, иначе – табл.П.2.40.
Для каждой цветовой компоненты используется свой предсказатель (всего 3). К нему прибавляется разность, в результате чего получается коэффициент. После этого значение предсказателя становится равным значению коэффициента. Периодически значение предсказателя сбрасывается в значение 128,256,512 или 1024, в зависимости от того, сколько бит выделяется на кодирование (8,9,10,11). Сброс предсказателя происходит:
Предсказатели обозначаются как dc_dct_pred[cc]. Значение DC-коэффициента QFS[0] может быть найдено следующим образом:
if ( dc_dct_size == 0 ) { dct_diff = 0; } else { half_range = 2 ^ ( dc_dct_size - 1 ); if ( dc_dct_differential >= half_range ) dct_diff = dc_dct_differential; else dct_diff = (dc_dct_differential + 1) - (2 * half_range); } QFS[0] = dc_dct_pred[cc] + dct_diff; dc_dct_pred[cc] = QFS[0] |
Все остальные коэффициенты кроме DC-коэффициентов интра блоков кодированы с использованием табл.В-14, В-15, В-16 стандарта. Код переменной длины сначала декодируется на основе табл.В-14 и В-15. Декодированное значение может означать одно из трех:
- конец блока. В этом случае оставшиеся коэффициенты блока приравниваются нулю;
- «обычный» коэффициент, для которого декодируется значение серии и уровня, а затем знака. Серия коэффициентов приравнивается к нулю, а следующий за ней коэффициент – к уровню с учетом знака;
- коэффициент, кодированный ESC-последовательностью. В этом случае значения серии и уровня кодируются кодами фиксированной длины, как это описано ниже.
При кодировании DC-коэффициента не интраблока таблица В-14 модифицируется в одной строке для серии=0 и уровню +-1.
Смысл применения ESC-последовательностей состоит в следующем. Существует много сочетаний серий и уровня, для которых нет кода переменной длины. Для кодирования этих редко встречающихся комбинаций и применяются ESC-последовательности, описанные в табл.В-16. При этом 6 бит отводится на кодирование длины серии и 12 бит на кодирование значения с учетом знака.
Итак, в результате декодирования кода переменной длины мы получили для каждого блока 64 коэффициента, обозначаемых как QFS[n]. Этот одномерный массив необходимо преобразовать в двумерный QF[v][u]. Для этого определены два шаблона сканирования. Какой из них применен определяется значением параметра alternate_scan в дополнении к кодированию изображения.
Если этот флаг равен нулю, то сканирование следующее:
u |
|||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
||
0 |
0 |
1 |
5 |
6 |
14 |
15 |
27 |
28 |
|
1 |
2 |
4 |
7 |
13 |
16 |
26 |
29 |
42 |
|
2 |
3 |
8 |
12 |
17 |
25 |
30 |
41 |
43 |
|
3 |
9 |
11 |
18 |
24 |
31 |
40 |
44 |
53 |
|
4 |
10 |
19 |
23 |
32 |
39 |
45 |
52 |
54 |
|
5 |
20 |
22 |
33 |
38 |
46 |
51 |
55 |
60 |
|
6 |
21 |
34 |
37 |
47 |
50 |
56 |
59 |
61 |
|
v |
7 |
35 |
36 |
48 |
49 |
57 |
58 |
62 |
63 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.