mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			243 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import gl, GL | ||
|  | import VFile | ||
|  | import os | ||
|  | 
 | ||
|  | 
 | ||
|  | class InputViewer: | ||
|  | 
 | ||
|  | 	def init(self, filename, title, qsize): | ||
|  | 		try: | ||
|  | 			self.vin = VFile.VinFile().init(filename) | ||
|  | 		except (EOFError, VFile.Error): | ||
|  | 			raise IOError, 'bad video input file' | ||
|  | 		if not title: | ||
|  | 			title = os.path.split(filename)[1] | ||
|  | 		self.filename = filename | ||
|  | 		self.title = title | ||
|  | 		self.qsize = qsize | ||
|  | 		gl.foreground() | ||
|  | 		gl.prefsize(self.vin.width, self.vin.height) | ||
|  | 		self.wid = -1 | ||
|  | 		self.reset() | ||
|  | 		return self | ||
|  | 
 | ||
|  | 	def close(self): | ||
|  | 		self.vin.close() | ||
|  | 		if self.wid > 0: | ||
|  | 			gl.winclose(self.wid) | ||
|  | 
 | ||
|  | 	def rewind(self): | ||
|  | 		self.vin.rewind() | ||
|  | 		self.reset() | ||
|  | 
 | ||
|  | 	def getinfo(self): | ||
|  | 		return self.vin.getinfo() | ||
|  | 
 | ||
|  | 	# Internal | ||
|  | 	def reset(self): | ||
|  | 		if self.wid > 0: | ||
|  | 			gl.winset(self.wid) | ||
|  | 			gl.clear() | ||
|  | 			self.vin.initcolormap() | ||
|  | 		self.queue = [] | ||
|  | 		self.qindex = 0 | ||
|  | 		self.lost = 0 | ||
|  | 		self.lastt = 0 | ||
|  | 		self.eofread = 0 | ||
|  | 
 | ||
|  | 	# Internal | ||
|  | 	def fillq(self): | ||
|  | 		if self.qindex < len(self.queue) or self.eofread: return | ||
|  | 		try: | ||
|  | 			t, d, cd = self.vin.getnextframe() | ||
|  | 		except EOFError: | ||
|  | 			self.eofread = 1 | ||
|  | 			return | ||
|  | 		dt = t - self.lastt | ||
|  | 		self.lastt = t | ||
|  | 		self.queue.append(dt, d, cd) | ||
|  | 		while len(self.queue) > self.qsize: | ||
|  | 			del self.queue[0] | ||
|  | 			self.qindex = self.qindex - 1 | ||
|  | 			self.lost = self.lost + 1 | ||
|  | 
 | ||
|  | 	def show(self): | ||
|  | 		if self.wid < 0: | ||
|  | 			gl.foreground() | ||
|  | 			gl.prefsize(self.vin.width, self.vin.height) | ||
|  | 			self.wid = gl.winopen(self.title) | ||
|  | 			gl.clear() | ||
|  | 			self.vin.initcolormap() | ||
|  | 		self.fillq() | ||
|  | 		gl.winset(self.wid) | ||
|  | 		if self.qindex >= len(self.queue): | ||
|  | 			gl.clear() | ||
|  | 			return | ||
|  | 		dt, d, cd = self.queue[self.qindex] | ||
|  | 		self.vin.showframe(d, cd) | ||
|  | 
 | ||
|  | 	def redraw(self, wid): | ||
|  | 		if wid == self.wid >= 0: | ||
|  | 			gl.winset(self.wid) | ||
|  | 			gl.reshapeviewport() | ||
|  | 			self.show() | ||
|  | 
 | ||
|  | 	def get(self): | ||
|  | 		if self.qindex >= len(self.queue): | ||
|  | 			self.fillq() | ||
|  | 			if self.eofread: | ||
|  | 				return None | ||
|  | 		item = self.queue[self.qindex] | ||
|  | 		self.qindex = self.qindex + 1 | ||
|  | 		return item | ||
|  | 
 | ||
|  | 	def backup(self): | ||
|  | 		if self.qindex == 0: | ||
|  | 			return 0 | ||
|  | 		self.qindex = self.qindex - 1 | ||
|  | 		return 1 | ||
|  | 
 | ||
|  | 	def tell(self): | ||
|  | 		return self.lost + self.qindex | ||
|  | 
 | ||
|  | 	def qsizes(self): | ||
|  | 		return self.qindex, len(self.queue) - self.qindex | ||
|  | 
 | ||
|  | 
 | ||
|  | class OutputViewer: | ||
|  | 
 | ||
|  | 	def init(self, filename, title, qsize): | ||
|  | 		try: | ||
|  | 			self.vout = VFile.VoutFile().init(filename) | ||
|  | 		except (EOFError, VFile.Error): | ||
|  | 			raise IOError, 'bad video output file' | ||
|  | 		if not title: | ||
|  | 			title = os.path.split(filename)[1] | ||
|  | 		self.filename = filename | ||
|  | 		self.title = title | ||
|  | 		self.qsize = qsize | ||
|  | 		gl.foreground() | ||
|  | 		self.wid = -1 | ||
|  | 		self.reset() | ||
|  | 		return self | ||
|  | 
 | ||
|  | 	def close(self): | ||
|  | 		while self.queue: | ||
|  | 			self.flushq() | ||
|  | 		self.vout.close() | ||
|  | 		if self.wid > 0: | ||
|  | 			gl.winclose(self.wid) | ||
|  | 
 | ||
|  | 	def rewind(self): | ||
|  | 		info = self.vout.getinfo() | ||
|  | 		self.vout.close() | ||
|  | 		self.vout = VFile.VoutFile().init(self.filename) | ||
|  | 		self.vout.setinfo(info) | ||
|  | 		self.reset() | ||
|  | 
 | ||
|  | 	def getinfo(self): | ||
|  | 		return self.vout.getinfo() | ||
|  | 
 | ||
|  | 	def setinfo(self, info): | ||
|  | 		if info == self.getinfo(): return # No change | ||
|  | 		self.vout.setinfo(info) | ||
|  | 		if self.wid > 0: | ||
|  | 			gl.winclose(self.wid) | ||
|  | 			self.wid = -1 | ||
|  | 
 | ||
|  | 	# Internal | ||
|  | 	def reset(self): | ||
|  | 		if self.wid > 0: | ||
|  | 			gl.winset(self.wid) | ||
|  | 			gl.clear() | ||
|  | 			self.vout.initcolormap() | ||
|  | 		self.queue = [] | ||
|  | 		self.spares = [] | ||
|  | 		self.written = 0 | ||
|  | 		self.lastt = 0 | ||
|  | 
 | ||
|  | 	# Internal | ||
|  | 	def flushq(self): | ||
|  | 		if self.written == 0: | ||
|  | 			self.vout.writeheader() | ||
|  | 		dt, d, cd = self.queue[0] | ||
|  | 		self.lastt = self.lastt + dt | ||
|  | 		self.vout.writeframe(self.lastt, d, cd) | ||
|  | 		del self.queue[0] | ||
|  | 		self.written = self.written + 1 | ||
|  | 
 | ||
|  | 	def show(self): | ||
|  | 		if self.wid < 0: | ||
|  | 			gl.foreground() | ||
|  | 			gl.prefsize(self.vout.width, self.vout.height) | ||
|  | 			self.wid = gl.winopen(self.title) | ||
|  | 			gl.clear() | ||
|  | 			self.vout.initcolormap() | ||
|  | 		gl.winset(self.wid) | ||
|  | 		if not self.queue: | ||
|  | 			gl.clear() | ||
|  | 			return | ||
|  | 		dt, d, cd = self.queue[-1] | ||
|  | 		self.vout.showframe(d, cd) | ||
|  | 
 | ||
|  | 	def redraw(self, wid): | ||
|  | 		if wid == self.wid >= 0: | ||
|  | 			gl.winset(self.wid) | ||
|  | 			gl.reshapeviewport() | ||
|  | 			self.show() | ||
|  | 
 | ||
|  | 	def backup(self): | ||
|  | 		if len(self.queue) < 1: return 0 | ||
|  | 		self.spares.insert(0, self.queue[-1]) | ||
|  | 		del self.queue[-1] | ||
|  | 		return 1 | ||
|  | 
 | ||
|  | 	def forward(self): | ||
|  | 		if not self.spares: return 0 | ||
|  | 		self.queue.append(self.spares[0]) | ||
|  | 		del self.spares[0] | ||
|  | 		return 1 | ||
|  | 
 | ||
|  | 	def put(self, item): | ||
|  | 		self.queue.append(item) | ||
|  | 		self.spares = [] | ||
|  | 		while len(self.queue) > self.qsize: | ||
|  | 			self.flushq() | ||
|  | 
 | ||
|  | 	def tell(self): | ||
|  | 		return self.written + len(self.queue) | ||
|  | 
 | ||
|  | 	def qsizes(self): | ||
|  | 		return len(self.queue), len(self.spares) | ||
|  | 
 | ||
|  | 
 | ||
|  | def test(): | ||
|  | 	import sys | ||
|  | 	a = InputViewer().init(sys.argv[1], '') | ||
|  | 	b = OutputViewer().init(sys.argv[2], '') | ||
|  | 	b.setinfo(a.getinfo()) | ||
|  | 	 | ||
|  | 	while 1: | ||
|  | 		a.show() | ||
|  | 		data = a.get() | ||
|  | 		if data is None: | ||
|  | 			break | ||
|  | 		b.put(data) | ||
|  | 		b.show() | ||
|  | 
 | ||
|  | 	while a.backup(): | ||
|  | 		data = a.get() | ||
|  | 		b.put(data) | ||
|  | 		b.show() | ||
|  | 		if a.backup(): a.show() | ||
|  | 	 | ||
|  | 	while 1: | ||
|  | 		data = a.get() | ||
|  | 		if data is None: | ||
|  | 			break | ||
|  | 		b.put(data) | ||
|  | 		b.show() | ||
|  | 		a.show() | ||
|  | 
 | ||
|  | 	b.close() |