Recognizes if input is ogg or not.
[xiph.git] / py-ogg2 / examples / writ_decoder.py
blob06b53206c78e1ae29c64b638ddb425c23a1268ff
1 '''
2 function: Ogg Writ reference encoder
3 last mod: $Id: writ_decoder.py,v 1.2 2003/12/01 07:18:51 arc Exp $
5 This is an example for how py-ogg2 can be used to rapidly design a new
6 Ogg codec or test an existing codec's specifications for accuracy.
8 '''
10 import ogg2
11 from struct import unpack
13 def ilog(num) :
14 for x in range(17) :
15 if 2**x >= num+1 :
16 return x
17 return 0
19 # Grab 'em pages!
20 op = ogg2.OggSyncState()
21 infile = open('test.writ.ogg','r')
22 while op.input(infile) :
23 pass
24 pages = []
25 while 1 :
26 page=op.pageout()
27 if page == None :
28 break
29 else :
30 pages.append(page)
32 # Churn 'em into packets!
33 os = ogg2.OggStreamState(pages[0].serialno)
34 for page in pages :
35 os.pagein(page)
37 while 1 :
38 packet = os.packetout()
39 if packet == None :
40 break
41 else :
42 ob=ogg2.OggPackBuff(packet)
43 if ob.read(8)==0 :
44 if ob.read(32) == 1953067639 :
45 version = ob.read(8)
46 print 'Version: %d' % version
47 gnum = ob.read(32)
48 gdom = ob.read(32)
49 print 'Granulerate: %d/%d' % (gnum, gdom)
50 lscx = ob.read(16)
51 lscy = ob.read(16)
52 bitx = ilog(lscx)
53 bity = ilog(lscy)
54 totl = (bitx*2)+(bity*2)+4
55 bitp = ((((totl-1)/8)+1)*8)-totl
56 lnum = ob.read(8)
57 langs = []
58 print 'langs =', lnum
59 for l in range(lnum+1) :
60 llen = ob.read(8)
61 data = ''
62 for a in range(llen) :
63 data = data + chr(ob.read(8))
64 lname = unicode(data)
65 llen = ob.read(8)
66 data = ''
67 for a in range(llen) :
68 data = data + chr(ob.read(8))
69 ldesc = unicode(data)
70 langs.append((lname,ldesc))
71 print 'Language: %s (%s)' % (langs[l][0], langs[l][1])
72 print ''
73 else :
74 print 'Non-Writ Packet?'
75 continue
76 else :
77 print 'Phrase:'
78 gstart = ob.read(32) + (ob.read(32)*4294967296)
79 gdurat = ob.read(32)
80 print ' Time: %d - %d' % (gstart, gstart+gdurat)
81 locx = ob.read(ilog(lscx))
82 locy = ob.read(ilog(lscy))
83 print ' Location: %d,%d' % (locx, locy)
84 locw = ob.read(ilog(lscx))
85 loch = ob.read(ilog(lscy))
86 print ' Size: %d,%d' % (locw, loch)
87 alix = ob.read(2)
88 aliy = ob.read(2)
89 print ' Alignment: %d,%d' % (alix, aliy)
90 ob.read(bitp)
91 for l in range(lnum+1) :
92 tlen = ob.read(8)
93 data = u''
94 for a in range(tlen) :
95 inp = ob.read(8)
96 if inp == None :
97 print 'ERROR: Premature end of packet.'
98 break
99 data = data + unichr(inp)
100 print (u' '+langs[l][0]+u': '+data).encode('latin-1')
101 print ''