Implemented VCR capture using forward slow instead of stepping.

Also added a 'rate' field to specify the capture rate in this case.
This commit is contained in:
Guido van Rossum 1993-05-11 18:36:54 +00:00
parent c17c84fbe3
commit ad4fcd49fc
2 changed files with 83 additions and 26 deletions

View File

@ -118,7 +118,7 @@ class VideoBagOfTricks:
self.in_maxmem.set_input('1.0')
self.in_nframes.set_input('0')
self.in_nframes_vcr.set_input('1')
self.in_sleeptime.set_input('1.0')
self.in_rate_vcr.set_input('1')
# Audio defaults
self.aout = None
self.aport = None
@ -200,6 +200,13 @@ class VideoBagOfTricks:
def reset(self):
self.close_video()
self.close_audio()
if self.vcr:
try:
ok = self.vcr.still()
except VCR.error:
pass
self.vcr = None
self.b_capture.set_button(0)
# Event handler (catches resize of video window)
@ -277,7 +284,7 @@ class VideoBagOfTricks:
def cb_nframes_vcr(self, *args):
pass
def cb_sleeptime(self, *args):
def cb_rate_vcr(self, *args):
pass
# Audio controls: format, file
@ -319,6 +326,7 @@ class VideoBagOfTricks:
self.reset()
def cb_play(self, *args):
self.reset()
sts = os.system('Vplay -q ' + self.vfile + ' &')
def cb_quit(self, *args):
@ -411,7 +419,9 @@ class VideoBagOfTricks:
self.stop_audio()
self.capturing = 0
self.end_cont()
self.reset()
if self.aout:
# If recording audio, can't capture multiple sequences
self.reset()
self.b_capture.label = saved_label
def single_capture(self):
@ -436,22 +446,66 @@ class VideoBagOfTricks:
try:
self.vcr = VCR.VCR().init()
self.vcr.wait()
self.vcr.fmmode('dnr')
if not (self.vcr.fmmode('dnr') and \
self.vcr.dmcontrol('digital slow')):
self.vcr_error('digital slow failed')
return
except VCR.error, msg:
self.vcr = None
self.b_capture.set_button(0)
fl.show_message('VCR error', str(msg), '')
self.vcr_error(msg)
return
count = self.getint(self.in_nframes_vcr, 1)
if count <= 0: count = 1
sleeptime = self.getfloat(self.in_sleeptime, 1.0)
for i in range(count):
if i > 0:
time.sleep(sleeptime)
if not self.single_capture():
break
if not self.vcr.step():
if not self.vcr.still():
self.vcr_error('still failed')
return
# XXX for some reason calling where() too often hangs the VCR,
# XXX so we insert sleep(0.1) before every sense() call.
self.open_if_closed()
rate = self.getint(self.in_rate_vcr, 1)
rate = max(rate, 1)
self.speed_factor = rate
addr = self.vcr.sense()
if not self.single_capture():
return
print 'captured %02d:%02d:%02d:%02d' % self.vcr.addr2tc(addr)
count = self.getint(self.in_nframes_vcr, 1) - 1
if count <= 0:
while rate > 0:
if not self.vcr.step():
self.vcr_error('step failed')
here = self.vcr.sense()
if here > addr:
rate = rate - (here - addr)
addr = here
return
if not self.vcr.fwdshuttle(2): # one tenth speed
self.vcr_error('fwd shuttle failed')
return
cycle = 0
while count > 0:
time.sleep(0.1)
try:
here = self.vcr.sense()
except VCR.error, msg:
self.vcr_error(msg)
break
if here <> addr:
if here <> addr+1:
print 'Missed', here-addr-1,
print 'frame' + 's'*(here-addr-1 <> 1)
cycle = (cycle+1) % rate
if cycle == 0:
if not self.single_capture():
break
print 'captured %02d:%02d:%02d:%02d' \
% self.vcr.addr2tc(here)
count = count -1
addr = here
if self.vcr and not self.vcr.still():
self.vcr_error('still failed')
def vcr_error(self, msg):
self.reset()
fl.show_message('VCR error:', str(msg), '')
# Init/end continuous capture mode
@ -551,12 +605,14 @@ class VideoBagOfTricks:
vout.writeheader()
self.vout = vout
self.nframes = 0
self.speed_factor = 1
self.t_nframes.label = `self.nframes`
def write_frame(self, t, data):
t = t * self.speed_factor
if not self.vout:
gl.ringbell()
return
return 0
if self.convertor:
data = self.convertor(data, len(data), 1)
elif self.mono:
@ -570,6 +626,7 @@ class VideoBagOfTricks:
try:
self.vout.writeframe(int(t), data, None)
except IOError, msg:
self.reset()
if msg == (0, 'Error 0'):
msg = 'disk full??'
fl.show_message('IOError', str(msg), '')

View File

@ -29,7 +29,7 @@ argument:
--------------------
class: 11
type: 5
box: 330.000000 170.000000 110.000015 60.000004
box: 330.000000 130.000000 110.000015 60.000004
boxtype: 1
colors: 47 47
alignment: 4
@ -89,7 +89,7 @@ argument: 0
--------------------
class: 11
type: 0
box: 330.000000 90.000000 110.000000 30.000000
box: 330.000000 200.000000 110.000000 30.000000
boxtype: 1
colors: 47 47
alignment: 4
@ -419,7 +419,7 @@ argument:
--------------------
class: 2
type: 0
box: 390.000000 130.000000 50.000000 30.000002
box: 390.000000 90.000000 50.000000 30.000002
boxtype: 2
colors: 47 47
alignment: 2
@ -434,7 +434,7 @@ argument:
--------------------
class: 2
type: 0
box: 320.000000 130.000000 60.000000 30.000000
box: 320.000000 90.000000 60.000000 30.000000
boxtype: 0
colors: 47 47
alignment: 2
@ -451,7 +451,7 @@ class: 10000
type: 0
box: 0.000000 0.000000 0.000000 0.000000
boxtype: 0
colors: 0 0
colors: 1147496041 1852404841
alignment: 4
style: 0
size: 11.000000
@ -478,7 +478,7 @@ argument: 0
--------------------
class: 31
type: 1
type: 2
box: 220.000000 170.000000 100.000000 30.000000
boxtype: 2
colors: 13 5
@ -486,9 +486,9 @@ alignment: 0
style: 0
size: 11.000000
lcol: 0
label: Delay:
name: in_sleeptime
callback: cb_sleeptime
label: Sample rate:
name: in_rate_vcr
callback: cb_rate_vcr
argument: 0
--------------------
@ -496,7 +496,7 @@ class: 20000
type: 0
box: 0.000000 0.000000 0.000000 0.000000
boxtype: 0
colors: 0 0
colors: 544171552 1331849829
alignment: 4
style: 0
size: 11.000000