<meta http-equiv="content-type" content="text/html; charset=utf-8"><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif; font-size: 13px; "><div>Hi, I&#39;ve been trying hard to use the gstrtpbin plugin to be able to receive streams with different payloads at different times. </div>

<div><br></div><div>My objective is be able to comply with the RFC 3264 when it says that when sending an SDP, the offerer should be ready to receive any of the stream formats offered.</div><div><br></div><div>So, for instance I&#39;d need a pipeline that is ready to receive H264 or H263-1998 (obviously one of them only not both at the same time), and I thought a pipeline like the following would do the job:</div>

<div><br></div><div>gstrtpbin name=rtpbin \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5000 ! queue ! rtpbin.recv_rtp_sink_0 \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin. ! queue ! rtph263pdepay name=rtph263 ! ffdec_h263 ! xvimagesink sync=false \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin. ! queue ! rtph264depay name=rtph264 ! ffdec_h264 ! xvimagesink \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5005 sync=false async=false</div><div><br></div><div>Then I capture the signal request-pt-map, where according to the pt-number I set the caps for the incoming stream.</div>

<div><br></div><div>Well I found that if I don&#39;t send all of the formats I described in the pipeline the pipeline reproduces one frame and stops.</div><div><br></div><div>I also tried a pipeline like the following:</div>

<div><br></div><div>gstrtpbin name=rtpbin \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtph264depay name=rtph264 ! ffdec_h264 ! xvimagesink \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtph263pdepay name=rtph263 ! ffdec_h263 ! xvimagesink sync=false \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5000 ! queue ! rtpbin.recv_rtp_sink_0 \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5005 sync=false async=false</div><div><br></div><div>As you can see the codec dependent part is not connected anywhere, here I also capture the payload-type-change which is called after the creation of the corresponding src pad in the rtpbin after setting the caps for the corresponding incoming stream. In this signal I succesfully connect the corresponding element to the gstrtpbin. Again if the plugin is not receiving all the streams it plays one frame and stops...</div>

<div><br></div><div>Also, I tried using the output-selector plugin like these with similar results:</div><div><br></div><div>gstrtpbin name=rtpbin \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    output-selector name=video \</div>

<div>            video. ! rtph264depay name=rtph264 ! ffdec_h264 ! xvimagesink \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    video. ! rtph263pdepay name=rtph263 ! ffdec_h263 ! xvimagesink sync=false \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5000 ! queue ! rtpbin.recv_rtp_sink_0 \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5005 sync=false async=false</div><div><br></div><div>Finally I tried to create the codec dependent parts of the pipeline in different bins like this:</div>

<div><br></div><div> _h263pbin = gst_parse_bin_from_description_full(&quot;bin. ( rtph263pdepay name=rtph263 ! ffdec_h263 ! xvimagesink sync=false )&quot;, TRUE, context, 0, &amp;e);</div><div>  </div><div> _h264bin = gst_parse_bin_from_description_full(&quot;bin. ( rtph264depay name=rtph264 ! ffdec_h264 ! xvimagesink )&quot;, TRUE, context, 0, &amp;e);</div>

<div> </div><div> pipeline = gst_parse_launch_full(&quot;gstrtpbin name=rtpbin \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5000 ! queue ! rtpbin.recv_rtp_sink_0 \</div><div>

<span class="Apple-tab-span" style="white-space: pre; ">        </span>    udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5005 sync=false async=false \</div>

<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>    &quot;, context, 0, &amp;e);</div><div><br></div><div><br></div><div>Then I add the corresponding codec bin to the main bin accordingly, and now even though I generate a pipeline without references to any other codec again it plays one frame and complains saying: Unhandled state change from VOID_PENDING to PLAYING</div>

<div><br></div><div>Well I don&#39;t know what else to do... any help would really appreciated. My main problem is that even though I&#39;ve read all that I found about blocking in Gstreamer I don&#39;t fully get it, for instance I don&#39;t understand why in the first tests I describe here the pipeline dependent part that is not linked to the rest of the pipeline can block the whole pipeline.</div>

<div><br></div><div>Also if someone can point me real examples of gstreamer applications that change their pipeline structure while being on the playing state would be really useful.</div><div><br></div><div>Thanks,</div>

<div><br></div><div>Antoni Silvestre</div></span>