#!/usr/bin/python # # Display some basic information about ogg/theora files. # # Daniel Holth , 2004 import oggpy import vorbispy import theorapy import sys import numarray import inspect BUFSIZE=8192 def packetsource(ogg): """Generator to take ogg packets out of a file. Only returns packets from the first stream.""" state = 0 oy = oggpy.sync() og = oggpy.page() op = oggpy.packet() buffer = True # prime the pump while buffer: buffer = ogg.read(BUFSIZE) oy.write(buffer) while(oy.pageout(og)): if state == 0: stream = oggpy.stream(og.serialno()) state += 1 stream.pagein(og) while(stream.packetout(op) == 1): yield op def test(ogg, imagewriter = None): """Display some basic information about a theora stream. arguments: ogg is a file object imagewriter is a pygame_bridge object""" numarray.Error.setMode(all="ignore") ti = theorapy.info() tc = theorapy.comment() td = theorapy.state() yuv = theorapy.yuv_image() theora = 0 for op in packetsource(ogg): if theora == 0: head = ti.decode_header(tc, op) if head >= 0: # print "got theora", head theora += 1 else: # print "no theora" return elif theora < 3: h = ti.decode_header(tc, op) print "header ", h theora += 1 elif theora == 3: td.decode_init(ti) yield (ti, tc, td) print "This theora encoded by: ", tc.get_vendor() print "Trying to decode with: ", theorapy.version_string(), theorapy.version_number() # for i in dir(ti): # if i[0:2] != "__": # try: # value = ti.__getattribute__(i) # if not inspect.ismethod(value): # print i, value # except TypeError: # pass # print "decode init returns", # # print "comments:" # for i in range(tc.size()): # print tc.query_index(i) # print ":end comments" theora += 1 if theora > 3: # print theora theora += 1 assert(td.decode_packetin(op) == 0) assert(td.decode_YUVout(yuv) == 0) # print "yuv info:" # print "y\t%d\t%d\t%d" % (yuv.y_width, yuv.y_height, yuv.y_stride) # print "uv\t%d\t%d\t%d" % (yuv.uv_width, yuv.uv_height, yuv.uv_stride) yield yuv #else: # break if __name__ == "__main__": if len(sys.argv) == 2: filename = sys.argv[1] else: filename = "video.ogg" gen = test(file(filename, "rb")) for i in range(30): print gen.next()