<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>