diff --git a/Demo/sgi/sv/README b/Demo/sgi/sv/README
new file mode 100644
index 0000000..ac0d497
--- /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 0000000..b1f0a16
--- /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 0000000..4d2e888
--- /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 0000000..8013a53
--- /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 0000000..97b75fa
--- /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()
