import sys import sv, SV import gl, GL, DEVICE import time def main(): v = sv.OpenVideo() # Determine maximum window size based on signal standard param = [SV.BROADCAST, 0] v.GetParam(param) if param[1] == SV.PAL: width = SV.PAL_XMAX height = SV.PAL_YMAX elif param[1] == SV.NTSC: width = SV.NTSC_XMAX height = SV.NTSC_YMAX else: print 'Unknown video standard', param[1] sys.exit(1) # Initially all windows are half size grabwidth, grabheight = width/2, height/2 # Open still window gl.foreground() gl.prefsize(grabwidth, grabheight) still_win = gl.winopen('Grabbed frame') gl.keepaspect(width, height) gl.maxsize(width, height) gl.winconstraints() gl.RGBmode() gl.gconfig() gl.clear() gl.pixmode(GL.PM_SIZE, 8) # Open live window gl.foreground() gl.prefsize(grabwidth, grabheight) live_win = gl.winopen('Live video') gl.keepaspect(width, height) gl.maxsize(width, height) gl.winconstraints() # Bind live video v.SetSize(gl.getsize()) v.BindGLWindow(live_win, SV.IN_REPLACE) print 'Use leftmouse to grab frame' gl.qdevice(DEVICE.LEFTMOUSE) gl.qdevice(DEVICE.WINQUIT) gl.qdevice(DEVICE.WINSHUT) gl.qdevice(DEVICE.ESCKEY) frame = None while 1: dev, val = gl.qread() if dev == DEVICE.LEFTMOUSE and val == 0: w, h, fields = v.CaptureOneFrame(SV.RGB8_FRAMES, \ grabwidth, grabheight) frame = sv.InterleaveFields(1, fields, w, h) gl.winset(still_win) gl.lrectwrite(0, 0, w - 1, h - 1, frame) gl.winset(live_win) if dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT): v.CloseVideo() gl.winclose(live_win) gl.winclose(still_win) break if dev == DEVICE.REDRAW and val == still_win: gl.winset(still_win) gl.reshapeviewport() gl.clear() grabwidth, grabheight = gl.getsize() if frame: gl.lrectwrite(0, 0, w - 1, h - 1, frame) gl.winset(live_win) if dev == DEVICE.REDRAW and val == live_win: v.SetSize(gl.getsize()) v.BindGLWindow(live_win, SV.IN_REPLACE) main()