<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m trying to use an input selector using as inputs a filesrc and an appsrc.  The pipeline goes to playing state, and if I start with either source as the active pad, it works well.  I can see input on both sinks, and drops for the inactive
 pad.  When I change the active pad, I now no longer receive anything  on that sink.  When I change the active pad back, I now no longer receive anything on either sink.  Is there something basic about an input selector that I’m missing?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here is the code for creating the sources and input-selector, then the code for changing the active pad…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">      m_pDecodePipeline = gst_pipeline_new ("decode_pipeline_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert (m_pDecodePipeline);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/*<o:p></o:p></p>
<p class="MsoNormal">* Create the static screen source<o:p></o:p></p>
<p class="MsoNormal">*/<o:p></o:p></p>
<p class="MsoNormal">        GstElement *pStaticScreenSourceElement = gst_element_factory_make("filesrc", "static_screen_source_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(pStaticScreenSourceElement);<o:p></o:p></p>
<p class="MsoNormal">        g_object_set(G_OBJECT(pStaticScreenSourceElement), "location", "./static_screen.jpg", "do-timestamp", TRUE, NULL);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        GstElement *pStaticScreenDecoder = gst_element_factory_make("nv_omx_jpegdec", "static_screen_decoder_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(pStaticScreenDecoder);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        GstElement *pImageFreezeElement = gst_element_factory_make("imagefreeze", "static_screen_freeze_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(pImageFreezeElement);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/*<o:p></o:p></p>
<p class="MsoNormal">* now the appsrc part of the pipeline<o:p></o:p></p>
<p class="MsoNormal">*/<o:p></o:p></p>
<p class="MsoNormal">        m_pDecodeAppSrcElement = gst_element_factory_make ("appsrc", "decode_app_src_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(m_pDecodeAppSrcElement);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        GstAppSrcCallbacks callbacks;<o:p></o:p></p>
<p class="MsoNormal">        callbacks.need_data = need_data;<o:p></o:p></p>
<p class="MsoNormal">        callbacks.enough_data = enough_data;<o:p></o:p></p>
<p class="MsoNormal">        callbacks.seek_data = NULL;                 // we won't ever be seeking on this<o:p></o:p></p>
<p class="MsoNormal">        gst_app_src_set_callbacks(GST_APP_SRC(m_pDecodeAppSrcElement), &callbacks, this, notify);<o:p></o:p></p>
<p class="MsoNormal">        g_object_set(G_OBJECT(m_pDecodeAppSrcElement), "is-live", TRUE, "do-timestamp", TRUE, NULL);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        m_pDecodeElement = gst_element_factory_make("nv_omx_h264dec", "decode_element");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(m_pDecodeElement);<o:p></o:p></p>
<p class="MsoNormal">/*<o:p></o:p></p>
<p class="MsoNormal">* get the input multiplexer<o:p></o:p></p>
<p class="MsoNormal">*/<o:p></o:p></p>
<p class="MsoNormal">        m_pDecodePipelineInputSelector = gst_element_factory_make("input-selector", "decode_pipeline_input_selector");<o:p></o:p></p>
<p class="MsoNormal">        g_assert(m_pDecodePipelineInputSelector);<o:p></o:p></p>
<p class="MsoNormal">        g_object_set(G_OBJECT(m_pDecodePipelineInputSelector), "sync-streams", TRUE, NULL);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">….. more elements on the other side…..<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">bool bDecodePipelineLinked = gst_element_link_many(pStaticScreenSourceElement,<o:p></o:p></p>
<p class="MsoNormal">                        pStaticScreenDecoder,<o:p></o:p></p>
<p class="MsoNormal">                        pImageFreezeElement,<o:p></o:p></p>
<p class="MsoNormal">                        NULL);<o:p></o:p></p>
<p class="MsoNormal">        if (!bDecodePipelineLinked)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                Trace("StaticScreen link failed\n");<o:p></o:p></p>
<p class="MsoNormal">                assert(FALSE);<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        bDecodePipelineLinked = gst_element_link_many(m_pDecodeAppSrcElement,<o:p></o:p></p>
<p class="MsoNormal">                        m_pDecodeElement,<o:p></o:p></p>
<p class="MsoNormal">                        NULL);<o:p></o:p></p>
<p class="MsoNormal">        if (!bDecodePipelineLinked)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                Trace("Appsrc link failed\n");<o:p></o:p></p>
<p class="MsoNormal">               assert(FALSE);<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        bDecodePipelineLinked = gst_element_link(<o:p></o:p></p>
<p class="MsoNormal">                        m_pDecodePipelineInputSelector,<o:p></o:p></p>
<p class="MsoNormal">                        m_pDecodeOutputBin);<o:p></o:p></p>
<p class="MsoNormal">        if (!bDecodePipelineLinked)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                Trace("m_pDecodePipeline didn't link\n");<o:p></o:p></p>
<p class="MsoNormal">                assert(FALSE);<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">bDecodePipelineLinked = gst_element_link(m_pDecodeElement, m_pDecodePipelineInputSelector);<o:p></o:p></p>
<p class="MsoNormal">        if (!bDecodePipelineLinked)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                Trace("DecodeElement->InputsSelector link failed\n");<o:p></o:p></p>
<p class="MsoNormal">                 assert(FALSE);<o:p></o:p></p>
<p class="MsoNormal">         }<o:p></o:p></p>
<p class="MsoNormal">        bDecodePipelineLinked = gst_element_link(pImageFreezeElement, m_pDecodePipelineInputSelector);<o:p></o:p></p>
<p class="MsoNormal">        if (!bDecodePipelineLinked)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                Trace("ImageFreezeElement->InputsSelector link failed\n");<o:p></o:p></p>
<p class="MsoNormal">                assert(FALSE);<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        GstPad *pSinkpad;<o:p></o:p></p>
<p class="MsoNormal">        pSinkpad = gst_element_get_static_pad(m_pDecodePipelineInputSelector, "sink0");<o:p></o:p></p>
<p class="MsoNormal">        g_object_set(G_OBJECT(m_pDecodePipelineInputSelector), "active-pad", pSinkpad, NULL);<o:p></o:p></p>
<p class="MsoNormal">        gst_object_unref(pSinkpad);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">and the rest of the pipeline….. code for selecting the active pad….<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int myClass::SwitchSinks(int which)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">        gint64 stop_time = 0;<o:p></o:p></p>
<p class="MsoNormal">        GstPad *pad;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        if (which == m_Which)      // is anything changing?<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                return(SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        if (which)<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                pad = gst_element_get_static_pad(m_pDecodePipelineInputSelector, "sink1");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        else<o:p></o:p></p>
<p class="MsoNormal">        {<o:p></o:p></p>
<p class="MsoNormal">                pad = gst_element_get_static_pad(m_pDecodePipelineInputSelector, "sink0");<o:p></o:p></p>
<p class="MsoNormal">        }<o:p></o:p></p>
<p class="MsoNormal">        g_signal_emit_by_name(m_pDecodePipelineInputSelector, "block", &stop_time);<o:p></o:p></p>
<p class="MsoNormal">        g_signal_emit_by_name(m_pDecodePipelineInputSelector, "switch", pad, -1, -1);<o:p></o:p></p>
<p class="MsoNormal">        gst_object_unref(pad);<o:p></o:p></p>
<p class="MsoNormal">        m_which = which;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        return(SUCCESS);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</body>
</html>