8 r.append(ord(f.read(1)))
17 return r[0] << 8 | r[1]
21 return r[0] << 24 | r[1] << 16 | r[2] << 8 | r[3];
23 def require(f, data, what):
24 r = read(f, len(data))
30 f = open(sys.argv[1], 'rb')
32 require(f, [0xff, 0x4f], 'SOC')
33 require(f, [0xff, 0x51], 'SIZ')
35 print '\tlength', size
37 require(f, [0xff, 0x52], 'COD')
39 print '\tlength', size
40 coding_style = read_8(f)
41 print '\tcoding style %2x' % coding_style
42 print '\tprogression order',
54 print '\tlayers', read_16(f)
55 print '\tmulti-component transform', read_8(f)
57 print '\ttransform levels', levels
58 print '\tcode-block sizes %dx%d' % (read_8(f), read_8(f))
59 print '\tmode switches %2x' % read_8(f)
60 print '\twavelet transform',
63 print '9/7 irreversible'
65 print '5/3 reversible'
67 print '\tprecinct sizes ',
68 for i in range(0, levels + 1):
71 require(f, [0xff, 0x5C], 'QCD')
73 print '\tlength', size
76 tile_part_length = None
83 print '\tlength', size
85 elif r == [0xff, 0x5c]:
88 print '\tlength', size
90 elif r == [0xff, 0x5d]:
93 print '\tlength', size
95 elif r == [0xff, 0x64]:
98 print '\tlength', size
100 elif r == [0xff, 0x55]:
103 print '\tlength', size
105 elif r == [0xff, 0x90]:
108 print '\tlength', size
109 print '\ttile index', read_16(f)
110 tile_part_length = read_32(f)
111 print '\ttile-part length', tile_part_length
112 print '\ttile-part index', read_8(f)
113 print '\tnumber of tile-parts', read_8(f)
114 elif r == [0xff, 0x93]:
116 f.seek(tile_part_length - 14, 1)
117 elif r == [0xff, 0xd9]: