]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
New options: -m mag, and -F.
authorGuido van Rossum <guido@python.org>
Fri, 22 Nov 1991 14:04:01 +0000 (14:04 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 22 Nov 1991 14:04:01 +0000 (14:04 +0000)
Also support for 'CMIF version 2.0' movies, with compressed color.

Demo/sgi/video/video.py

index df74d005a2b7c969b7d12cf77211860d0643ea63..d9872d5ef052ba0957b765f323cd89f7e764e21d 100755 (executable)
@@ -6,11 +6,13 @@ import time
 import sys
 import al
 import AL
+import colorsys
 
 BUFFERSIZE = 32000
 
 class Struct(): pass
 epoch = Struct()
+epoch.correcttiming = 1
 EndOfFile = 'End of file'
 bye = 'bye'
 
@@ -29,13 +31,19 @@ def openvideo(name):
         sys.exit(1)
     line = f.readline()
     if not line: raise EndOfFile
-    if line[:4] = 'CMIF': line = f.readline()
+    if line[:4] = 'CMIF':
+       if line[:14] = 'CMIF video 2.0':
+           line = f.readline()
+           colorinfo = eval(line[:-1])
+       else:
+           colorinfo = (8,0,0,0)
+       line = f.readline()
     x = eval(line[:-1])
     if len(x) = 3: w, h, pf = x
     else: w, h = x; pf = 2
-    return f, w, h, pf
+    return f, w, h, pf, colorinfo
 
-def loadframe(f,w,h,pf,af,spkr):
+def loadframe(f,w,h,pf,af,spkr, (ybits,ibits,qbits,chrompack),mf):
     line = f.readline()
     if line = '':
        raise EndOfFile
@@ -52,21 +60,54 @@ def loadframe(f,w,h,pf,af,spkr):
     if len(data) <> size:
        raise EndOfFile
     if pf:
-       rectzoom(pf, pf)
        w = w/pf
        h = h/pf
-       data = unpackrect(w, h, 1, data)
+    if chrompack:
+       cw = (w+chrompack-1)/chrompack
+       ch = (h+chrompack-1)/chrompack
+       chromdata = f.read(2*cw*ch)
+       rectzoom(pf*chrompack*mf,pf*chrompack*mf)
+       pixmode(5,16)
+       writemask(0x7ff - ((1<<ybits)-1))
+       lrectwrite(0,0,cw-1,ch-1,chromdata)
+       writemask((1<<ybits)-1)
+       pixmode(5,8)
+    if pf:
+       rectzoom(pf*mf, pf*mf)
+    elif mf <> 1:
+       rectzoom(mf,mf)
     lrectwrite(0,0,w-1,h-1,data)
     # This is ugly here, but the only way to get the two
     # channels started in sync
     #if af <> None:
     #  playsound(af,spkr)
     ct = time.millitimer() - epoch.epoch
-    if tijd > 0 and ct < tijd:
+    if epoch.correcttiming and tijd > 0 and ct < tijd:
        time.millisleep(tijd-ct)
     #swapbuffers()
     return tijd
 
+def initcmap(ybits,ibits,qbits,chrompack):
+    if ybits+ibits+qbits > 11:
+       raise 'Sorry, 11 bits max'
+    maxy = pow(2,ybits)
+    maxi = pow(2,ibits)
+    maxq = pow(2,qbits)
+    for i in range(2048,4096-256):
+       mapcolor(i, 0, 255, 0)
+    for y in range(maxy):
+      yv = float(y)/float(maxy-1)
+      for i in range(maxi):
+       iv = (float(i)/float(maxi-1))-0.5
+       for q in range(maxq):
+         qv = (float(q)/float(maxq-1))-0.5
+         index = 2048 + y + (i << ybits) + (q << (ybits+ibits))
+
+         rv,gv,bv = colorsys.yiq_to_rgb(yv,iv,qv)
+         r,g,b = int(rv*255.0), int(gv*255.0), int(bv*255.0)
+         if index < 4096 - 256:
+             mapcolor(index, r,g,b)
+
 def playsound(af, spkr):
     nsamp = spkr.getfillable()
     data = af.read(nsamp*2)
@@ -75,17 +116,27 @@ def playsound(af, spkr):
 def main():
        looping = 0
        packfactor = 0
-       opts, args = getopt.getopt(sys.argv[1:], 'p:l')
+       magfactor = 1
+       try:
+               opts, args = getopt.getopt(sys.argv[1:], 'm:p:lF')
+       except getopt.error:
+               sys.stderr.write('usage: video ' + \
+       '[-l] [-p pf] [-m mag] [-F] [moviefile [soundfile [skipbytes]]]\n')
+               sys.exit(2)
        for opt, arg in opts:
-               if opt = '-p':
+               if opt = '-m':
+                       magfactor = int(eval(arg))
+               elif opt = '-p':
                        packfactor = int(eval(arg))
                elif opt = '-l':
                        looping = 1
+               elif opt = '-F':
+                       epoch.correcttiming = 0
        if args:
                filename = args[0]
        else:
                filename = 'film.video'
-       f, w, h, pf = openvideo(filename)
+       f, w, h, pf, cinfo = openvideo(filename)
        if 0 < packfactor <> pf:
                w = w/pf*packfactor
                h = h/pf*packfactor
@@ -101,11 +152,21 @@ def main():
        else:
                af, spkr = None, None
        foreground()
-       prefsize(w,h)
+       prefsize(w*magfactor,h*magfactor)
        win = winopen(filename)
-       RGBmode()
+       if pf:
+           #doublebuffer()
+           cmode()
+       else:
+           RGBmode()
        #doublebuffer()
        gconfig()
+       if pf:
+           initcmap(cinfo)
+           color(2048)
+           clear()
+           writemask(2047)
+           pixmode(5,8)        # 8 bit pixels
        qdevice(ESCKEY)
        qdevice(WINSHUT)
        qdevice(WINQUIT)
@@ -119,7 +180,7 @@ def main():
            while 1:
                if running:
                    try:
-                       tijd = loadframe(f, w, h, pf, af, spkr)
+                       tijd = loadframe(f, w, h, pf, af, spkr, cinfo,magfactor)
                        nframe = nframe + 1
                    except EndOfFile:
                        running = 0