<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>I have also done something similar, so here is some example code
      of how to handle the switch on key-frame only.<br>
    </p>
    <pre class="code highlight" lang="python"><span id="LC1" class="line" lang="python">    <span class="k">def</span> <span class="nf">got_buff</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pad</span><span class="p">,</span> <span class="n">info</span><span class="p">,</span> <span class="n">new_pad</span><span class="p">):</span></span>
<span id="LC2" class="line" lang="python">        <span class="n">buf</span> <span class="o">=</span> <span class="n">info</span><span class="p">.</span><span class="n">get_buffer</span><span class="p">()</span></span>
<span id="LC3" class="line" lang="python">    </span>
<span id="LC4" class="line" lang="python">        <span class="k">print</span><span class="p">(</span><span class="s">"Waiting for Key-frame in pad '{}'..."</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">new_pad</span><span class="p">))</span></span>
<span id="LC5" class="line" lang="python">    </span>
<span id="LC6" class="line" lang="python">        <span class="k">if</span> <span class="n">buf</span><span class="p">.</span><span class="n">has_flags</span><span class="p">(</span><span class="n">Gst</span><span class="p">.</span><span class="n">BufferFlags</span><span class="p">.</span><span class="n">DELTA_UNIT</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span></span>
<span id="LC7" class="line" lang="python">            <span class="k">print</span><span class="p">(</span><span class="s">"Key-frame received in pad '{}'"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">new_pad</span><span class="p">))</span></span>
<span id="LC8" class="line" lang="python">    </span>
<span id="LC9" class="line" lang="python">            <span class="bp">self</span><span class="p">.</span><span class="n">selector</span><span class="p">.</span><span class="n">set_property</span><span class="p">(</span><span class="s">"listen-to"</span><span class="p">,</span> <span class="n">new_pad</span><span class="p">)</span></span>
<span id="LC10" class="line" lang="python">    </span>
<span id="LC11" class="line" lang="python">            <span class="k">return</span> <span class="n">Gst</span><span class="p">.</span><span class="n">PadProbeReturn</span><span class="p">.</span><span class="n">REMOVE</span></span>
<span id="LC12" class="line" lang="python">        <span class="k">else</span><span class="p">:</span></span>
<span id="LC13" class="line" lang="python">            <span class="k">return</span> <span class="n">Gst</span><span class="p">.</span><span class="n">PadProbeReturn</span><span class="p">.</span><span class="n">OK</span></span>
<span id="LC14" class="line" lang="python"></span>
<span id="LC15" class="line" lang="python">    <span class="k">def</span> <span class="nf">check_kf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_pad</span><span class="p">,</span> <span class="n">sink</span><span class="p">):</span></span>
<span id="LC16" class="line" lang="python">        <span class="n">current_pad</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">selector</span><span class="p">.</span><span class="n">get_property</span><span class="p">(</span><span class="s">"listen-to"</span><span class="p">)</span></span>
<span id="LC17" class="line" lang="python">        <span class="k">if</span> <span class="n">current_pad</span> <span class="o">==</span> <span class="n">new_pad</span><span class="p">:</span></span>
<span id="LC18" class="line" lang="python">            <span class="k">print</span><span class="p">(</span><span class="s">"Pad already selected"</span><span class="p">)</span></span>
<span id="LC19" class="line" lang="python">            <span class="k">return</span> <span class="bp">True</span></span>
<span id="LC20" class="line" lang="python">    </span>
<span id="LC21" class="line" lang="python">        <span class="c1">#add pad probe</span></span>
<span id="LC22" class="line" lang="python">        <span class="n">pad</span> <span class="o">=</span> <span class="n">sink</span><span class="p">.</span><span class="n">get_static_pad</span><span class="p">(</span><span class="s">"sink"</span><span class="p">)</span></span>
<span id="LC23" class="line" lang="python">        <span class="n">pad</span><span class="p">.</span><span class="n">add_probe</span><span class="p">(</span><span class="n">Gst</span><span class="p">.</span><span class="n">PadProbeType</span><span class="p">.</span><span class="n">BUFFER</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">got_buff</span><span class="p">,</span> <span class="n">new_pad</span><span class="p">)</span></span>
<span id="LC24" class="line" lang="python">    </span>
<span id="LC25" class="line" lang="python">        <span class="k">return</span> <span class="bp">True</span></span>
<span id="LC26" class="line" lang="python">    </span>
<span id="LC27" class="line" lang="python">    <span class="k">def</span> <span class="nf">set_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">new_pad</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span></span>
<span id="LC28" class="line" lang="python">        <span class="bp">self</span><span class="p">.</span><span class="n">selector</span> <span class="o">=</span> <span class="bp">None</span></span>
<span id="LC29" class="line" lang="python">        <span class="n">selector_pipe</span> <span class="o">=</span> <span class="bp">None</span></span>
<span id="LC30" class="line" lang="python">        <span class="k">for</span> <span class="n">pipe</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">pipeline</span><span class="p">:</span></span>
<span id="LC31" class="line" lang="python">            <span class="bp">self</span><span class="p">.</span><span class="n">selector</span> <span class="o">=</span> <span class="n">pipe</span><span class="p">.</span><span class="n">get_by_name</span><span class="p">(</span><span class="s">"vselect"</span><span class="p">)</span></span>
<span id="LC32" class="line" lang="python">            <span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">selector</span><span class="p">:</span></span>
<span id="LC33" class="line" lang="python">                <span class="n">selector_pipe</span> <span class="o">=</span> <span class="n">pipe</span></span>
<span id="LC34" class="line" lang="python">                <span class="k">break</span></span>
<span id="LC35" class="line" lang="python">        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">.</span><span class="n">selector</span><span class="p">:</span></span>
<span id="LC36" class="line" lang="python">            <span class="k">print</span><span class="p">(</span><span class="s">"Couldn't find input-selector named 'vselect'"</span><span class="p">)</span></span>
<span id="LC37" class="line" lang="python">            <span class="k">return</span> <span class="bp">False</span></span>
<span id="LC38" class="line" lang="python">        </span>
<span id="LC39" class="line" lang="python">        <span class="n">i</span><span class="o">=</span><span class="mi">0</span></span>
<span id="LC40" class="line" lang="python">        <span class="n">found</span> <span class="o">=</span> <span class="bp">False</span></span>
<span id="LC41" class="line" lang="python">        <span class="k">for</span> <span class="n">pipe</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">pipeline</span><span class="p">:</span></span>
<span id="LC42" class="line" lang="python">            <span class="n">sink</span> <span class="o">=</span> <span class="n">pipe</span><span class="p">.</span><span class="n">get_by_name</span><span class="p">(</span><span class="n">new_pad</span><span class="p">)</span></span>
<span id="LC43" class="line" lang="python">            <span class="k">if</span> <span class="n">sink</span><span class="p">:</span></span>
<span id="LC44" class="line" lang="python">                <span class="k">break</span></span>
<span id="LC45" class="line" lang="python">            <span class="n">i</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span></span>
<span id="LC46" class="line" lang="python">        <span class="k">if</span> <span class="ow">not</span> <span class="n">sink</span><span class="p">:</span></span>
<span id="LC47" class="line" lang="python">            <span class="k">print</span><span class="p">(</span><span class="s">"Couldn't find new_pad named "</span> <span class="o">+</span> <span class="n">new_pad</span><span class="p">)</span></span>
<span id="LC48" class="line" lang="python">            <span class="k">return</span> <span class="bp">False</span></span>
<span id="LC49" class="line" lang="python">        </span>
<span id="LC50" class="line" lang="python">        <span class="c1">#selector.set_property("listen-to", new_pad)</span></span>
<span id="LC51" class="line" lang="python">        <span class="bp">self</span><span class="p">.</span><span class="n">check_kf</span><span class="p">(</span><span class="n">new_pad</span><span class="p">,</span> <span class="n">sink</span><span class="p">)</span></span>
<span id="LC52" class="line" lang="python">        <span class="k">return</span> <span class="bp">True</span></span>
</pre>
    <p>Note that I use 'interpipesrc/sink' instead of 'inputselector',
      but the principle is the same.<br>
    </p>
    <div class="moz-cite-prefix">On 14.04.2022 14.00,
      <a class="moz-txt-link-abbreviated" href="mailto:gstreamer-devel-request@lists.freedesktop.org">gstreamer-devel-request@lists.freedesktop.org</a> wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:mailman.43.1649937603.7463.gstreamer-devel@lists.freedesktop.org">
      <blockquote type="cite" style="color: #007cff;">
        <pre class="moz-quote-pre" wrap="">I'm trying to switch between two streams and publish it to a RTMP server using input-selector as follows:

</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">I am assuming that the stream works if you do not switch at runtime?
It's not so simple to switch between two h264 streams like this. You
need to account for the following:

1. Video frames can only be decoded with a reference frame, so you can
only switch streams on a keyframe.
2. Both streams must have the same characteristics (resolution,
framerate, level, profile, etc), or downstream must be able to
renegotiate
3. If reneg is needed, then you must resend the SPS/PPS with every
switch (config-interval=-1 on h264parse should do that for you)
4. If reneg is needed, some endpoints may only be able to handle a
subset of stream characteristics changes dynamically

(1) and (3) are probably what you are missing here.

Cheers,
Nirbheek</pre>
    </blockquote>
    <pre class="moz-signature" cols="72">-- 
Best regards / Med venlig hilsen
“Marianna Smidth Buschle”</pre>
  </body>
</html>