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
123
124
125
126
127
128
129
130
|
#!/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
def dump(f, n, p):
print '\t %s' % p,
for i in range(0, n):
print '%02x' % ord(f.read(1)),
if (i % 16) == 15:
print '\n\t %s' % p,
print '\n'
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
dump(f, size - 2, 'QCD')
tile_part_length = None
while True:
r = read(f, 2)
if r == [0xff, 0x53]:
print 'COC'
size = read_16(f)
print '\tlength', size
dump(f, size - 2, 'COC')
elif r == [0xff, 0x5c]:
print 'QCD'
size = read_16(f)
print '\tlength', size
dump(f, size - 2, 'QCD')
elif r == [0xff, 0x5d]:
print 'QCC'
size = read_16(f)
print '\tlength', size
dump(f, size - 2, 'QCC')
elif r == [0xff, 0x64]:
print 'COM'
size = read_16(f)
print '\tlength', size
dump(f, size - 2, 'COM')
elif r == [0xff, 0x55]:
print 'TLM'
size = read_16(f)
print '\tlength', size
dump(f, size - 2, 'TLM')
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'
dump(f, tile_part_length - 14, 'SOD')
elif r == [0xff, 0xd9]:
print 'EOC'
sys.exit(0)
else:
print r
raise Exception()
|