Author: duncan
Date: Thu Oct 12 16:18:45 2006
New Revision: 8354
Modified:
branches/rel-1-5/freevo/src/tv/ivtv.py
branches/rel-1-5/freevo/src/tv/v4l2.py
Log:
Added plenty of debug messages for each ioctl
Added getvbiembed and setvbiembed so that they can be disabled
Modified: branches/rel-1-5/freevo/src/tv/ivtv.py
==============================================================================
--- branches/rel-1-5/freevo/src/tv/ivtv.py (original)
+++ branches/rel-1-5/freevo/src/tv/ivtv.py Thu Oct 12 16:18:45 2006
@@ -8,19 +8,6 @@
# Todo:
#
# -----------------------------------------------------------------------
-# $Log$
-# Revision 1.13.2.1 2005/06/10 14:25:15 tack
-# Fix OverflowError exceptions with Python 2.4 in the ioctl calls.
-#
-# Revision 1.13 2004/07/10 12:33:41 dischi
-# header cleanup
-#
-# Revision 1.12 2003/12/31 16:05:34 rshortt
-# No longer override setstd because the mspSetMatrix() call was only to work
-# around a (fixed) ivtv bug. Also removed the setinput call because that is
-# now taken care of by the VideoGroup and channels.py.
-#
-# -----------------------------------------------------------------------
# Freevo - A Home Theater PC framework
# Copyright (C) 2003 Krister Lagerstrom, et al.
# Please see the file freevo/Docs/CREDITS for a complete list of authors.
@@ -44,15 +31,70 @@
import string, struct, fcntl, time
-import tv.v4l2, config
+#import tv.v4l2, config
+import config
+import tv.v4l2
+
+DEBUG = config.DEBUG
def i32(x): return (x&0x80000000L and -2*0x40000000 or 0) + int(x&0x7fffffff)
+_IOC_NRBITS = 8
+_IOC_TYPEBITS = 8
+_IOC_SIZEBITS = 14
+_IOC_DIRBITS = 2
+
+_IOC_NRMASK = ((1 << _IOC_NRBITS)-1)
+_IOC_TYPEMASK = ((1 << _IOC_TYPEBITS)-1)
+_IOC_SIZEMASK = ((1 << _IOC_SIZEBITS)-1)
+_IOC_DIRMASK = ((1 << _IOC_DIRBITS)-1)
+
+_IOC_NRSHIFT = 0
+_IOC_TYPESHIFT = (_IOC_NRSHIFT+_IOC_NRBITS)
+_IOC_SIZESHIFT = (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+_IOC_DIRSHIFT = (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+# Direction bits.
+_IOC_NONE = 0
+_IOC_WRITE = 1
+_IOC_READ = 2
+
+def _IOC(dir,type,nr,size):
+ return (((dir) << _IOC_DIRSHIFT) | \
+ (ord(type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+def _IO(type,nr): return _IOC(_IOC_NONE,(type),(nr),0)
+
+def _IOR(type,nr,size): return
_IOC(_IOC_READ,(type),(nr),struct.calcsize(size))
+
+def _IOW(type,nr,size): return
_IOC(_IOC_WRITE,(type),(nr),struct.calcsize(size))
+
+def _IOWR(type,nr,size): return
_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),struct.calcsize(size))
+
+# used to decode ioctl numbers..
+def _IOC_DIR(nr): return (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+def _IOC_TYPE(nr): return (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+def _IOC_NR(nr): return (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+def _IOC_SIZE(nr): return (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+# structs
+CODEC_ST = '15I'
+MSP_MATRIX_ST = '2i'
+VBI_EMBED_ST = "I"
+GOP_END_ST = "I"
+
# ioctls
IVTV_IOC_G_CODEC = 0xFFEE7703
IVTV_IOC_S_CODEC = 0xFFEE7704
MSP_SET_MATRIX = 0x40086D11
+GETVBI_EMBED_NO = _IOR('@', 55, VBI_EMBED_ST) #IVTV_IOC_G_VBI_EMBED
+SETVBI_EMBED_NO = _IOW('@', 54, VBI_EMBED_ST) #IVTV_IOC_S_VBI_EMBED
+
+GOP_END_NO = _IOWR('@', 50, GOP_END_ST) #IVTV_IOC_S_GOP_END used to wait for
a GOP
+
# Stream types
IVTV_STREAM_PS = 0
IVTV_STREAM_TS = 1
@@ -62,10 +104,6 @@
IVTV_STREAM_PES_A = 7
IVTV_STREAM_DVD = 10
-# structs
-CODEC_ST = '15I'
-MSP_MATRIX_ST = '2i'
-
class IVTV(tv.v4l2.Videodev):
@@ -91,12 +129,14 @@
codec.pulldown,
codec.stream_type)
r = fcntl.ioctl(self.device, i32(IVTV_IOC_S_CODEC), val)
+ if DEBUG >= 3: print "setCodecInfo: val=%r, r=%r" % (val, r)
def getCodecInfo(self):
val = struct.pack( CODEC_ST, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 )
r = fcntl.ioctl(self.device, i32(IVTV_IOC_G_CODEC), val)
codec_list = struct.unpack(CODEC_ST, r)
+ if DEBUG >= 3: print "getCodecInfo: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(CODEC_ST, r))
return IVTVCodec(codec_list)
@@ -106,6 +146,24 @@
val = struct.pack(MSP_MATRIX_ST, input, output)
r = fcntl.ioctl(self.device, i32(MSP_SET_MATRIX), val)
+ if DEBUG >= 3: print "mspSetMatrix: val=%r, r=%r" % (val, r)
+
+
+ def getvbiembed(self):
+ r = fcntl.ioctl(self.device, i32(GETVBI_EMBED_NO),
struct.pack(VBI_EMBED_ST,0))
+ if DEBUG >= 3:
+ print "getvbiembed: val=%r, r=%r, res=%r" %
(struct.pack(VBI_EMBED_ST,0), r, struct.unpack(VBI_EMBED_ST,r))
+ return struct.unpack(VBI_EMBED_ST,r)[0]
+
+
+ def setvbiembed(self, value):
+ r = fcntl.ioctl(self.device, i32(SETVBI_EMBED_NO),
struct.pack(VBI_EMBED_ST, value))
+ if DEBUG: print "setvbiembed: val=%r, res=%r" %
(struct.pack(VBI_EMBED_ST, value), r)
+
+
+ def gopend(self, value):
+ r = fcntl.ioctl(self.device, i32(GOP_END_NO), struct.pack(GOP_END_ST,
value))
+ if DEBUG: print "gopend: val=%r, res=%r" % (struct.pack(GOP_END_ST,
value), r)
def init_settings(self, opts=None):
@@ -181,3 +239,25 @@
self.stream_type = args[14]
+'''
+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
+export FREEVO_SHARE=/usr/share/freevo
+export FREEVO_CONFIG=/usr/share/freevo/freevo_config.py
+export FREEVO_CONTRIB=/usr/share/freevo/contrib
+export RUNAPP=""
+'''
+
+if __name__ == '__main__':
+
+ ivtv_dev = IVTV('/dev/video0')
+ print config.TV_IVTV_OPTIONS
+ print ivtv_dev.print_settings()
+ print ivtv_dev.init_settings()
+ embed = ivtv_dev.getvbiembed()
+ print "embed=%s" % embed
+ ivtv_dev.setvbiembed(1)
+ print "embed=%s (%s)" % (ivtv_dev.getvbiembed(), 1)
+ ivtv_dev.setvbiembed(embed)
+ print "embed=%s (%s)" % (ivtv_dev.getvbiembed(), embed)
Modified: branches/rel-1-5/freevo/src/tv/v4l2.py
==============================================================================
--- branches/rel-1-5/freevo/src/tv/v4l2.py (original)
+++ branches/rel-1-5/freevo/src/tv/v4l2.py Thu Oct 12 16:18:45 2006
@@ -120,8 +120,6 @@
GET_AUDIO_NO = _IOWR ('V', 33, AUDIO_ST)
SET_AUDIO_NO = _IOW ('V', 34, AUDIO_ST)
-
-V4L2_TUNER_CAP_LOW = 0x0001
V4L2_TUNER_CAP_NORM = 0x0002
V4L2_TUNER_CAP_STEREO = 0x0010
V4L2_TUNER_CAP_LANG2 = 0x0020
@@ -167,12 +165,14 @@
val = struct.pack( FREQUENCY_ST, 0,0,0 )
r = fcntl.ioctl(self.device, i32(GETFREQ_NO), val)
(junk,junk, freq, ) = struct.unpack(FREQUENCY_ST, r)
+ if DEBUG >= 3: print "getfreq: val=%r, r=%s, res=%r" % (val, r,
struct.unpack(FREQUENCY_ST, r))
return freq
def getfreq2(self):
val = struct.pack( FREQUENCY_ST, 0,0,0 )
r = fcntl.ioctl(self.device, i32(GETFREQ_NO), val)
+ if DEBUG >= 3: print "getfreq2: val=%r, r=%s, res=%r" % (val, r,
struct.unpack(FREQUENCY_ST, r))
return struct.unpack(FREQUENCY_ST, r)
@@ -206,21 +206,25 @@
def setfreq_old(self, freq):
val = struct.pack( "L", freq)
r = fcntl.ioctl(self.device, i32(SETFREQ_NO_V4L), val)
+ if DEBUG >= 3: print "setfreq_old: val=%r, r=%r" % (val, r)
def setfreq(self, freq):
val = struct.pack( FREQUENCY_ST, long(0), long(2), freq)
r = fcntl.ioctl(self.device, i32(SETFREQ_NO), val)
+ if DEBUG >= 3: print "setfreq_old: val=%r, r=%r" % (val, r)
def getinput(self):
r = fcntl.ioctl(self.device, i32(GETINPUT_NO), struct.pack(INPUT_ST,0))
+ if DEBUG >= 3: print "getinput: val=%r, r=%r, res=%r" %
(struct.pack(INPUT_ST,0), r, struct.unpack(INPUT_ST,r))
return struct.unpack(INPUT_ST,r)[0]
def setinput(self, value):
try:
r = fcntl.ioctl(self.device, i32(SETINPUT_NO),
struct.pack(INPUT_ST, value))
+ if DEBUG: print "setinput: val=%r, res=%r" %
(struct.pack(INPUT_ST, value), r)
except IOError:
self.print_settings
raise
@@ -229,63 +233,74 @@
def querycap(self):
val = struct.pack( QUERYCAP_ST, "", "", "", 0, 0 )
r = fcntl.ioctl(self.device, i32(QUERYCAP_NO), val)
+ if DEBUG >= 3: print "querycap: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(QUERYCAP_ST,r))
return struct.unpack( QUERYCAP_ST, r )
def enumstd(self, no):
val = struct.pack( ENUMSTD_ST, no, 0, "", 0, 0, 0)
r = fcntl.ioctl(self.device, i32(ENUMSTD_NO), val)
+ if DEBUG >= 3: print "enumstd: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(ENUMSTD_ST,r))
return struct.unpack( ENUMSTD_ST, r )
def getstd(self):
val = struct.pack( STANDARD_ST, 0 )
r = fcntl.ioctl(self.device, i32(GETSTD_NO), val)
+ if DEBUG >= 3: print "getstd: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(STANDARD_ST,r))
return struct.unpack( STANDARD_ST, r )[0]
def setstd(self, value):
val = struct.pack( STANDARD_ST, value )
r = fcntl.ioctl(self.device, i32(SETSTD_NO), val)
+ if DEBUG >= 3: print "setstd: val=%r, r=%r" % (val, r)
def enuminput(self,index):
val = struct.pack( ENUMINPUT_ST, index, "", 0,0,0,0,0)
r = fcntl.ioctl(self.device, i32(ENUMINPUT_NO), val)
+ if DEBUG >= 3: print "enuminput: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(ENUMINPUT_ST,r))
return struct.unpack( ENUMINPUT_ST, r )
def getfmt(self):
val = struct.pack( FMT_ST, 1,0,0,0,0,0,0,0)
r = fcntl.ioctl(self.device, i32(GET_FMT_NO), val)
+ if DEBUG >= 3: print "getfmt: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(FMT_ST,r))
return struct.unpack( FMT_ST, r )
def setfmt(self, width, height):
val = struct.pack( FMT_ST, 1L, width, height, 0L, 4L, 0L, 131072L, 0L)
r = fcntl.ioctl(self.device, i32(SET_FMT_NO), val)
+ if DEBUG >= 3: print "setfmt: val=%r, r=%r" % (val, r)
def gettuner(self,index):
val = struct.pack( TUNER_ST, index, "", 0,0,0,0,0,0,0,0)
r = fcntl.ioctl(self.device, i32(GET_TUNER_NO), val)
+ if DEBUG >= 3: print "getfmt: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(FMT_ST,r))
return struct.unpack( TUNER_ST, r )
def settuner(self,index,audmode):
val = struct.pack( TUNER_ST, index, "", 0,0,0,0,0,audmode,0,0)
r = fcntl.ioctl(self.device, i32(SET_TUNER_NO), val)
+ if DEBUG >= 3: print "settuner: val=%r, r=%r" % (val, r)
def getaudio(self,index):
val = struct.pack( AUDIO_ST, index, "", 0,0)
r = fcntl.ioctl(self.device, i32(GET_AUDIO_NO), val)
+ if DEBUG >= 3: print "getaudio: val=%r, r=%r, res=%r" % (val, r,
struct.unpack(AUDIO_ST,r))
return struct.unpack( AUDIO_ST, r )
def setaudio(self,index,mode):
val = struct.pack( AUDIO_ST, index, "", mode, 0)
r = fcntl.ioctl(self.device, i32(SET_AUDIO_NO), val)
+ if DEBUG >= 3: print "setaudio: val=%r, r=%r" % (val, r)
def init_settings(self):
@@ -365,6 +380,10 @@
if __name__ == '__main__':
viddev=Videodev('/dev/video0')
+ #print viddev.querycap()
+ inp = viddev.getinput()
+ viddev.setinput(inp)
+ '''
print viddev.querycap()
fmt = viddev.getstd()
print fmt
@@ -374,7 +393,6 @@
std = viddev.getfmt()
print std
- '''
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))
@@ -410,3 +428,4 @@
print viddev.getfreq()
print viddev.getfreq2()
'''
+ viddev.close()
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog