Sockets leak in gstreamer 1.4.4 / pygobject
Dmitry Ketov
dketov at gmail.com
Tue Jun 28 14:13:51 UTC 2016
Hello!
I'm trying to destroy pipeline by setting NULL state in error message
handler, but there is two sockets leak in each turn...
Am I wrong and why?
Code:
--
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import sys, os, errno, socket, time#!/usr/bin/python
# -*- encoding: utf-8 -*-
import sys, os, errno, socket, time
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject
Gst.CLOCK_TIME_NONE = 2**64-1 # Fix, g-i (GstClockTime (-1))
def DEBUG(*x):
print >>sys.stderr, "DEBUG:", ", ".join(str(e) for e in x)
class Leak():
pipe = """
filesrc location=/tmp/leak-.mkv !
filesink location=/tmp/leak+.mkv
"""
def __init__(self):
self.build()
def build(self):
self.pipeline = Gst.parse_launch(self.pipe)
DEBUG("NEW pipeline: %x" % id(self.pipeline))
def onMessage(bus, message, self):
if message.type == Gst.MessageType.ERROR:
err, msg = message.parse_error()
print >> sys.stderr, err.message
self.shutdown()
return False
if message.type == Gst.MessageType.EOS:
self.pipeline.set_state(Gst.State.NULL)
DEBUG("onMessage", message.type)
DEBUG("onMessage", message.type)
return True
self.pipeline.set_auto_flush_bus(True)
bus = self.pipeline.get_bus()
bus.connect("message", onMessage, self)
bus.add_signal_watch()
def play(self):
if not self.pipeline:
self.build()
print self.pipeline.get_state(0)
self.pipeline.set_state(Gst.State.PLAYING)
return True
def shutdown(self):
#leak.pipeline.set_state(Gst.State.READY)
leak.pipeline.set_state(Gst.State.NULL)
leak.pipeline = None
DEBUG("ERROR, pipeline destroyed")
GObject.threads_init()
loop = GObject.MainLoop()
Gst.init(None)
leak = Leak()
leak.play()
GObject.timeout_add(8000, Leak.play, leak)
try:
loop.run()
except KeyboardInterrupt as e:
pass
finally:
leak.shutdown()
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject
Gst.CLOCK_TIME_NONE = 2**64-1 # Fix, g-i (GstClockTime (-1))
def DEBUG(*x):
print >>sys.stderr, "DEBUG:", ", ".join(str(e) for e in x)
class Leak():
pipe = """
filesrc location=/tmp/leak-.mkv !
filesink location=/tmp/leak+.mkv
"""
def __init__(self):
self.build()
def build(self):
self.pipeline = Gst.parse_launch(self.pipe)
DEBUG("NEW pipeline: %x" % id(self.pipeline))
def onMessage(bus, message, self):
if message.type == Gst.MessageType.ERROR:
err, msg = message.parse_error()
print >> sys.stderr, err.message
self.shutdown()
return False
if message.type == Gst.MessageType.EOS:
self.pipeline.set_state(Gst.State.NULL)
DEBUG("onMessage", message.type)
DEBUG("onMessage", message.type)
return True
self.pipeline.set_auto_flush_bus(True)
bus = self.pipeline.get_bus()
bus.connect("message", onMessage, self)
bus.add_signal_watch()
def play(self):
if not self.pipeline:
self.build()
print self.pipeline.get_state(0)
self.pipeline.set_state(Gst.State.PLAYING)
return True
def shutdown(self):
#leak.pipeline.set_state(Gst.State.READY)
leak.pipeline.set_state(Gst.State.NULL)
leak.pipeline = None
DEBUG("ERROR, pipeline destroyed")
GObject.threads_init()
loop = GObject.MainLoop()
Gst.init(None)
leak = Leak()
leak.play()
GObject.timeout_add(8000, Leak.play, leak)
try:
loop.run()
except KeyboardInterrupt as e:
pass
finally:
leak.shutdown()
--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20160628/a515641c/attachment.html>
More information about the gstreamer-devel
mailing list