summaryrefslogtreecommitdiffstats
path: root/Demo/sgi/video/Vb.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/sgi/video/Vb.py')
-rwxr-xr-xDemo/sgi/video/Vb.py300
1 files changed, 300 insertions, 0 deletions
diff --git a/Demo/sgi/video/Vb.py b/Demo/sgi/video/Vb.py
new file mode 100755
index 0000000..d79113c
--- /dev/null
+++ b/Demo/sgi/video/Vb.py
@@ -0,0 +1,300 @@
+#! /ufs/guido/bin/sgi/python
+
+# Video bag-of-tricks
+
+import sys
+import getopt
+import string
+import os
+sts = os.system('makemap') # Must be before "import fl"
+import sgi
+import gl
+import GL
+import DEVICE
+import fl
+import FL
+import flp
+import watchcursor
+import sv
+import SV
+import VFile
+import VGrabber
+import imageop
+
+ARROW = 0
+WATCH = 1
+watchcursor.defwatch(WATCH)
+
+def main():
+ vb = VideoBagOfTricks().init()
+ while 1:
+ dummy = fl.do_forms()
+ [dummy]
+
+StopCapture = 'StopCapture'
+
+formats = ['rgb24', 'rgb8', 'grey8', 'grey4', 'grey2', \
+ 'grey2_dith', 'mono_dith', 'mono_thresh']
+formatmap = {'rgb24': 'rgb', 'grey8': 'grey'}
+
+class VideoBagOfTricks:
+
+ def init(self):
+ formdef = flp.parse_form('VbForm', 'form')
+ flp.create_full_form(self, formdef)
+ self.setdefaults()
+ self.openvideo()
+ self.makewindow()
+ self.bindvideo()
+ self.capturing = 0
+ self.b_stop.hide_object()
+ self.form.show_form(FL.PLACE_SIZE, FL.TRUE, \
+ 'Video Bag Of Tricks')
+ fl.set_event_call_back(self.do_event)
+ return self
+
+ def setwatch(self):
+ gl.winset(self.form.window)
+ gl.setcursor(WATCH, 0, 0)
+
+ def setarrow(self):
+ gl.winset(self.form.window)
+ gl.setcursor(ARROW, 0, 0)
+
+ def setdefaults(self):
+ self.format = 'rgb8'
+ self.c_format.clear_choice()
+ for label in formats:
+ self.c_format.addto_choice(label)
+ self.c_format.set_choice(1 + formats.index(self.format))
+ self.mono_thresh = 128
+ self.mono_use_thresh = 0
+ self.b_drop.set_button(1)
+ self.b_burst.set_button(0)
+ self.in_rate.set_input('2')
+ self.in_maxmem.set_input('1.0')
+ self.in_nframes.set_input('0')
+ self.in_file.set_input('film.video')
+
+ def openvideo(self):
+ self.video = sv.OpenVideo()
+ param = [SV.BROADCAST, 0]
+ self.video.GetParam(param)
+ if param[1] == SV.PAL:
+ x = SV.PAL_XMAX
+ y = SV.PAL_YMAX
+ elif param[1] == SV.NTSC:
+ x = SV.NTSC_XMAX
+ y = SV.NTSC_YMAX
+ else:
+ print 'Unknown video standard:', param[1]
+ sys.exit(1)
+ self.maxx, self.maxy = x, y
+
+ def makewindow(self):
+ x, y = self.maxx, self.maxy
+ gl.foreground()
+ gl.maxsize(x, y)
+ gl.keepaspect(x, y)
+ gl.stepunit(8, 6)
+ width = 256 # XXX
+ if width:
+ height = width*3/4
+ x1 = 150
+ x2 = x1 + width-1
+ y2 = 768-150
+ y1 = y2-height+1
+ gl.prefposition(x1, x2, y1, y2)
+ self.window = gl.winopen('Vb: initializing')
+ self.settitle()
+ if width:
+ gl.maxsize(x, y)
+ gl.keepaspect(x, y)
+ gl.stepunit(8, 6)
+ gl.winconstraints()
+ gl.qdevice(DEVICE.LEFTMOUSE)
+ gl.qdevice(DEVICE.WINQUIT)
+ gl.qdevice(DEVICE.WINSHUT)
+
+ def settitle(self):
+ gl.winset(self.window)
+ gl.wintitle(self.maketitle())
+
+ def bindvideo(self):
+ x, y = gl.getsize()
+ self.video.SetSize(x, y)
+ drop = self.b_drop.get_button()
+ if drop:
+ param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF]
+ else:
+ param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON]
+ if self.getformat()[:3] == 'rgb':
+ param = param+[SV.COLOR, SV.DEFAULT_COLOR, \
+ SV.DITHER, 1, \
+ SV.INPUT_BYPASS, 0]
+ else:
+ param = param+[SV.COLOR, SV.MONO, SV.DITHER, 0, \
+ SV.INPUT_BYPASS, 1]
+ self.video.BindGLWindow(self.window, SV.IN_REPLACE)
+ self.video.SetParam(param)
+
+ def rebindvideo(self):
+ gl.winset(self.window)
+ self.bindvideo()
+
+ def do_event(self, dev, val):
+ #print 'Event:', dev, val
+ if dev in (DEVICE.WINSHUT, DEVICE.WINQUIT):
+ self.cb_quit()
+ if dev == DEVICE.REDRAW and val == self.window:
+ self.rebindvideo()
+ self.settitle()
+
+ def cb_format(self, *args):
+ i = self.c_format.get_choice()
+ label = format = formats[i-1]
+ if '_' in format:
+ i = string.find(format, '_')
+ format = format[:i]
+ if formatmap.has_key(format):
+ format = formatmap[format]
+ self.format = format
+ #
+ if label == 'mono_thresh':
+ self.mono_use_thresh = 1
+ s = `self.mono_thresh`
+ s = fl.show_input('Please enter mono threshold', s)
+ if s:
+ try:
+ self.mono_thresh = string.atoi(s)
+ except string.atoi_error:
+ fl.show_message( \
+ 'Bad input, using ' + \
+ `self.mono_thresh`)
+ else:
+ self.mono_use_thresh = 0
+ #
+ self.rebindvideo()
+
+ def getformat(self):
+ return self.format
+
+ def cb_rate(self, *args):
+ pass
+
+ def cb_drop(self, *args):
+ self.rebindvideo()
+
+ def cb_burst(self, *args):
+ pass
+
+ def cb_maxmem(self, *args):
+ pass
+
+ def cb_nframes(self, *args):
+ pass
+
+ def cb_file(self, *args):
+ filename = self.in_file.get_input()
+ if filename == '':
+ filename = 'film.video'
+ self.in_file.set_input(filename)
+ self.settitle()
+
+ def cb_open(self, *args):
+ filename = self.in_file.get_input()
+ hd, tl = os.path.split(filename)
+ filename = fl.file_selector('Select file:', hd, '', tl)
+ if filename:
+ hd, tl = os.path.split(filename)
+ if hd == os.getcwd():
+ filename = tl
+ self.in_file.set_input(filename)
+ self.cb_file()
+
+ def cb_play(self, *args):
+ filename = self.in_file.get_input()
+ sts = os.system('Vplay -q ' + filename + ' &')
+
+ def cb_stop(self, *args):
+ if self.capturing:
+ raise StopCapture
+ gl.ringbell()
+
+ def cb_capture(self, *args):
+ self.setwatch()
+ self.cb_file() # Make sure filename is OK
+ filename = self.in_file.get_input()
+ format = self.getformat()
+ vout = VFile.VoutFile().init(filename)
+ vout.setformat(format)
+ gl.winset(self.window)
+ x, y = gl.getsize()
+ vout.setsize(x, y)
+ vout.writeheader()
+ convertor = None
+ if format[:4] == 'grey':
+ s = format[4:]
+ if s:
+ greybits = string.atoi(s)
+ else:
+ greybits = 8
+ # XXX Should get this from somewhere else?
+ if greybits == 2:
+ convertor = imageop.grey2grey2
+ elif greybits == 4:
+ convertor = imageop.grey2grey4
+ elif greybits == -2:
+ convertor = imageop.dither2grey2
+ vformat = SV.RGB8_FRAMES
+ qsize = 0
+ rate = eval(self.in_rate.get_input())
+ info = (vformat, x, y, qsize, rate)
+ ids = []
+ tpf = 50
+ self.video.InitContinuousCapture(info)
+ self.capturing = 1
+ self.setarrow()
+ self.b_stop.show_object()
+ while 1:
+ try:
+ void = fl.check_forms()
+ except StopCapture:
+ self.capturing = 0
+ break
+ try:
+ cd, id = self.video.GetCaptureData()
+ except sv.error:
+ sgi.nap(1)
+ continue
+ ids.append(id)
+ id = id + 2*rate
+ data = cd.InterleaveFields(1)
+ cd.UnlockCaptureData()
+ t = id*tpf
+ if convertor:
+ data = convertor(data, len(data), 1)
+## elif mono and monotreshold >= 0:
+## data = imageop.grey2mono(data, len(data), 1,\
+## monotreshold)
+## elif mono:
+## data = imageop.dither2mono(data, len(data), 1)
+ vout.writeframe(t, data, None)
+ self.setwatch()
+ vout.close()
+ self.b_stop.hide_object()
+ self.video.EndContinuousCapture()
+ self.setarrow()
+
+ def cb_quit(self, *args):
+ raise SystemExit, 0
+
+ def maketitle(self):
+ x, y = gl.getsize()
+ return 'Vb:' + self.in_file.get_input() + ' (%dx%d)' % (x, y)
+
+try:
+ main()
+except KeyboardInterrupt:
+ print '[Interrupt]'
+ sys.exit(1)