Updated for 2.1b2 distribution.
[python/dscho.git] / Demo / sgi / sv / rgbgrab.py
blob8013a531f42a90ad55f857bb1ffb85e47f31e7e0
1 import sys
2 import sv, SV
3 import gl, GL, DEVICE
4 import time
6 def main():
7 v = sv.OpenVideo()
8 # Determine maximum window size based on signal standard
9 param = [SV.BROADCAST, 0]
10 v.GetParam(param)
11 if param[1] == SV.PAL:
12 width = SV.PAL_XMAX
13 height = SV.PAL_YMAX
14 elif param[1] == SV.NTSC:
15 width = SV.NTSC_XMAX
16 height = SV.NTSC_YMAX
17 else:
18 print 'Unknown video standard', param[1]
19 sys.exit(1)
21 # Initially all windows are half size
22 grabwidth, grabheight = width/2, height/2
24 # Open still window
25 gl.foreground()
26 gl.prefsize(grabwidth, grabheight)
27 still_win = gl.winopen('Grabbed frame')
28 gl.keepaspect(width, height)
29 gl.maxsize(width, height)
30 gl.winconstraints()
31 gl.RGBmode()
32 gl.gconfig()
33 gl.clear()
34 gl.pixmode(GL.PM_SIZE, 8)
36 # Open live window
37 gl.foreground()
38 gl.prefsize(grabwidth, grabheight)
39 live_win = gl.winopen('Live video')
40 gl.keepaspect(width, height)
41 gl.maxsize(width, height)
42 gl.winconstraints()
44 # Bind live video
45 v.SetSize(gl.getsize())
46 v.BindGLWindow(live_win, SV.IN_REPLACE)
48 print 'Use leftmouse to grab frame'
50 gl.qdevice(DEVICE.LEFTMOUSE)
51 gl.qdevice(DEVICE.WINQUIT)
52 gl.qdevice(DEVICE.WINSHUT)
53 gl.qdevice(DEVICE.ESCKEY)
54 frame = None
55 while 1:
56 dev, val = gl.qread()
57 if dev == DEVICE.LEFTMOUSE and val == 0:
58 w, h, fields = v.CaptureOneFrame(SV.RGB8_FRAMES, \
59 grabwidth, grabheight)
60 frame = sv.InterleaveFields(1, fields, w, h)
61 gl.winset(still_win)
62 gl.lrectwrite(0, 0, w - 1, h - 1, frame)
63 gl.winset(live_win)
64 if dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT):
65 v.CloseVideo()
66 gl.winclose(live_win)
67 gl.winclose(still_win)
68 break
69 if dev == DEVICE.REDRAW and val == still_win:
70 gl.winset(still_win)
71 gl.reshapeviewport()
72 gl.clear()
73 grabwidth, grabheight = gl.getsize()
74 if frame:
75 gl.lrectwrite(0, 0, w - 1, h - 1, frame)
76 gl.winset(live_win)
77 if dev == DEVICE.REDRAW and val == live_win:
78 v.SetSize(gl.getsize())
79 v.BindGLWindow(live_win, SV.IN_REPLACE)
81 main()