summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-09-24 12:54:35 (GMT)
committerGuido van Rossum <guido@python.org>1992-09-24 12:54:35 (GMT)
commit67b4895291cdb53e63b503426ca4e52b70904a45 (patch)
tree5ee7402f21183983152be323f72dec39c0ab70b7
parent46927bac96ee832822f0770944bc660212fe30c8 (diff)
downloadcpython-67b4895291cdb53e63b503426ca4e52b70904a45.zip
cpython-67b4895291cdb53e63b503426ca4e52b70904a45.tar.gz
cpython-67b4895291cdb53e63b503426ca4e52b70904a45.tar.bz2
Added multicast to Vsend and Vreceive. Updated README. Rediced queue
size to 1 in LiveVideoIn.
-rwxr-xr-xDemo/sgi/video/LiveVideoIn.py2
-rw-r--r--Demo/sgi/video/README8
-rwxr-xr-xDemo/sgi/video/Vreceive.py47
-rwxr-xr-xDemo/sgi/video/Vsend.py21
4 files changed, 68 insertions, 10 deletions
diff --git a/Demo/sgi/video/LiveVideoIn.py b/Demo/sgi/video/LiveVideoIn.py
index 65e5317..920123d 100755
--- a/Demo/sgi/video/LiveVideoIn.py
+++ b/Demo/sgi/video/LiveVideoIn.py
@@ -54,7 +54,7 @@ class LiveVideoIn:
# Initialize capture
v.SetSize(self.realwidth, self.realheight)
dummy = v.InitContinuousCapture(SV.RGB8_FRAMES, \
- self.realwidth, self.realheight, 2, 5)
+ self.realwidth, self.realheight, 1, 5)
self.data = None
self.lpos = 0
return self
diff --git a/Demo/sgi/video/README b/Demo/sgi/video/README
index 335a108..5e14cff 100644
--- a/Demo/sgi/video/README
+++ b/Demo/sgi/video/README
@@ -57,6 +57,10 @@ Vtime.py (unrelated to vtime!!!) Copy a video file,
Vedit.py interactive video editing program
+Vsend.py unicast or multicast live video as UDP packets
+
+Vreceive.py receive transmissions from Vsend
+
These modules are used by the above programs:
@@ -64,6 +68,10 @@ VFile.py classes that read and write CMIF video files
Viewer.py two viewer classes used by Vedit
+LiveVideoIn.py live video input class, used by Vsend
+
+LiveVideoOut.py live video output class, used by Vsend and Vreceive
+
The following are C programs, either for efficiency or because they
need to link with a C library:
diff --git a/Demo/sgi/video/Vreceive.py b/Demo/sgi/video/Vreceive.py
index 8d7150e..415df59 100755
--- a/Demo/sgi/video/Vreceive.py
+++ b/Demo/sgi/video/Vreceive.py
@@ -5,17 +5,22 @@
import sys
import struct
-from socket import *
+from socket import * # syscalls and support functions
+from SOCKET import * # <sys/socket.h>
+from IN import * # <netinet/in.h>
import select
+import struct
import gl, GL, DEVICE
sys.path.append('/ufs/guido/src/video')
import LiveVideoOut
+import regsub
+
+MYGROUP = '225.0.0.250'
+PORT = 5555
PKTMAX = 16*1024
WIDTH = 400
HEIGHT = 300
-HOST = ''
-PORT = 5555
def main():
@@ -23,6 +28,8 @@ def main():
if sys.argv[1:]:
port = eval(sys.argv[1])
+ s = opensocket(MYGROUP, port)
+
width, height = WIDTH, HEIGHT
gl.foreground()
@@ -36,9 +43,6 @@ def main():
lvo = LiveVideoOut.LiveVideoOut().init(wid, (x, y, width, height), \
width, height)
- s = socket(AF_INET, SOCK_DGRAM)
- s.bind(HOST, port)
-
ifdlist = [gl.qgetfd(), s.fileno()]
ofdlist = []
xfdlist = []
@@ -71,4 +75,35 @@ def main():
lvo.close()
+
+# Subroutine to create and properly initialize the receiving socket
+
+def opensocket(group, port):
+
+ # Create the socket
+ s = socket(AF_INET, SOCK_DGRAM)
+
+ # Bind the port to it
+ s.bind('', port)
+
+ # Allow multiple copies of this program on one machine
+ s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) # (Not strictly needed)
+
+ # Look up the group once
+ group = gethostbyname(group)
+
+ # Ugly: construct binary group address
+ group_bytes = eval(regsub.gsub('\.', ',', group))
+ grpaddr = 0
+ for byte in group_bytes: grpaddr = (grpaddr << 8) | byte
+
+ # Construct struct mreq from grpaddr and ifaddr
+ ifaddr = INADDR_ANY
+ mreq = struct.pack('ll', grpaddr, ifaddr)
+
+ # Add group membership
+ s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
+
+ return s
+
main()
diff --git a/Demo/sgi/video/Vsend.py b/Demo/sgi/video/Vsend.py
index 32385f0..f38e965 100755
--- a/Demo/sgi/video/Vsend.py
+++ b/Demo/sgi/video/Vsend.py
@@ -7,16 +7,18 @@ import sys
import time
import struct
from socket import *
+from SOCKET import *
import gl, GL, DEVICE
sys.path.append('/ufs/guido/src/video')
import LiveVideoIn
import LiveVideoOut
+import SV
PKTMAX_UCAST = 16*1024 - 6
PKTMAX_BCAST = 1450
WIDTH = 400
HEIGHT = 300
-HOST = '<broadcast>'
+HOST = '225.0.0.250' # Multicast address!
PORT = 5555
def main():
@@ -28,6 +30,8 @@ def main():
port = PORT
if sys.argv[1:]:
host = sys.argv[1]
+ if host == '-b':
+ host = '<broadcast>'
if sys.argv[2:]:
port = eval(sys.argv[2])
@@ -41,10 +45,13 @@ def main():
wid = gl.winopen('Vsend')
gl.keepaspect(WIDTH, HEIGHT)
gl.stepunit(8, 6)
+ gl.maxsize(SV.PAL_XMAX, SV.PAL_YMAX)
gl.winconstraints()
gl.qdevice(DEVICE.ESCKEY)
gl.qdevice(DEVICE.WINSHUT)
gl.qdevice(DEVICE.WINQUIT)
+ gl.qdevice(DEVICE.WINFREEZE)
+ gl.qdevice(DEVICE.WINTHAW)
width, height = gl.getsize()
x, y = gl.getorigin()
@@ -54,7 +61,9 @@ def main():
lvi = LiveVideoIn.LiveVideoIn().init(pktmax, width, height)
s = socket(AF_INET, SOCK_DGRAM)
- s.allowbroadcast(1)
+ s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
+
+ frozen = 0
while 1:
@@ -63,6 +72,10 @@ def main():
if dev in (DEVICE.ESCKEY, \
DEVICE.WINSHUT, DEVICE.WINQUIT):
break
+ if dev == DEVICE.WINFREEZE:
+ frozen = 1
+ if dev == DEVICE.WINTHAW:
+ frozen = 0
if dev == DEVICE.REDRAW:
w, h = gl.getsize()
x, y = gl.getorigin()
@@ -83,7 +96,9 @@ def main():
continue
pos, data = rv
- lvo.putnextpacket(pos, data)
+
+ if not frozen:
+ lvo.putnextpacket(pos, data)
hdr = struct.pack('hhh', pos, width, height)
s.sendto(hdr + data, (host, port))