Question regarding use of interleaved and deinterleaved elements in processing chain
Hauke Krüger
public-hk at ind.rwth-aachen.de
Tue Aug 23 13:23:13 UTC 2016
On 08/23/2016 10:24 AM, Sebastian Dröge wrote:
> On Mon, 2016-08-22 at 21:15 +0200, Hauke Krüger wrote:
>>> You'll have to connect to the "pad-added" signal of it, and from there
>>> link the pads further. See also the first part in chapter 8 of the
>>> manual (application developer's manual).
>> Yes, that worked out as you said. However, it seems to be impossible to
>> set the pipeline into the
>> PLAYING state afterwards: Whenever trying to set the state of the
>> pipeline to PLAYING, the pipeline element
>> is blocked since it expects an ASYNC state change which unfortunately
>> never really is solved.
>>
>> How is that part supposed to work? Is there any way to somehow observe
>> the ASYNC state change by catching
>> a message in the main loop?
> That all depends on your actual pipeline. How does it look like?
>
> Most commonly this means that you have one or more sinks in your
> pipeline that never receive any buffer and are async=true (which is the
> default). You should check where data flows in your pipeline and why it
> doesn't reach all sinks. Also check if you get any error messages.
>
>
My pipeline is rather simple:
alsasrc -> capsfilter -> deinterleaver -<channel0>-> interleaver ->
capsfilter -> alsasink
-<channel1>->
alsasrc and alsasink are configured to allow 2 channels, no rate
conversion must be
done.
I tracked the problem by means of my debugger: once all pads are
connected, I can see
the deinterleaver working: It has 2 output sources and I can see the
code in which the deinterleaver
loops over all sources here: deinterleave.c, line 896 (current master
release of gstreamer 1.0 project).
I see that the function "gst_pad_push" is used within the loop to pass
the single buffers to the connected
interleaver sink.
When debugging into this function call of "gst_pad_push" for the first
single buffer to be transferred, I end
up in "gstcollectpad.c" since the interleaver seems to use this
collector block. The buffers seem to arrive
in function "gst_collect_pads_chain" to wait for all buffers before
interleaving takes place.
Debugger shows that the first buffer is accepted but the program flow
ends in a non-returning wait condition
in line 2257 in "gstcollectpad.c",
/* wait to be collected, this must happen from another thread triggered
* by the _chain function of another pad. We release the lock so we
* can get stopped or flushed as well. We can however not get EOS
* because we still hold the STREAM_LOCK.
*/
GST_COLLECT_PADS_STREAM_UNLOCK (pads);
GST_COLLECT_PADS_EVT_WAIT (pads, cookie); <---- HERE
GST_COLLECT_PADS_STREAM_LOCK (pads);
It seems that the wait will persist locked until the chain function is
called from within the context of another thread.
This behavior would make sense if the deinterleaver would decompose the
single buffers to be
processed within different thread contexts. This, however, seems not to
be the case.
Do I miss to set a specific property to tell the interleaver that it
shall not be in wait mode? Or is there another trick which
I would need to employ?
Thank you and best regards
Hauke
More information about the gstreamer-devel
mailing list