[gst-devel] info about dynamic request pads

Luca Ognibene luca.ognibene at gmail.com
Mon Jan 19 11:10:45 CET 2009


Hi, i would like to create a bin that works this way:
 * a single sink pad
 * src%d are request pad
 * inside the bin i have the sink pad linked to a tee
 * every time i request a pad i want my bin to create a "queue !
identity" bin and attach it to the internal tee
 * every time i release a pad i want my bin to stop the "queue !
identity" bin and release the internal tee pad

Everything work if the bin is in the NULL state but i have
segfaults/hangs if the bin is in PLAYING state. I've tried to read
part-block and other
docs but i'm not able to fix this problem..

I've implemented the bin this way:
 * in _init the internal tee is created

 * test app call bin.get_request_pad('src0')

 * in _request_new_pad:
   * get element state
   * request a pad from internal tee
   * block this pad if state is PLAYING
   * add the "queue ! identity" bin
   * create the ghost pad and set target to bin.src
   * link tee request pad to bin.sink
   * call sync_state_with_parent on the bin (is this ok? right now
bin.src is not linked and the bin is in playing state)
   * unblock tee request pad

 * test app block received ghost pad
 * add queue ! fakesink
 * link them to ghost pad
 * call sync_state_with_parent on queue and fakesink
 * unblock ghost pad

Problems:
 * sometime (really often) program hangs on blocking ghost pad
 * sometime (not very often) i have segfaults while queue is trying to
fixate caps

A strange thing is that if i change my bin to add "identity !
identity" instead of "queue ! identity" everything works fine.. but i
don't know why! And i need the queue there :)

This is a svg graph of my pipeline after having received the ghost
pad: http://people.freedesktop.org/~skaboy/test76-3.dot.svg
I'm using gstreamer 0.10.21 (core).

ciao
Luca




More information about the gstreamer-devel mailing list