1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static void _t2(rev_inv_xform, Int, DIMS)(Int* p);
/* private functions ------------------------------------------------------- */
/* reversible inverse lifting transform of 4-vector */
static void
_t1(rev_inv_lift, Int)(Int* p, uint s)
{
Int x, y, z, w;
x = *p; p += s;
y = *p; p += s;
z = *p; p += s;
w = *p; p += s;
/*
** high-order Lorenzo transform (P4 Pascal matrix)
** ( 1 0 0 0) (x)
** ( 1 1 0 0) (y)
** ( 1 2 1 0) (z)
** ( 1 3 3 1) (w)
*/
w += z;
z += y; w += z;
y += x; z += y; w += z;
p -= s; *p = w;
p -= s; *p = z;
p -= s; *p = y;
p -= s; *p = x;
}
/* decode block of integers using reversible algorithm */
static uint
_t2(rev_decode_block, Int, DIMS)(bitstream* stream, int minbits, int maxbits, Int* iblock)
{
/* decode number of significant bits */
int bits = PBITS;
int prec = (int)stream_read_bits(stream, PBITS) + 1;
cache_align_(UInt ublock[BLOCK_SIZE]);
/* decode integer coefficients */
bits += _t1(decode_ints, UInt)(stream, maxbits - bits, prec, ublock, BLOCK_SIZE);
/* read at least minbits bits */
if (bits < minbits) {
stream_skip(stream, minbits - bits);
bits = minbits;
}
/* reorder unsigned coefficients and convert to signed integer */
_t1(inv_order, Int)(ublock, iblock, PERM, BLOCK_SIZE);
/* perform decorrelating transform */
_t2(rev_inv_xform, Int, DIMS)(iblock);
return bits;
}