| # Class to grab frames from a window. |
| # (This has fewer user-settable parameters than Displayer.) |
| # It is the caller's responsibility to initialize the window and to |
| # ensure that it is current when using grabframe() |
| |
| import gl, GL |
| import VFile |
| import GET |
| from VFile import Error |
| |
| class VGrabber(VFile.VideoParams): |
| |
| # XXX The constructor of VideoParams is just fine, for now |
| |
| # Grab a frame. |
| # Return (data, chromdata) just like getnextframe(). |
| |
| def grabframe(self): |
| grabber = choose_grabber(self.format) |
| return grabber(self.width, self.height, self.packfactor) |
| |
| |
| # Choose one of the grabber functions below based upon a color system name |
| |
| def choose_grabber(format): |
| try: |
| return eval('grab_' + format) |
| except: |
| raise Error, 'Unknown color system: ' + `format` |
| |
| |
| # Routines to grab data, per color system (only a few really supported). |
| # (These functions are used via eval with a constructed argument!) |
| |
| def grab_rgb(w, h, pf): |
| if gl.getdisplaymode() <> GET.DMRGB: |
| raise Error, 'Sorry, can only grab rgb in single-buf rgbmode' |
| if pf <> (1, 1): |
| raise Error, 'Sorry, only grab rgb with packfactor (1,1)' |
| return gl.lrectread(0, 0, w-1, h-1), None |
| |
| def grab_rgb8(w, h, pf): |
| if gl.getdisplaymode() <> GET.DMRGB: |
| raise Error, 'Sorry, can only grab rgb8 in single-buf rgbmode' |
| if pf <> (1, 1): |
| raise Error, 'Sorry, can only grab rgb8 with packfactor (1,1)' |
| if not VFile.is_entry_indigo(): |
| raise Error, 'Sorry, can only grab rgb8 on entry level Indigo' |
| # XXX Dirty Dirty here. |
| # XXX Set buffer to cmap mode, grab image and set it back. |
| gl.cmode() |
| gl.gconfig() |
| gl.pixmode(GL.PM_SIZE, 8) |
| data = gl.lrectread(0, 0, w-1, h-1) |
| data = data[:w*h] # BUG FIX for python lrectread |
| gl.RGBmode() |
| gl.gconfig() |
| gl.pixmode(GL.PM_SIZE, 32) |
| return data, None |
| |
| def grab_grey(w, h, pf): |
| raise Error, 'Sorry, grabbing grey not implemented' |
| |
| def grab_yiq(w, h, pf): |
| raise Error, 'Sorry, grabbing yiq not implemented' |
| |
| def grab_hls(w, h, pf): |
| raise Error, 'Sorry, grabbing hls not implemented' |
| |
| def grab_hsv(w, h, pf): |
| raise Error, 'Sorry, grabbing hsv not implemented' |
| |
| def grab_jpeg(w, h, pf): |
| data, dummy = grab_rgb(w, h, pf) |
| import jpeg |
| data = jpeg.compress(data, w, h, 4) |
| return data, None |
| |
| def grab_jpeggrey(w, h, pf): |
| raise Error, 'sorry, grabbing jpeggrey not implemented' |