| 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 sv.error, 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() |