diff --git a/Demo/sgi/sv/README b/Demo/sgi/sv/README new file mode 100644 index 00000000000..ac0d497e6b3 --- /dev/null +++ b/Demo/sgi/sv/README @@ -0,0 +1,9 @@ +Demo programs for the SGI Video library for the Indigo (IRIX 4.0.5). +These are more-or-less literal translations of the C programs from the +Indigo Video Programming Guide, by Sjoerd Mullender, with minor +changes by Guido. + +simpleinput.py Live video in a resizable window +rgbgrab.py Grab still frames +contcapt.py Continuous capturing (to a window) +burstcapt.py Burst capturing diff --git a/Demo/sgi/sv/burstcapt.py b/Demo/sgi/sv/burstcapt.py new file mode 100755 index 00000000000..b1f0a165788 --- /dev/null +++ b/Demo/sgi/sv/burstcapt.py @@ -0,0 +1,43 @@ +import sv, SV +import gl, GL, DEVICE + +def main(): + format = SV.RGB8_FRAMES + requestedwidth = SV.PAL_XMAX + queuesize = 2 + + v = sv.OpenVideo() + svci = (format, requestedwidth, 0, queuesize, 0) + + svci, buffer, bitvec = v.CaptureBurst(svci) + [bitvec] + + w, h = svci[1:3] + framesize = w * h + + gl.prefposition(300, 300+w-1, 100, 100+h-1) + gl.foreground() + win = gl.winopen('Burst Capture') + gl.RGBmode() + gl.gconfig() + gl.qdevice(DEVICE.LEFTMOUSE) + gl.qdevice(DEVICE.ESCKEY) + + for i in range(svci[3]): + inverted_frame = sv.RGB8toRGB32(1, \ + buffer[i*framesize:(i+1)*framesize], w, h) + gl.lrectwrite(0, 0, w-1, h-1, inverted_frame) + while 1: + dev, val = gl.qread() + if dev == DEVICE.LEFTMOUSE and val == 1: + break + if dev == DEVICE.REDRAW: + gl.lrectwrite(0, 0, w-1, h-1, inverted_frame) + if dev == DEVICE.ESCKEY: + v.CloseVideo() + gl.winclose(win) + return + v.CloseVideo() + gl.winclose(win) + +main() diff --git a/Demo/sgi/sv/contcapt.py b/Demo/sgi/sv/contcapt.py new file mode 100755 index 00000000000..4d2e88865e2 --- /dev/null +++ b/Demo/sgi/sv/contcapt.py @@ -0,0 +1,107 @@ +import sys +import sv, SV +import gl, GL, DEVICE + +def main(): + format = SV.RGB8_FRAMES + framerate = 25 + queuesize = 16 + samplingrate = 2 + + 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 + framefreq = 25 + else: + width = SV.NTSC_XMAX + height = SV.NTSC_YMAX + framefreq = 30 + + # Allow resizing window if capturing RGB frames, which can be scaled + if format == SV.RGB8_FRAMES: + gl.keepaspect(width, height) + gl.maxsize(width, height) + gl.stepunit(8, 6) + gl.minsize(120, 90) + else: + if format == SV.YUV411_FRAMES_AND_BLANKING_BUFFER: + height = height + SV.BLANKING_BUFFER_SIZE + gl.prefposition(300, 300+width-1, 100, 100+height-1) + + # Open the window + gl.foreground() + win = gl.winopen('Continuous Capture') + gl.RGBmode() + gl.gconfig() + if format == SV.RGB8_FRAMES: + width, height = gl.getsize() + gl.pixmode(GL.PM_SIZE, 8) + else: + gl.pixmode(GL.PM_SIZE, 32) + + svci = (format, width, height, queuesize, samplingrate) + [svci] + + svci = v.InitContinuousCapture(svci) + width, height = svci[1:3] + [svci] + + hz = gl.getgdesc(GL.GD_TIMERHZ) + gl.noise(DEVICE.TIMER0, hz / framerate) + gl.qdevice(DEVICE.TIMER0) + gl.qdevice(DEVICE.WINQUIT) + gl.qdevice(DEVICE.WINSHUT) + gl.qdevice(DEVICE.ESCKEY) + + ndisplayed = 0 + lastfieldID = 0 + + while 1: + dev, val = gl.qread() + if dev == DEVICE.REDRAW: + oldw = width + oldh = height + width, height = gl.getsize() + if oldw != width or oldh != height: + v.EndContinuousCapture() + gl.viewport(0, width-1, 0, height-1) + svci = (svci[0], width, height) + svci[3:] + svci = v.InitContinuousCapture(svci) + width, height = svci[1:3] + [svci] + if ndisplayed: + print 'lost', + print fieldID/(svci[4]*2) - ndisplayed, + print 'frames' + ndisplayed = 0 + elif dev == DEVICE.TIMER0: + try: + captureData, fieldID = v.GetCaptureData() + except RuntimeError, val: + if val <> 'no data available': + print val + continue + if fieldID - lastfieldID <> 2*samplingrate: + print lastfieldID, fieldID + lastfieldID = fieldID + if svci[0] == SV.RGB8_FRAMES: + rgbbuf = captureData.InterleaveFields(1) + else: + rgbbuf = captureData.YUVtoRGB(1) + captureData.UnlockCaptureData() + gl.lrectwrite(0, 0, width-1, height-1, rgbbuf) + ndisplayed = ndisplayed + 1 + elif dev in (DEVICE.ESCKEY, DEVICE.WINQUIT, DEVICE.WINSHUT): + v.EndContinuousCapture() + v.CloseVideo() + gl.winclose(win) + print fieldID, ndisplayed, svci[4] + print 'lost', fieldID/(svci[4]*2) - ndisplayed, + print 'frames' + return + +main() diff --git a/Demo/sgi/sv/rgbgrab.py b/Demo/sgi/sv/rgbgrab.py new file mode 100755 index 00000000000..8013a531f42 --- /dev/null +++ b/Demo/sgi/sv/rgbgrab.py @@ -0,0 +1,81 @@ +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() diff --git a/Demo/sgi/sv/simpleinput.py b/Demo/sgi/sv/simpleinput.py new file mode 100755 index 00000000000..97b75fafb04 --- /dev/null +++ b/Demo/sgi/sv/simpleinput.py @@ -0,0 +1,22 @@ +import sv, SV +import gl, DEVICE + +def main(): + gl.foreground() + gl.prefsize(SV.PAL_XMAX, SV.PAL_YMAX) + win = gl.winopen('video test') + v = sv.OpenVideo() + params = [SV.VIDEO_MODE, SV.COMP, SV.BROADCAST, SV.PAL] + v.SetParam(params) + v.BindGLWindow(win, SV.IN_REPLACE) + gl.qdevice(DEVICE.ESCKEY) + gl.qdevice(DEVICE.WINQUIT) + gl.qdevice(DEVICE.WINSHUT) + while 1: + dev, val = gl.qread() + if dev in (DEVICE.ESCKEY, DEVICE.WINSHUT, DEVICE.WINQUIT): + v.CloseVideo() + gl.winclose(win) + return + +main()