summaryrefslogtreecommitdiff
path: root/hacks/dump_j2k.py
blob: 79d2af9dc2a8e53429fd838e73706351f0b5dee2 (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
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()