[gst-devel] Proper usage of fdsink and fdsrc (out-of-process processing)
Andrzej K. Haczewski
ahaczewski at gmail.com
Fri Jul 23 13:22:34 CEST 2010
2010/7/23 Andrzej K. Haczewski <ahaczewski at gmail.com>:
> Hi,
>
> I have very strange problem that I can't understand and maybe some
> Linux hacker here can give me a hint about what might be wrong.
>
> I'm creating a pipeline that generates sound (audiotestsrc), puts it
> through queue to fdsink, reads whatever comes out of fdsrc (through
> queue) to the fakesink.
>
> It blocks, and me and my colleagues have no idea as to what may cause
> the deadlock. The reason I'm doing such a strange pipeline is that I
> have a commercial encoder that comes as a executable (no SDK, no libs
> to link to) that is able to get input from stdin and write output to
> stdout. To link it with a pipeline I'm spawning it within my GStreamer
> application and I build pipeline like that redirecting pipes of the
> encoder to fdsink and fdsrc.
>
> Can anyone explain why there is a deadlock?
>
> Here's the example code I'm talking about (first is python GStreamer
> application, next is the "testprocessing" code that you might switch
> the fdsink/fdsrc to):
Here's another try, that works. It uses 2 pipelines, one for each end.
Why I can't have fdsink and fdsrc in the middle of the pipeline then?
What am I getting wrong about the pipeline functionality?
(pipe2.py)
#!/usr/bin/env python
import glib, gobject
glib.threads_init()
import pygst, gst
import sys, os
import subprocess, signal, shlex
def on_handoff(sink, buffer, pad):
print "handoff: %d" % (len(buffer),)
def on_message(bus, message):
print "BUS %s: %s" % (bus.get_name(), message)
if __name__ == "__main__":
# argv = "testprocessing"
# process = subprocess.Popen(shlex.split(argv), close_fds=True,
# stdin=subprocess.PIPE, stdout=subprocess.PIPE)
pipeline = gst.Pipeline("test")
pipeline2 = gst.Pipeline("test2")
src = gst.element_factory_make("audiotestsrc")
q1 = gst.element_factory_make("queue", "sink-queue")
fsink = gst.element_factory_make("fdsink")
fsrc = gst.element_factory_make("fdsrc")
q2 = gst.element_factory_make("queue", "src-queue")
sink = gst.element_factory_make("fakesink")
sink.set_property("signal-handoffs", True)
sink.connect("handoff", on_handoff);
readfd, writefd = os.pipe()
os.write(writefd, "1")
s = os.read(readfd, 1)
assert s == "1"
print "================****************+++++++++++++++++", readfd, writefd
fsink.set_property("fd", writefd)
fsrc.set_property("fd", readfd)
# fsink.set_property("fd", process.stdin.fileno())
# fsrc.set_property("fd", process.stdout.fileno())
pipeline.add(src, q1, fsink)
pipeline2.add(fsrc, q2, sink)
gst.element_link_many(src, q1, fsink)
gst.element_link_many(fsrc, q2, sink)
bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect("message", on_message)
bus2 = pipeline2.get_bus()
bus2.add_signal_watch()
bus2.connect("message", on_message)
mainloop = glib.MainLoop()
pipeline.set_state(gst.STATE_PLAYING)
pipeline2.set_state(gst.STATE_PLAYING)
try:
mainloop.run()
except:
pass
print "Finishing"
#process.send_signal(signal.SIGINT)
#process.wait()
print "Stopping pipeline"
pipeline.set_state(gst.STATE_NULL)
pipeline2.set_state(gst.STATE_NULL)
del pipeline
del pipeline2
More information about the gstreamer-devel
mailing list