Если же флаг равен 1, то сканирование производится так:
u |
|||||||||
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
||
0 |
0 |
4 |
6 |
20 |
22 |
36 |
38 |
52 |
|
1 |
1 |
5 |
7 |
21 |
23 |
37 |
39 |
53 |
|
2 |
2 |
8 |
19 |
24 |
34 |
40 |
50 |
54 |
|
3 |
3 |
9 |
18 |
25 |
35 |
41 |
51 |
55 |
|
4 |
10 |
17 |
26 |
30 |
42 |
46 |
56 |
60 |
|
5 |
11 |
16 |
27 |
31 |
43 |
47 |
57 |
61 |
|
6 |
12 |
15 |
28 |
32 |
44 |
48 |
58 |
62 |
|
v |
7 |
13 |
14 |
29 |
33 |
45 |
49 |
59 |
63 |
Матрицы квантования также преобразуются из одномерного массива в двумерный, правда используется только первый порядок сканирования.
Инверсное квантование заключается в умножении матрицы коэффициентов ДКП на шаг квантователя. Шаг квантователя модифицируется за счет применения двух механизмов: новая матрица квантования или коэффициент масштабирования (чтобы не передавать целую матрицу).
Процесс инверсного квантования показан на рис.1.6.2.
Рис.1.6.2. Процесс инверсного квантования
Как видно из рис.1.6.2, процесс инверсного квантования состоит из 3 составляющих, которые будут подробно описаны далее. Надо отметить, что метод приведения коэффициентов к нужному диапазону в стандарте отличается от метода MPEG-1.
DC-коэффициенты интра блоков обрабатываются по другому, чем остальные коэффициенты. В интраблоках F’’[0][0] может быть получено за счет умножения QF[0][0] на постоянный множитель intra_dc_mult (постоянный в том смысле, что на него не влияют ни матрица квантования ни масштабирующий коэффициент). Этот множитель связан с параметром intra_dc_precision, используемым в дополнении кодирования изображения. Связь следующая: если точность воспроизведения задается 8,9,10,11 битами, то множитель равен 8,4,2,1, соответственно.
Остальные же коэффициенты обрабатываются на основе матриц квантования и коэффициента масштабирования. Этот коэффициент quantiser_scale передается 5 битами в параметре quantiser_scale_code. Параметр q_scale_type задает вид связи между quantiser_scale_code и quantiser_scale, как это показано в табл.П.2.41.
Для получения F''[v][u] из QF[v][u] для всех коэффициентов, кроме DC-коэффициентов интра блоков применяется выражение
Насыщение заключается в приведении коэффициентов к диапазону от -2048 до 2047 в соответствии с выражением
Контроль правильности заключается в следующем. Во-первых все коэффициенты блока суммируются. Если сумма нечетная, то ничего делать не надо. Если сумма четная, то корректируется коэффициент из правого нижнего угла. Если он нечетный, из него вычитается 1, а если четный, то 1 прибавляется.
В целом, процесс инверсного квантования может быть описан на псевдокоде:
for (v=0; v<8;v++) { for (u=0; u<8;u++) { if ( (u==0) && (v==0) && (macroblock_intra) ) { F''[v][u] = intra_dc_mult * QF[v][u]; } else { if ( macroblock_intra ) { F''[v][u] = ( QF[v][u] * W[w][v][u] * quantiser_scale * 2 ) / 32; } else { F''[v][u] = ( ( ( QF[v][u] * 2 ) + Sign(QF[v][u]) ) * W[w][v][u] * quantiser_scale ) / 32; } } } } sum = 0; for (v=0; v<8;v++) { for (u=0; u<8;u++) { if ( F’'[v][u] > 2047 ) { F’[v][u] = 2047; } else { if ( F’'[v][u] < -2048 ) { F’[v][u] = -2048; } else { F’[v][u] = F'‘[v][u]; } } sum = sum + F’[v][u]; F[v][u] = F’[v][u]; } } if ((sum & 1) == 0) { if ((F[7][7] & 1) != 0) { F[7][7] = F'[7][7] - 1; } else { F[7][7] = F'[7][7] + 1; } } |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.