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

Reply via email to