Improve hacks/stress.py a bit.
[dcpomatic.git] / hacks / dump_j2k.py
1 #!/usr/bin/python
2
3 import sys
4
5 def read(f, n):
6     r = []
7     for i in range(0, n):
8         r.append(ord(f.read(1)))
9     return r
10
11 def read_8(f):
12     r = read(f, 1)
13     return r[0]
14
15 def read_16(f):
16     r = read(f, 2)
17     return r[0] << 8 | r[1]
18
19 def read_32(f):
20     r = read(f, 4)
21     return r[0] << 24 | r[1] << 16 | r[2] << 8 | r[3];
22
23 def require(f, data, what):
24     r = read(f, len(data))
25     if r != data:
26         print r
27         raise Exception()
28     print what
29
30 def dump(f, n, p):
31     print '\t %s' % p,
32     for i in range(0, n):
33         print '%02x' % ord(f.read(1)),
34         if (i % 16) == 15:
35             print '\n\t %s' % p,
36     print '\n'
37
38 f = open(sys.argv[1], 'rb')
39
40 require(f, [0xff, 0x4f], 'SOC')
41 require(f, [0xff, 0x51], 'SIZ')
42 size = read_16(f)
43 print '\tlength', size
44 f.seek(size - 2, 1)
45 require(f, [0xff, 0x52], 'COD')
46 size = read_16(f)
47 print '\tlength', size
48 coding_style = read_8(f)
49 print '\tcoding style %2x' % coding_style
50 print '\tprogression order',
51 po = read_8(f)
52 if po == 0:
53     print 'LRCP'
54 elif po == 1:
55     print 'RLCP'
56 elif po == 2:
57     print 'RPCL'
58 elif po == 3:
59     print 'PCRL'
60 elif po == 4:
61     print 'CPRL'
62 print '\tlayers', read_16(f)
63 print '\tmulti-component transform', read_8(f)
64 levels = read_8(f)
65 print '\ttransform levels', levels
66 print '\tcode-block sizes %dx%d' % (read_8(f), read_8(f))
67 print '\tmode switches %2x' % read_8(f)
68 print '\twavelet transform',
69 wt = read_8(f)
70 if wt == 0:
71     print '9/7 irreversible'
72 else:
73     print '5/3 reversible'
74 if coding_style & 1:
75     print '\tprecinct sizes ',
76     for i in range(0, levels + 1):
77         print read_8(f),
78     print
79 require(f, [0xff, 0x5C], 'QCD')
80 size = read_16(f)
81 print '\tlength', size
82 dump(f, size - 2, 'QCD')
83
84 tile_part_length = None
85
86 while True:
87     r = read(f, 2)
88     if r == [0xff, 0x53]:
89         print 'COC'
90         size = read_16(f)
91         print '\tlength', size
92         dump(f, size - 2, 'COC')
93     elif r == [0xff, 0x5c]:
94         print 'QCD'
95         size = read_16(f)
96         print '\tlength', size
97         dump(f, size - 2, 'QCD')
98     elif r == [0xff, 0x5d]:
99         print 'QCC'
100         size = read_16(f)
101         print '\tlength', size
102         dump(f, size - 2, 'QCC')
103     elif r == [0xff, 0x64]:
104         print 'COM'
105         size = read_16(f)
106         print '\tlength', size
107         dump(f, size - 2, 'COM')
108     elif r == [0xff, 0x55]:
109         print 'TLM'
110         size = read_16(f)
111         print '\tlength', size
112         dump(f, size - 2, 'TLM')
113     elif r == [0xff, 0x90]:
114         print 'SOT'
115         size = read_16(f)
116         print '\tlength', size
117         print '\ttile index', read_16(f)
118         tile_part_length = read_32(f)
119         print '\ttile-part length', tile_part_length
120         print '\ttile-part index', read_8(f)
121         print '\tnumber of tile-parts', read_8(f)
122     elif r == [0xff, 0x93]:
123         print 'SOD'
124         dump(f, tile_part_length - 14, 'SOD')
125     elif r == [0xff, 0xd9]:
126         print 'EOC'
127         sys.exit(0)
128     else:
129         print r
130         raise Exception()