Author: dmeyer
Date: Wed Feb 21 20:56:05 2007
New Revision: 2504
Modified:
trunk/WIP/record/test/pmt.py
Log:
small redesign
Modified: trunk/WIP/record/test/pmt.py
==============================================================================
--- trunk/WIP/record/test/pmt.py (original)
+++ trunk/WIP/record/test/pmt.py Wed Feb 21 20:56:05 2007
@@ -16,76 +16,72 @@
import _weakref
-class DVBCard(gst.Bin):
-
- def __init__(self, *args):
- gst.Bin.__init__(self, *args)
- self._tuner = gst.element_factory_make("dvbtuner", "tuner")
-
- self._tuner.set_property('debug-output', True)
- self._tuner.set_property('adapter', 0)
-
- frontendlist = [ "QPSK (DVB-S)", "QAM (DVB-C)", "OFDM (DVB-T)", "ATSC"
]
- frontendtype = self._tuner.get_property('frontendtype')
- print 'FRONTEND-TYPE: ', frontendlist[ frontendtype ]
- print 'FRONTEND-NAME: ', self._tuner.get_property('frontendname')
- print 'HWDECODER? : ', self._tuner.get_property('hwdecoder')
-
- if frontendtype != 2:
- print 'the following code supports only DVB-T cards!'
- sys.exit()
-
- self._dvr = open('/dev/dvb/adapter0/dvr0')
+class DVBsrc(gst.Bin):
+ def __init__(self):
+ gst.Bin.__init__(self, 'dvbsrc_%d')
self._src = gst.element_factory_make("fdsrc")
- self._src.set_property('fd', self._dvr.fileno())
+ self._tuner = gst.element_factory_make("dvbtuner")
+ self._tuner.set_property('debug-output', True)
self._queue = gst.element_factory_make("queue")
self._splitter = gst.element_factory_make("tssplitter")
self._splitter.connect("pad-added", self._on_new_pad)
self.add(self._src, self._queue, self._splitter)
- self._src.link(self._queue)
- self._queue.link(self._splitter)
+ gst.element_link_many(self._src, self._queue, self._splitter)
self._pids = []
- self._pad_mapping = {}
- kaa.notifier.Timer(self._debug).start(1)
-
-
- def _debug(self):
- print self._tuner.get_property('status')
+ self._newpad = None
+ self._nextid = 0
+
+ def set_property(self, prop, value):
+ if prop == 'adapter':
+ self._tuner.set_property('adapter', value)
+ self._dvr = open('/dev/dvb/adapter%s/dvr0' % value)
+ return self._src.set_property('fd', self._dvr.fileno())
+
+ if prop == 'channel':
+ # tuning to ZDF (hardcoded values! change them!)
+ self._tuner.set_property("frequency", 562000000)
+ self._tuner.set_property("inversion", 2)
+ self._tuner.set_property("bandwidth", 0)
+ self._tuner.set_property("code-rate-high-prio", 2)
+ self._tuner.set_property("code-rate-low-prio", 0)
+ self._tuner.set_property("constellation", 1)
+ self._tuner.set_property("transmission-mode", 1)
+ self._tuner.set_property("guard-interval", 2)
+ self._tuner.set_property("hierarchy", 0)
+
+ # tune to channel
+ self._tuner.emit("tune")
+ return True
- def tune(self, channel):
- # tuning to ZDF (hardcoded values! change them!)
- self._tuner.set_property("frequency", 562000000)
- self._tuner.set_property("inversion", 2)
- self._tuner.set_property("bandwidth", 0)
- self._tuner.set_property("code-rate-high-prio", 2)
- self._tuner.set_property("code-rate-low-prio", 0)
- self._tuner.set_property("constellation", 1)
- self._tuner.set_property("transmission-mode", 1)
- self._tuner.set_property("guard-interval", 2)
- self._tuner.set_property("hierarchy", 0)
+ raise AttributeError
- # tune to channel
- self._tuner.emit("tune")
def _on_new_pad(self, splitter, pad):
- ghost = gst.GhostPad(pad.get_name(), pad)
- self.add_pad(ghost)
- ghost.link(self._pad_mapping.pop(pad.get_name()))
+ self._newpad = gst.GhostPad(pad.get_name(), pad)
+ self.add_pad(self._newpad)
- def add_filter(self, name, pad, *pids):
+ def get_request_pad(self, *pids):
for pid in pids:
if not pid in self._pids:
self._tuner.emit("add-pid", pid)
self._pids.append(pid)
pidstr = ','.join([str(p) for p in pids])
- self._pad_mapping[name] = pad
- self._splitter.emit("set-filter", name, pidstr)
+ # FIXME: self._splitter.get_request_pad would be the way to go
+ # To do that, tssplitter has to provide a release_pad function.
+ # For some reasons I could not get this working, so it is still
+ # this ugly hack. See gsttee.c how stuff like that should work.
+ self._splitter.emit("set-filter", 'dvbpid_%s' % self._nextid, pidstr)
+ self._nextid += 1
+ return self._newpad
+
- def remove_filter(self, name):
- # TODO FIXME remove pids from tuner
- self._splitter.emit("remove-filter", name)
+ def remove_pad(self, pad):
+ # TODO: remove pids from tuner
+ # FIXME: that results in GStreamer-CRITICAL
+ self._splitter.emit("remove-filter", pad.get_target().get_name())
+ gst.Bin.remove_pad(self, pad)
# test app logic
@@ -103,21 +99,20 @@
return True
-
# create gstreamer pipline
pipeline = gst.Pipeline()
pipeline.get_bus().add_watch(bus_event)
-# create DVBCard object and add it
-c = DVBCard()
-
-pipeline.add(c)
-pipeline.set_state(gst.STATE_PLAYING)
-
+# create DVBsrc object and add it
+dvb = DVBsrc()
+# FIXME: it would be nice to do
+# gst.element_factory_make("dvbsrc")
+dvb.set_property('adapter', 0)
+dvb.set_property('channel', None)
-# now the testing starts by tuning
-c.tune(None)
+pipeline.add(dvb)
+pipeline.set_state(gst.STATE_PLAYING)
class TSFrame(object):
@@ -143,7 +138,7 @@
gst.PAD_ALWAYS,
gst.caps_new_any())
- def __init__(self, *args):
+ def __init__(self, dvbsrc, *args):
gst.Element.__init__(self)
gst.info('creating sinkpad')
pad = gst.Pad(self._sinkpadtemplate, "sink")
@@ -151,6 +146,7 @@
self.add_pad(pad)
self.buffer = {}
self.parse_args = args
+ self.dvbsrc = dvbsrc
def chainfunc(self, pad, buffer):
@@ -188,10 +184,9 @@
pad = self.get_pad('sink')
peer = pad.get_peer()
peer.unlink(pad)
- c.remove_filter(peer.get_name())
+ self.dvbsrc.remove_pad(peer)
self.unparent()
self.remove_pad(pad)
- # FIXME: ghost pad is still in the dvb object
self.set_state(gst.STATE_NULL)
@@ -209,12 +204,12 @@
pid = ((data[2] & 0x1F) << 8) + data[3]
print '', num, pid
data = data[4:]
- pmts.append((PMT(num, pid), pid))
+ pmts.append((PMT(self.dvbsrc, num, pid), pid))
print
for pmt, pid in pmts:
pipeline.add(pmt)
pmt.set_state(gst.STATE_PLAYING)
- c.add_filter(str(pmt), pmt.get_pad('sink'), pid)
+ self.dvbsrc.get_request_pad(pid).link(pmt.get_pad('sink'))
class PMT(TableSink):
@@ -266,10 +261,11 @@
gobject.type_register(PAT)
gobject.type_register(PMT)
-info = PAT()
+info = PAT(dvb)
pipeline.add(info)
info.set_state(gst.STATE_PLAYING)
-c.add_filter('info', info.get_pad('sink'), 0)
+
+dvb.get_request_pad(0).link(info.get_pad('sink'))
kaa.notifier.Timer(gc_check).start(1)
kaa.notifier.loop()
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog