Author: duncan
Date: Fri Nov 2 16:01:27 2007
New Revision: 10060
Log:
Copied over the rel-1 version
Tidy up of the code and a small fix
Modified:
branches/rel-1-7/freevo/src/tv/v4l2.py
Modified: branches/rel-1-7/freevo/src/tv/v4l2.py
==============================================================================
--- branches/rel-1-7/freevo/src/tv/v4l2.py (original)
+++ branches/rel-1-7/freevo/src/tv/v4l2.py Fri Nov 2 16:01:27 2007
@@ -39,6 +39,7 @@
import config
+
# Different formats depending on word size
bit32 = struct.calcsize('L') == struct.calcsize('I')
@@ -238,11 +239,11 @@
class Videodev:
def __init__(self, device):
self.chanlist = None
- self.device = os.open (device, os.O_TRUNC)
+ self.device = os.open(device, os.O_TRUNC)
if self.device < 0:
sys.exit('Error: %d' % self.device)
else:
- _debug_('Video Opened at %s' % device)
+ _debug_('Video opened for %r' % device)
results = self.querycap()
self.driver = results[0]
@@ -250,12 +251,12 @@
self.bus_info = results[2]
self.version = results[3]
self.capabilities = results[4]
- self.inputs = {}
- self.standards = {}
- self.controls = {}
self.inputs = self.enuminputs()
self.standards = self.enumstds()
self.controls = self.enumcontrols()
+ #print 'inputs=%r' % self.inputs
+ #print 'standards=%r' % self.standards
+ #print 'controls=%r' % self.controls
def getdriver(self):
@@ -383,6 +384,14 @@
raise
+ def getinputbyname(self, name):
+ """
+ Get the TV input by name, eg: TELEVISION, s-video
+ """
+ v_input = name.lower()
+ return self.inputs[v_input]
+
+
def setinputbyname(self, name):
"""
Set the TV input by name, eg: TELEVISION, s-video
@@ -417,7 +426,7 @@
while 1:
(index, id, name, frameperiod, framelines, reserved) =
self.enumstd(num)
name = name.rstrip('\0')
- res[name.lower()] = (index, id, name, frameperiod, framelines)
+ res[name.upper()] = (index, id, name, frameperiod, framelines)
num += 1
except IOError, e:
pass
@@ -444,6 +453,14 @@
_debug_('setstd: val=%r, r=%r' % (val, r), 3)
+ def getstdbyname(self, name):
+ """
+ Get the TV standard by name, eg: PAL-BGH, secam-dk, etc
+ """
+ v_norm = name.upper()
+ return self.standards[v_norm]
+
+
def setstdbyname(self, name):
"""
Set the TV standard by name, eg: PAL-BGH, secam-dk, etc
@@ -451,7 +468,7 @@
v_norm = name.upper()
try:
_debug_('setstdbyname: %s (0x%08X) set' % (name, NORMS[v_norm]))
- self.setstd(NORMS.get(v_norm))
+ self.setstd(NORMS[v_norm])
except KeyError, e:
_debug_('setstdbyname failed: %s' % (e), DERROR)
_debug_('possible are: %r' % (NORMS.keys()), DINFO)
@@ -509,9 +526,9 @@
def getctrl(self, id):
- '''
+ """
Get the value of a control
- '''
+ """
val = struct.pack(CTRL_ST, id, 0)
r = fcntl.ioctl(self.device, i32(G_CTRL_NO), val)
res = struct.unpack(CTRL_ST, r)
@@ -520,9 +537,9 @@
def setctrl(self, id, value):
- '''
+ """
Set the value of a control
- '''
+ """
val = struct.pack(CTRL_ST, id, value)
r = fcntl.ioctl(self.device, i32(S_CTRL_NO), val)
res = struct.unpack(CTRL_ST, r)
@@ -530,11 +547,11 @@
def getextctrl(self, id):
- '''
+ """
Get the value of an external control
EXT_CTRL_type->id, res1, res2, value
EXT_CTRLS_ST->class, count, error_idx, res1, res2, ptr
- '''
+ """
extctrl = array.array('B')
extctrl.fromstring(struct.pack(EXT_CTRL_ST, id, 0, 0, 0))
extctrl_p = extctrl.buffer_info()[0]
@@ -552,9 +569,9 @@
def setextctrl(self, id, value):
- '''
+ """
Set the value of an external control
- '''
+ """
extctrl = array.array('B')
extctrl.fromstring(struct.pack(EXT_CTRL_ST, id, 0, 0, value))
extctrl_p = extctrl.buffer_info()[0]
@@ -615,12 +632,16 @@
def ctrlname(self, name):
- ''' converts a control to lowercase and replaces spaces with
underscore, like v4l2-ctl
- '''
+ """
+ converts a control to lowercase and replaces spaces with underscore,
like v4l2-ctl
+ """
return name.replace(' ', '_').lower()
def listcontrols(self):
+ """
+ prints all the controls
+ """
id = V4L2_CTRL_FLAG_NEXT_CTRL
while 1:
try:
@@ -643,39 +664,39 @@
def enumcontrols(self):
- self.controls = {}
+ res = {}
id = V4L2_CTRL_FLAG_NEXT_CTRL
while 1:
try:
- res = self.queryctrl(id)
- (id, type, name, min, max, step, default, flags, value) = res
+ ctrl = self.queryctrl(id)
+ (id, type, name, min, max, step, default, flags, value) = ctrl
if flags == V4L2_CTRL_FLAG_DISABLED:
- id = res[0] | V4L2_CTRL_FLAG_NEXT_CTRL
+ id = ctrl[0] | V4L2_CTRL_FLAG_NEXT_CTRL
continue
- key = self.ctrlname(name)
- self.controls[key] = res
- id = res[0] | V4L2_CTRL_FLAG_NEXT_CTRL
+ res[self.ctrlname(name)] = ctrl
+ id = ctrl[0] | V4L2_CTRL_FLAG_NEXT_CTRL
except IOError, e:
break
if id != V4L2_CTRL_FLAG_NEXT_CTRL:
- return self.controls
+ return res
id = V4L2_CID_USER_BASE
for id in range(V4L2_CID_FIRSTP1, V4L2_CID_LASTP1):
try:
- res = self.queryctrl(id)
- (id, type, name, min, max, step, default, flags, value) = res
+ ctrl = self.queryctrl(id)
+ (id, type, name, min, max, step, default, flags, value) = ctrl
if flags & V4L2_CTRL_FLAG_DISABLED:
continue
+ res[self.ctrlname(name)] = ctrl
except IOError, e:
break
- return self.controls
+ return res
def findcontrol(self, id):
- '''
+ """
find a control by id
- '''
+ """
for ctrl in self.controls.keys():
if self.controls[ctrl][0] == id:
return ctrl
@@ -683,9 +704,9 @@
def getcontrol(self, name):
- '''
+ """
get the control record by name
- '''
+ """
key = self.ctrlname(name)
if not self.controls.has_key(key):
_debug_('control \"%s\" does not exists' % (name), DWARNING)
@@ -695,9 +716,9 @@
def setcontrol(self, name, value):
- '''
+ """
get the control record by name
- '''
+ """
key = self.ctrlname(name)
if not self.controls.has_key(key):
_debug_('control \"%s\" does not exists' % (name), DWARNING)
@@ -713,8 +734,8 @@
def updatecontrol(self, name, value):
- ''' set the control record by name
- '''
+ """ set the control record by name
+ """
if self.getcontrol(name) == None:
return
@@ -728,8 +749,8 @@
def init_settings(self):
- ''' initialise the V4L2 setting
- '''
+ """ initialise the V4L2 setting
+ """
(v_norm, v_input, v_clist, v_dev) = config.TV_SETTINGS.split()
self.inputs = self.enuminputs()
self.standards = self.enumstds()
@@ -769,7 +790,10 @@
sizeimage, colorspace) = self.getfmt()
print "Width: %i, Height: %i" % (width, height)
- print "Read Frequency: %i" % self.getfreq()
+ try:
+ print "Read Frequency: %i" % self.getfreq()
+ except IOError, e:
+ pass
class V4LGroup:
@@ -797,7 +821,11 @@
config.DEBUG = 3
config.LOGGING = config.logging.DEBUG
- viddev=Videodev('/dev/video0')
+ videodev = '/dev/video0'
+ if len(sys.argv) > 1:
+ videodev = sys.argv[1]
+ viddev=Videodev(videodev)
+ print 'Device = %r' % videodev
print 'Driver = \"%s\"' % viddev.getdriver()
print 'Driver Version = %02d.%02d' % (viddev.getversion() / 256,
viddev.getversion() % 256)
viddev.print_settings()
@@ -846,109 +874,28 @@
print '\'%s\' : 0x%08X, ' % ('ALL', NORMS['ALL'])
inputs = viddev.enuminputs()
- print inputs
+ print 'inputs = %r' % (inputs.keys())
standards = viddev.enumstds()
- print standards
- viddev.setinputbyname('Composite1')
- print viddev.getinput()
- viddev.setstdbyname('PAL')
- print '0x%08X' % viddev.getstd()
- viddev.setinputbyname('Television')
- print viddev.getinput()
-
- #dict = viddev.enumcontrols()
- #keys = list(dict)
- #keys.sort()
- #print keys
- #for ctrl in keys:
- # print '%-28s : %r' % (ctrl, dict[ctrl], )
-
- ##print viddev.querycap()
- #inp = viddev.getinput()
- #viddev.setinput(inp)
- #print 'querycap:', viddev.querycap()
- #fmt = viddev.getstd()
- #print 'fmt:', fmt
- #std = viddev.getfmt()
- #print 'std:', std
- #viddev.setfmt(720, 576)
- #std = viddev.getfmt()
- #print 'std:', std
- #print 'CONTROLS'
- #viddev.listcontrols()
- #dict = viddev.enumcontrols()
- #viddev.setextctrl(0x009909c9, 2)
- #print '0x009909c9 = %d' % viddev.getextctrl(0x009909c9)
- #viddev.setextctrl(0x009909cf, 7000000)
- #print '0x009909cf = %d' % viddev.getextctrl(0x009909cf)
- #print '0x009909cf = %d' % viddev.getextctrl(0x009909cf)
- #try:
- #bitrate = viddev.getcontrol('Video Bitrate')
- #viddev.updatecontrol('Video Bitrate', bitrate+1)
- #print 'Video Bitrate = %d' % viddev.getcontrol('Video Bitrate')
- #except:
- #pass
- #print '0x009909cf = %d' % viddev.getextctrl(0x009909cf)
- #print 'SIZES'
- #print 'QUERYCAP_ST=%s %s' % (QUERYCAP_ST, struct.calcsize(QUERYCAP_ST))
- #print 'FREQUENCY_ST=%s %s' % (FREQUENCY_ST, struct.calcsize(FREQUENCY_ST))
- #print 'ENUMSTD_ST=%s %s' % (ENUMSTD_ST, struct.calcsize(ENUMSTD_ST))
- #print 'STANDARD_ST=%s %s' % (STANDARD_ST, struct.calcsize(STANDARD_ST))
- #print 'ENUMINPUT_ST=%s %s' % (ENUMINPUT_ST, struct.calcsize(ENUMINPUT_ST))
- #print 'INPUT_ST=%s %s' % (INPUT_ST, struct.calcsize(INPUT_ST))
- #print 'FMT_ST=%s %s' % (FMT_ST, struct.calcsize(FMT_ST))
- #print 'TUNER_ST=%s %s' % (TUNER_ST, struct.calcsize(TUNER_ST))
- #print 'AUDIO_ST=%s %s' % (AUDIO_ST, struct.calcsize(AUDIO_ST))
- #print 'EXT_CTRL_ST=%s %s' % (EXT_CTRL_ST, struct.calcsize(EXT_CTRL_ST))
- #print 'EXT_CTRLS_ST=%s %s' % (EXT_CTRLS_ST, struct.calcsize(EXT_CTRLS_ST))
-
- #'''
- #viddev=Videodev('/dev/video0')
- #print
- #print viddev.querycap()
- #inp = viddev.getinput()
- #print 'viddev.getinput=%s' % (inp)
- #viddev.setinput(inp)
- #print 'viddev.setinput okay'
- #fmt = viddev.getfmt()
- #(buf_type, width, height, pixelformat, field, bytesperline, #sizeimage,
colorspace) = fmt
- #print 'viddev.getfmt=%s' % (buf_type)
- #print viddev.enuminput(inp)
- #for i in range(0, 99):
- #try:
- #print viddev.gettuner(i)
- #except IOError:
- #break
- #print viddev.getaudio(0)
- #print viddev.setfreq(2132)
- #print viddev.getfreq()
- #print viddev.setfreq(8948)
- #print viddev.getfreq()
- #print viddev.getfreq2()
-
- #DEBUG=0
- #viddev.setextctrl(0x009909c9, 2)
- #print '0x009909c9 = %d' % viddev.getextctrl(0x009909c9)
- #viddev.setextctrl(0x009909cf, 7000000)
- #print '0x009909cf = %d' % viddev.getextctrl(0x009909cf)
- #bitrate = viddev.getcontrol('Video Bitrate')
- #viddev.updatecontrol('Video Bitrate', bitrate+1)
- #print 'Video Bitrate = %d' % viddev.getcontrol('Video Bitrate')
- #print '0x009909cf = %d' % viddev.getextctrl(0x009909cf)
-
- #stream_type = 4
- #viddev.updatecontrol('Stream Type', stream_type)
- ##viddev.setcontrol('Stream Type', stream_type)
- ##viddev.setextctrl(0x00990900, stream_type)
- #print 'Stream Type = %d' % viddev.getcontrol('Stream Type')
- #print '0x00990900 = %d' % viddev.getextctrl(0x00990900)
- #DEBUG=4
- #print 'getfreq:', viddev.getfreq()
- #'''
+ print 'standards = %r' % (standards.keys())
+ try:
+ viddev.setinputbyname('Composite1')
+ print viddev.getinput()
+ except KeyError:
+ pass
+ try:
+ viddev.setstdbyname('PAL')
+ print '0x%08X' % viddev.getstd()
+ except (KeyError, IOError):
+ pass
+ try:
+ viddev.setinputbyname('Television')
+ print viddev.getinput()
+ except KeyError:
+ pass
viddev.close()
-#'''
+#"""
#To run this as standalone use the following before running python v4l2.py
#pythonversion=$(python -V 2>&1 | cut -d" " -f2 | cut -d"." -f1-2)
#export PYTHONPATH=/usr/lib/python${pythonversion}/site-packages/freevo
@@ -958,5 +905,5 @@
#export RUNAPP=""
#python v4l2.py
#OR
-#freevo execute v4l2.py
-#'''
+#freevo execute v4l2.py [<video device>]
+#"""
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog