summaryrefslogtreecommitdiff
path: root/hacks/dump_j2k.py
blob: 0d211b1a195683eebbbd9ecd30652cf62db1526c (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/python

import sys

def read(f, n):
    r = []
    for i in range(0, n):
        r.append(ord(f.read(1)))
    return r

def read_8(f):
    r = read(f, 1)
    return r[0]

def read_16(f):
    r = read(f, 2)
    return r[0] << 8 | r[1]

def read_32(f):
    r = read(f, 4)
    return r[0] << 24 | r[1] << 16 | r[2] << 8 | r[3];

def require(f, data, what):
    r = read(f, len(data))
    if r != data:
        print r
        raise Exception()
    print what

f = open(sys.argv[1], 'rb')

require(f, [0xff, 0x4f], 'SOC')
require(f, [0xff, 0x51], 'SIZ')
size = read_16(f)
print '\tlength', size
f.seek(size - 2, 1)
require(f, [0xff, 0x52], 'COD')
size = read_16(f)
print '\tlength', size
coding_style = read_8(f)
print '\tcoding style %2x' % coding_style
print '\tprogression order',
po = read_8(f)
if po == 0:
    print 'LRCP'
elif po == 1:
    print 'RLCP'
elif po == 2:
    print 'RPCL'
elif po == 3:
    print 'PCRL'
elif po == 4:
    print 'CPRL'
print '\tlayers', read_16(f)
print '\tmulti-component transform', read_8(f)
levels = read_8(f)
print '\ttransform levels', levels
print '\tcode-block sizes %dx%d' % (read_8(f), read_8(f))
print '\tmode switches %2x' % read_8(f)
print '\twavelet transform',
wt = read_8(f)
if wt == 0:
    print '9/7 irreversible'
else:
    print '5/3 reversible'
if coding_style & 1:
    print '\tprecinct sizes ',
    for i in range(0, levels + 1):
        print read_8(f),
    print
require(f, [0xff, 0x5C], 'QCD')
size = read_16(f)
print '\tlength', size
f.seek(size - 2, 1)

tile_part_length = None

while True:
    r = read(f, 2)
    if r == [0xff, 0x53]:
        print 'COC'
        size = read_16(f)
        print '\tlength', size
        f.seek(size - 2, 1)
    elif r == [0xff, 0x5c]:
        print 'QCD'
        size = read_16(f)
        print '\tlength', size
        f.seek(size - 2, 1)
    elif r == [0xff, 0x5d]:
        print 'QCC'
        size = read_16(f)
        print '\tlength', size
        f.seek(size - 2, 1)
    elif r == [0xff, 0x64]:
        print 'COM'
        size = read_16(f)
        print '\tlength', size
        f.seek(size - 2, 1)
    elif r == [0xff, 0x55]:
        print 'TLM'
        size = read_16(f)
        print '\tlength', size
        f.seek(size - 2, 1)
    elif r == [0xff, 0x90]:
        print 'SOT'
        size = read_16(f)
        print '\tlength', size
        print '\ttile index', read_16(f)
        tile_part_length = read_32(f)
        print '\ttile-part length', tile_part_length
        print '\ttile-part index', read_8(f)
        print '\tnumber of tile-parts', read_8(f)
    elif r == [0xff, 0x93]:
        print 'SOD'
        f.seek(tile_part_length - 14, 1)
    elif r == [0xff, 0xd9]:
        print 'EOC'
        sys.exit(0)
    else:
        print r
        raise Exception()