Author: dmeyer
Date: Tue Feb 20 19:08:00 2007
New Revision: 2503
Modified:
trunk/WIP/record/test/pmt.py
Log:
add remove filter and make sure the objects are deleted
Modified: trunk/WIP/record/test/pmt.py
==============================================================================
--- trunk/WIP/record/test/pmt.py (original)
+++ trunk/WIP/record/test/pmt.py Tue Feb 20 19:08:00 2007
@@ -5,6 +5,7 @@
import gobject
import sys
import time
+import gc
# import kaa.notifier and set mainloop to glib
import kaa.notifier
@@ -13,6 +14,8 @@
# import kaa.record2 for the dvbtuner module
import kaa.record2
+import _weakref
+
class DVBCard(gst.Bin):
def __init__(self, *args):
@@ -42,6 +45,7 @@
self._src.link(self._queue)
self._queue.link(self._splitter)
self._pids = []
+ self._pad_mapping = {}
kaa.notifier.Timer(self._debug).start(1)
@@ -65,16 +69,23 @@
self._tuner.emit("tune")
def _on_new_pad(self, splitter, pad):
- self.add_pad(gst.GhostPad(pad.get_name(), pad))
+ ghost = gst.GhostPad(pad.get_name(), pad)
+ self.add_pad(ghost)
+ ghost.link(self._pad_mapping.pop(pad.get_name()))
+
- def add_filter(self, name, *pids):
+ def add_filter(self, name, pad, *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)
+ def remove_filter(self, name):
+ # TODO FIXME remove pids from tuner
+ self._splitter.emit("remove-filter", name)
# test app logic
@@ -92,12 +103,6 @@
return True
-mapping = {}
-
-def on_new_pad(dvb, pad):
- sink = mapping[pad.get_name()]
- pad.link(sink.get_pad('sink'))
-
# create gstreamer pipline
pipeline = gst.Pipeline()
@@ -105,7 +110,6 @@
# create DVBCard object and add it
c = DVBCard()
-c.connect("pad-added", on_new_pad)
pipeline.add(c)
pipeline.set_state(gst.STATE_PLAYING)
@@ -131,7 +135,7 @@
offset += adapt_len + 1
self.data = buffer[offset:]
-
+
class TableSink(gst.Element):
_sinkpadtemplate = gst.PadTemplate ("sinkpadtemplate",
@@ -142,20 +146,14 @@
def __init__(self, *args):
gst.Element.__init__(self)
gst.info('creating sinkpad')
- self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink")
- gst.info('adding sinkpad to self')
- self.add_pad(self.sinkpad)
- gst.info('setting chain/event functions')
- self.sinkpad.set_chain_function(self.chainfunc)
- self.sinkpad.set_event_function(self.eventfunc)
+ pad = gst.Pad(self._sinkpadtemplate, "sink")
+ pad.set_chain_function(self.chainfunc)
+ self.add_pad(pad)
self.buffer = {}
- self.finished = False
self.parse_args = args
def chainfunc(self, pad, buffer):
- if self.finished:
- return gst.FLOW_OK
ts = TSFrame(buffer)
if ts.error:
# TS error bit set, ignore
@@ -182,14 +180,19 @@
# last_section_number = 7
data = [ ord(x) for x in ts.data[8:8+length-5-4] ]
self.parse(ord(ts.data[0]), data, *self.parse_args)
- # now we need to unregister, but that does not work yet
- self.finished = True
+ self.delete()
return gst.FLOW_OK
- def eventfunc(self, pad, event):
- print "%s event:%r" % (pad, event.type)
- return True
+ def delete(self):
+ pad = self.get_pad('sink')
+ peer = pad.get_peer()
+ peer.unlink(pad)
+ c.remove_filter(peer.get_name())
+ self.unparent()
+ self.remove_pad(pad)
+ # FIXME: ghost pad is still in the dvb object
+ self.set_state(gst.STATE_NULL)
@@ -211,9 +214,7 @@
for pmt, pid in pmts:
pipeline.add(pmt)
pmt.set_state(gst.STATE_PLAYING)
- mapping[str(pmt)] = pmt
- c.add_filter(str(pmt), pid)
-
+ c.add_filter(str(pmt), pmt.get_pad('sink'), pid)
class PMT(TableSink):
@@ -256,14 +257,19 @@
data = data[ES_info_len + 5:]
print
-
+
+def gc_check():
+ gc.collect()
+ for g in gc.garbage:
+ print 'oops', g
+
gobject.type_register(PAT)
gobject.type_register(PMT)
info = PAT()
pipeline.add(info)
info.set_state(gst.STATE_PLAYING)
-mapping['info'] = info
-c.add_filter('info', 0)
+c.add_filter('info', info.get_pad('sink'), 0)
+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