<div dir="ltr">Hello,<div><br></div><div>From my quick look, I can suggest next:</div><div>You're blocking Downstream at the decodebin's pad. But as I understand from your code, EOS event travels downstream from the encoder to udpsink.</div><div>So, you should consider or block upstream on the udpsink, or catch EOS event before it went downstream, or re-initialize udpsink (through READY->PLAYING) STATES again.</div><div>But IMHO, you should avoid sending EOS (as you do not actually have EOS, 'cos you're planning to continue streaming with another encoding)</div><div><br></div><div>Best regards,</div><div>Anton.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 7, 2020 at 1:25 AM MustafaBkrc <<a href="mailto:mustafa.bkrc93@gmail.com">mustafa.bkrc93@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I have an issue about changing GStreamer encoder elements, h264 to h265, at<br>
runtime. I followed the instruction and used example code from gstreamer<br>
pipeline manipulation.<br>
<br>
<a href="https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#dynamically-changing-the-pipeline" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#dynamically-changing-the-pipeline</a><br>
<<a href="https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#dynamically-changing-the-pipeline" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#dynamically-changing-the-pipeline</a>>  <br>
<br>
I can successfully change the h264 to h265 encoder element at runtime but I<br>
think there are something left about the h264 encoder signature in the<br>
pipeline and also I cannot get the frame from pipeline  these is the output<br>
from ffplay command (ffplay  udp://@:9000?listen -analyzeduration 1M)<br>
<br>
<br>
<a href="https://i.stack.imgur.com/auV14.png" rel="noreferrer" target="_blank">https://i.stack.imgur.com/auV14.png</a><br>
<br>
I wonder how can I overcome this issue, is it about a timing issue or<br>
something? I would be very appreciated of any help. Thanks.<br>
<br>
This is the full code <br>
<br>
    #include <iostream><br>
    #include <gst/gst.h><br>
    #include <thread><br>
    #include <unistd.h><br>
<br>
    using namespace std;<br>
<br>
    /// Example Pipeline ///<br>
    //gst-launch-1.0 filesrc<br>
location=/home/ubuntu18/Desktop/BigBuckBunny.mp4 ! video/x-raw, width=1920, <br>
    //height=1080, format=NV16_LE32, framerate=60/1 ! decodebin ! x264enc !<br>
mpegtsmux alignment=7 ! <br>
    //udpsink host=127.0.0.1 port=9000 --gst-debug=3<br>
<br>
    static gboolean my_bus_callback (GstBus * bus, GstMessage * message,<br>
gpointer data);<br>
<br>
        struct GstreamerStream<br>
        {<br>
            GstElement *pipeline;<br>
            GstElement *filesrc;<br>
            GstElement *capsfilter;<br>
            GstElement *decodebin;<br>
            GstElement *x264enc;<br>
            GstElement *x265enc;<br>
            GstElement *mpegtsmux1;<br>
            GstElement *udpsink1 ;<br>
<br>
            GstPad *decodebinPad;<br>
<br>
            GMainLoop *loop;<br>
            GstBus    *bus;<br>
            GstMessage  *msg;<br>
        };<br>
<br>
        void signal_cb (GstElement* object, GstPad* pad, gpointer user_data)<br>
        {<br>
            auto data = reinterpret_cast<GstreamerStream*>(user_data);<br>
            GstPad *decodebin_src_pad= gst_element_get_static_pad (object,<br>
"src%u");<br>
            GstPad* x264enc_sink_pad =<br>
gst_element_get_static_pad(data->x264enc,"sink");<br>
<br>
            g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME<br>
(pad), GST_ELEMENT_NAME (object));<br>
<br>
            /* If our converter is already linked, we have nothing to do<br>
here */<br>
            if (gst_pad_is_linked (pad)) {<br>
              g_print ("We are already linked. Ignoring.\n");<br>
            }<br>
<br>
            /* Attempt the link */<br>
            auto ret = gst_pad_link (pad, x264enc_sink_pad);<br>
<br>
            if (GST_PAD_LINK_FAILED (ret)) {<br>
              g_print ("Type is '%s' but link failed.\n", pad);<br>
            } else {<br>
              g_print ("Link succeeded (type '%s').\n", pad);<br>
              data->decodebinPad = pad;<br>
            }<br>
<br>
            gst_object_unref (x264enc_sink_pad);<br>
        }<br>
<br>
        static GstPadProbeReturn<br>
        event_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer<br>
user_data)<br>
        {<br>
            auto stream =  reinterpret_cast<GstreamerStream*>(user_data);<br>
<br>
            GstElement *next = stream->x265enc;<br>
<br>
            if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) !=<br>
GST_EVENT_EOS)<br>
              return GST_PAD_PROBE_PASS;<br>
<br>
            gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));<br>
<br>
            g_print ("Switching from '%s' to '%s'..\n", GST_OBJECT_NAME<br>
(stream->x264enc),<br>
                GST_OBJECT_NAME (next));<br>
<br>
            gst_element_set_state (stream->x264enc, GST_STATE_NULL);<br>
<br>
            /* remove unlinks automatically */<br>
            GST_DEBUG_OBJECT (stream->pipeline, "removing %" GST_PTR_FORMAT,<br>
stream->x264enc);<br>
            gst_bin_remove (GST_BIN (stream->pipeline), stream->x264enc);<br>
<br>
            GST_DEBUG_OBJECT (stream->pipeline, "adding   %" GST_PTR_FORMAT,<br>
next);<br>
            gst_bin_add (GST_BIN (stream->pipeline), next);<br>
<br>
            auto enc265sinkpad = gst_element_get_static_pad(next,"sink");<br>
            if(!gst_pad_link(stream->decodebinPad,enc265sinkpad))<br>
              std::cout << "Linked src and sink pad success " << std::endl;<br>
<br>
            GST_DEBUG_OBJECT (stream->pipeline, "linking..");<br>
<br>
            gst_element_link_many (next, stream->mpegtsmux1, NULL);<br>
            gst_element_sync_state_with_parent(next);<br>
            GST_DEBUG_OBJECT (stream->pipeline, "done");<br>
<br>
            auto elem = <br>
gst_bin_get_by_name(GST_BIN(stream->pipeline),"x265enc_elem");<br>
            if(elem)<br>
                std::cout <<" ***** Element name : " <<<br>
GST_OBJECT_NAME(elem) << " *****" << std::endl;<br>
            else<br>
            {<br>
                auto elem2 = <br>
gst_bin_get_by_name(GST_BIN(stream->pipeline),"x264enc_elem");<br>
                std::cout <<" ***** Element name : " <<<br>
GST_OBJECT_NAME(elem2) << " *****" << std::endl;<br>
            }<br>
<br>
          return GST_PAD_PROBE_DROP;<br>
        }<br>
<br>
<br>
        static GstPadProbeReturn<br>
        pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer<br>
user_data)<br>
        {<br>
          GstPad *srcpad, *sinkpad;<br>
          auto stream = reinterpret_cast<GstreamerStream*>(user_data);<br>
<br>
          GST_DEBUG_OBJECT (pad, "pad is blocked now");<br>
<br>
          /* remove the probe first */<br>
          gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));<br>
          auto filesrcPad =<br>
gst_element_get_static_pad(stream->filesrc,"src");<br>
<br>
          /* install new probe for EOS */<br>
          srcpad = gst_element_get_static_pad (stream->x264enc, "src");<br>
<br>
          gst_pad_add_probe (srcpad,<br>
static_cast<GstPadProbeType>(GST_PAD_PROBE_TYPE_BLOCK |<br>
              GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), event_probe_cb,<br>
user_data, NULL);<br>
          gst_object_unref (srcpad);<br>
<br>
          /* push EOS into the element, the probe will be fired when the<br>
           * EOS leaves the effect and it has thus drained all of its data<br>
*/<br>
          sinkpad = gst_element_get_static_pad (stream->x264enc, "sink");<br>
          gst_pad_send_event (sinkpad, gst_event_new_eos ());<br>
<br>
          gst_object_unref (sinkpad);<br>
<br>
          return GST_PAD_PROBE_OK;<br>
        }<br>
<br>
        static gboolean<br>
        timeout_cb (gpointer user_data)<br>
        {<br>
            auto stream = reinterpret_cast<GstreamerStream*>(user_data);<br>
            auto blockPad = stream->decodebinPad;<br>
<br>
            std::cout  << "Pad name : " << (GST_DEBUG_PAD_NAME(blockPad)) <<<br>
std::endl;<br>
<br>
          gst_pad_add_probe (blockPad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,<br>
              pad_probe_cb, user_data, NULL);<br>
<br>
<br>
          return TRUE;<br>
        }<br>
<br>
        int main()<br>
        {<br>
<br>
            gst_init(NULL,NULL);<br>
<br>
            static GstreamerStream stream;<br>
            stream.pipeline =<br>
gst_element_factory_make("pipeline","pipeline_elem");<br>
            stream.filesrc =<br>
gst_element_factory_make("filesrc","filesrc_elem");<br>
            stream.capsfilter =<br>
gst_element_factory_make("capsfilter","capsfilter_elem");<br>
            stream.decodebin =<br>
gst_element_factory_make("decodebin","decodebin_elem");<br>
<br>
            stream.x264enc =<br>
gst_element_factory_make("x264enc","x264enc_elem");<br>
            stream.x265enc =<br>
gst_element_factory_make("x265enc","x265enc_elem");<br>
            stream.mpegtsmux1 =<br>
gst_element_factory_make("mpegtsmux","mpegtsmux_element");<br>
            stream.udpsink1 =<br>
gst_element_factory_make("udpsink","udpsink_element");<br>
<br>
            if(!stream.pipeline, !stream.filesrc || !stream.capsfilter ||<br>
!stream.decodebin  || !stream.x264enc || !stream.mpegtsmux1 ||<br>
!stream.udpsink1)<br>
            {<br>
                g_error("Element create error");<br>
            }<br>
<br>
<br>
g_object_set(stream.filesrc,"location","/home/mbkrc/Desktop/ElephantsDream.mp4",NULL);<br>
<br>
<br>
            g_object_set(stream.mpegtsmux1,"alignment",7,NULL);<br>
<br>
g_object_set(stream.udpsink1,"host","127.0.0.1","port",9000,"sync", FALSE,<br>
"async", FALSE,NULL);<br>
            g_object_set (G_OBJECT (stream.x264enc), "bitrate", 1000, NULL);<br>
<br>
<br>
<br>
gst_bin_add_many(GST_BIN(stream.pipeline),stream.filesrc,stream.capsfilter,stream.decodebin,stream.x264enc,<br>
                             stream.mpegtsmux1,stream.udpsink1,NULL);<br>
<br>
<br>
           auto newCaps = gst_caps_new_simple("video/x-raw",<br>
                   "width", G_TYPE_INT, 1920,<br>
                   "height", G_TYPE_INT, 1080,<br>
                   "framerate", GST_TYPE_FRACTION, 60, 1, NULL);<br>
<br>
           g_object_set(stream.capsfilter,"caps",newCaps,NULL);<br>
<br>
<br>
gst_element_link_many(stream.filesrc,stream.capsfilter,stream.decodebin,NULL);<br>
<br>
<br>
if(!gst_element_link_many(stream.x264enc,stream.mpegtsmux1,stream.udpsink1,NULL))<br>
                std::cerr << "Link Failed" << std::endl;<br>
<br>
<br>
g_signal_connect(stream.decodebin,"pad-added",(GCallback)signal_cb,&stream);<br>
<br>
            stream.bus = gst_pipeline_get_bus (GST_PIPELINE<br>
(stream.pipeline));<br>
            auto bus_watch_id = gst_bus_add_watch (stream.bus,<br>
my_bus_callback, stream.loop);<br>
            gst_object_unref (stream.bus);<br>
<br>
<br>
            gst_element_set_state(stream.pipeline,GST_STATE_PLAYING);<br>
<br>
            std::thread th{[&]()<br>
                           {<br>
                            sleep(5);<br>
                            timeout_cb(&stream);<br>
                           }};<br>
<br>
            stream.loop = g_main_loop_new (NULL, FALSE);<br>
            g_main_loop_run (stream.loop);<br>
<br>
            /* clean up */<br>
            gst_element_set_state (stream.pipeline, GST_STATE_NULL);<br>
            gst_object_unref (stream.pipeline);<br>
            g_source_remove (bus_watch_id);<br>
            g_main_loop_unref (stream.loop);<br>
<br>
            return 0;<br>
        }<br>
<br>
        static gboolean<br>
        my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)<br>
        {<br>
          g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));<br>
          auto loop = reinterpret_cast<GMainLoop*>(data);<br>
<br>
          switch (GST_MESSAGE_TYPE (message)) {<br>
            case GST_MESSAGE_ERROR:{<br>
              GError *err;<br>
              gchar *debug;<br>
<br>
              gst_message_parse_error (message, &err, &debug);<br>
              g_print ("Error: %s\n", err->message);<br>
              g_error_free (err);<br>
              g_free (debug);<br>
<br>
              g_main_loop_quit (loop);<br>
              break;<br>
            }<br>
          case GST_MESSAGE_ASYNC_DONE:<br>
          {<br>
              std::cout << "Asyn Done : " << std::endl;<br>
              break;<br>
          }<br>
            case GST_MESSAGE_EOS:<br>
              /* end-of-stream */<br>
              g_main_loop_quit (loop);<br>
              break;<br>
            default:<br>
              /* unhandled message */<br>
              break;<br>
          }<br>
        }<br>
        `<br>
<br>
<br>
 Hello,<br>
<br>
I have an issue about changing GStreamer encoder elements, h264 to h265, at<br>
runtime. I followed the instruction and used example code from [gstreamer<br>
pipeline manipulation at runtime][1]<br>
<br>
<br>
I can successfully change the h264 to h265 encoder element at runtime but I<br>
think there are something left about the h264 encoder signature in the<br>
pipeline and also I cannot get the frame from pipeline  these is the output<br>
from ffplay command (ffplay  udp://@:9000?listen -analyzeduration<br>
1M)org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#dynamically-changing-the-pipeline<br>
  [2]: <a href="https://i.stack.imgur.com/auV14.png" rel="noreferrer" target="_blank">https://i.stack.imgur.com/auV14.png</a><br>
<br>
I wonder how can I overcome this issue, is it about a timing issue or<br>
something? I would be very appreciated of any help. Thanks.<br>
<br>
This is the full code <br>
<br>
    #include <iostream><br>
    #include <gst/gst.h><br>
    #include <thread><br>
    #include <unistd.h><br>
<br>
    using namespace std;<br>
<br>
    /// Example Pipeline ///<br>
    //gst-launch-1.0 filesrc<br>
location=/home/ubuntu18/Desktop/BigBuckBunny.mp4 ! video/x-raw, width=1920, <br>
    //height=1080, format=NV16_LE32, framerate=60/1 ! decodebin ! x264enc !<br>
mpegtsmux alignment=7 ! <br>
    //udpsink host=127.0.0.1 port=9000 --gst-debug=3<br>
<br>
    static gboolean my_bus_callback (GstBus * bus, GstMessage * message,<br>
gpointer data);<br>
<br>
        struct GstreamerStream<br>
        {<br>
            GstElement *pipeline;<br>
            GstElement *filesrc;<br>
            GstElement *capsfilter;<br>
            GstElement *decodebin;<br>
            GstElement *x264enc;<br>
            GstElement *x265enc;<br>
            GstElement *mpegtsmux1;<br>
            GstElement *udpsink1 ;<br>
<br>
            GstPad *decodebinPad;<br>
<br>
            GMainLoop *loop;<br>
            GstBus    *bus;<br>
            GstMessage  *msg;<br>
        };<br>
<br>
        void signal_cb (GstElement* object, GstPad* pad, gpointer user_data)<br>
        {<br>
            auto data = reinterpret_cast<GstreamerStream*>(user_data);<br>
            GstPad *decodebin_src_pad= gst_element_get_static_pad (object,<br>
"src%u");<br>
            GstPad* x264enc_sink_pad =<br>
gst_element_get_static_pad(data->x264enc,"sink");<br>
<br>
            g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME<br>
(pad), GST_ELEMENT_NAME (object));<br>
<br>
            /* If our converter is already linked, we have nothing to do<br>
here */<br>
            if (gst_pad_is_linked (pad)) {<br>
              g_print ("We are already linked. Ignoring.\n");<br>
            }<br>
<br>
            /* Attempt the link */<br>
            auto ret = gst_pad_link (pad, x264enc_sink_pad);<br>
<br>
            if (GST_PAD_LINK_FAILED (ret)) {<br>
              g_print ("Type is '%s' but link failed.\n", pad);<br>
            } else {<br>
              g_print ("Link succeeded (type '%s').\n", pad);<br>
              data->decodebinPad = pad;<br>
            }<br>
<br>
            gst_object_unref (x264enc_sink_pad);<br>
        }<br>
<br>
        static GstPadProbeReturn<br>
        event_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer<br>
user_data)<br>
        {<br>
            auto stream =  reinterpret_cast<GstreamerStream*>(user_data);<br>
<br>
            GstElement *next = stream->x265enc;<br>
<br>
            if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) !=<br>
GST_EVENT_EOS)<br>
              return GST_PAD_PROBE_PASS;<br>
<br>
            gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));<br>
<br>
            g_print ("Switching from '%s' to '%s'..\n", GST_OBJECT_NAME<br>
(stream->x264enc),<br>
                GST_OBJECT_NAME (next));<br>
<br>
            gst_element_set_state (stream->x264enc, GST_STATE_NULL);<br>
<br>
            /* remove unlinks automatically */<br>
            GST_DEBUG_OBJECT (stream->pipeline, "removing %" GST_PTR_FORMAT,<br>
stream->x264enc);<br>
            gst_bin_remove (GST_BIN (stream->pipeline), stream->x264enc);<br>
<br>
            GST_DEBUG_OBJECT (stream->pipeline, "adding   %" GST_PTR_FORMAT,<br>
next);<br>
            gst_bin_add (GST_BIN (stream->pipeline), next);<br>
<br>
            auto enc265sinkpad = gst_element_get_static_pad(next,"sink");<br>
            if(!gst_pad_link(stream->decodebinPad,enc265sinkpad))<br>
              std::cout << "Linked src and sink pad success " << std::endl;<br>
<br>
            GST_DEBUG_OBJECT (stream->pipeline, "linking..");<br>
<br>
            gst_element_link_many (next, stream->mpegtsmux1, NULL);<br>
            gst_element_sync_state_with_parent(next);<br>
            GST_DEBUG_OBJECT (stream->pipeline, "done");<br>
<br>
            auto elem = <br>
gst_bin_get_by_name(GST_BIN(stream->pipeline),"x265enc_elem");<br>
            if(elem)<br>
                std::cout <<" ***** Element name : " <<<br>
GST_OBJECT_NAME(elem) << " *****" << std::endl;<br>
            else<br>
            {<br>
                auto elem2 = <br>
gst_bin_get_by_name(GST_BIN(stream->pipeline),"x264enc_elem");<br>
                std::cout <<" ***** Element name : " <<<br>
GST_OBJECT_NAME(elem2) << " *****" << std::endl;<br>
            }<br>
<br>
          return GST_PAD_PROBE_DROP;<br>
        }<br>
<br>
<br>
        static GstPadProbeReturn<br>
        pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer<br>
user_data)<br>
        {<br>
          GstPad *srcpad, *sinkpad;<br>
          auto stream = reinterpret_cast<GstreamerStream*>(user_data);<br>
<br>
          GST_DEBUG_OBJECT (pad, "pad is blocked now");<br>
<br>
          /* remove the probe first */<br>
          gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));<br>
          auto filesrcPad =<br>
gst_element_get_static_pad(stream->filesrc,"src");<br>
<br>
          /* install new probe for EOS */<br>
          srcpad = gst_element_get_static_pad (stream->x264enc, "src");<br>
<br>
          gst_pad_add_probe (srcpad,<br>
static_cast<GstPadProbeType>(GST_PAD_PROBE_TYPE_BLOCK |<br>
              GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), event_probe_cb,<br>
user_data, NULL);<br>
          gst_object_unref (srcpad);<br>
<br>
          /* push EOS into the element, the probe will be fired when the<br>
           * EOS leaves the effect and it has thus drained all of its data<br>
*/<br>
          sinkpad = gst_element_get_static_pad (stream->x264enc, "sink");<br>
          gst_pad_send_event (sinkpad, gst_event_new_eos ());<br>
<br>
          gst_object_unref (sinkpad);<br>
<br>
          return GST_PAD_PROBE_OK;<br>
        }<br>
<br>
        static gboolean<br>
        timeout_cb (gpointer user_data)<br>
        {<br>
            auto stream = reinterpret_cast<GstreamerStream*>(user_data);<br>
            auto blockPad = stream->decodebinPad;<br>
<br>
            std::cout  << "Pad name : " << (GST_DEBUG_PAD_NAME(blockPad)) <<<br>
std::endl;<br>
<br>
          gst_pad_add_probe (blockPad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,<br>
              pad_probe_cb, user_data, NULL);<br>
<br>
<br>
          return TRUE;<br>
        }<br>
<br>
        int main()<br>
        {<br>
<br>
            gst_init(NULL,NULL);<br>
<br>
            static GstreamerStream stream;<br>
            stream.pipeline =<br>
gst_element_factory_make("pipeline","pipeline_elem");<br>
            stream.filesrc =<br>
gst_element_factory_make("filesrc","filesrc_elem");<br>
            stream.capsfilter =<br>
gst_element_factory_make("capsfilter","capsfilter_elem");<br>
            stream.decodebin =<br>
gst_element_factory_make("decodebin","decodebin_elem");<br>
<br>
            stream.x264enc =<br>
gst_element_factory_make("x264enc","x264enc_elem");<br>
            stream.x265enc =<br>
gst_element_factory_make("x265enc","x265enc_elem");<br>
            stream.mpegtsmux1 =<br>
gst_element_factory_make("mpegtsmux","mpegtsmux_element");<br>
            stream.udpsink1 =<br>
gst_element_factory_make("udpsink","udpsink_element");<br>
<br>
            if(!stream.pipeline, !stream.filesrc || !stream.capsfilter ||<br>
!stream.decodebin  || !stream.x264enc || !stream.mpegtsmux1 ||<br>
!stream.udpsink1)<br>
            {<br>
                g_error("Element create error");<br>
            }<br>
<br>
<br>
g_object_set(stream.filesrc,"location","/home/mbkrc/Desktop/ElephantsDream.mp4",NULL);<br>
<br>
<br>
            g_object_set(stream.mpegtsmux1,"alignment",7,NULL);<br>
<br>
g_object_set(stream.udpsink1,"host","127.0.0.1","port",9000,"sync", FALSE,<br>
"async", FALSE,NULL);<br>
            g_object_set (G_OBJECT (stream.x264enc), "bitrate", 1000, NULL);<br>
<br>
<br>
<br>
gst_bin_add_many(GST_BIN(stream.pipeline),stream.filesrc,stream.capsfilter,stream.decodebin,stream.x264enc,<br>
                             stream.mpegtsmux1,stream.udpsink1,NULL);<br>
<br>
<br>
           auto newCaps = gst_caps_new_simple("video/x-raw",<br>
                   "width", G_TYPE_INT, 1920,<br>
                   "height", G_TYPE_INT, 1080,<br>
                   "framerate", GST_TYPE_FRACTION, 60, 1, NULL);<br>
<br>
           g_object_set(stream.capsfilter,"caps",newCaps,NULL);<br>
<br>
<br>
gst_element_link_many(stream.filesrc,stream.capsfilter,stream.decodebin,NULL);<br>
<br>
<br>
if(!gst_element_link_many(stream.x264enc,stream.mpegtsmux1,stream.udpsink1,NULL))<br>
                std::cerr << "Link Failed" << std::endl;<br>
<br>
<br>
g_signal_connect(stream.decodebin,"pad-added",(GCallback)signal_cb,&stream);<br>
<br>
            stream.bus = gst_pipeline_get_bus (GST_PIPELINE<br>
(stream.pipeline));<br>
            auto bus_watch_id = gst_bus_add_watch (stream.bus,<br>
my_bus_callback, stream.loop);<br>
            gst_object_unref (stream.bus);<br>
<br>
<br>
            gst_element_set_state(stream.pipeline,GST_STATE_PLAYING);<br>
<br>
            std::thread th{[&]()<br>
                           {<br>
                            sleep(5);<br>
                            timeout_cb(&stream);<br>
                           }};<br>
<br>
            stream.loop = g_main_loop_new (NULL, FALSE);<br>
            g_main_loop_run (stream.loop);<br>
<br>
            /* clean up */<br>
            gst_element_set_state (stream.pipeline, GST_STATE_NULL);<br>
            gst_object_unref (stream.pipeline);<br>
            g_source_remove (bus_watch_id);<br>
            g_main_loop_unref (stream.loop);<br>
<br>
            return 0;<br>
        }<br>
<br>
        static gboolean<br>
        my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)<br>
        {<br>
          g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));<br>
          auto loop = reinterpret_cast<GMainLoop*>(data);<br>
<br>
          switch (GST_MESSAGE_TYPE (message)) {<br>
            case GST_MESSAGE_ERROR:{<br>
              GError *err;<br>
              gchar *debug;<br>
<br>
              gst_message_parse_error (message, &err, &debug);<br>
              g_print ("Error: %s\n", err->message);<br>
              g_error_free (err);<br>
              g_free (debug);<br>
<br>
              g_main_loop_quit (loop);<br>
              break;<br>
            }<br>
          case GST_MESSAGE_ASYNC_DONE:<br>
          {<br>
              std::cout << "Asyn Done : " << std::endl;<br>
              break;<br>
          }<br>
            case GST_MESSAGE_EOS:<br>
              /* end-of-stream */<br>
              g_main_loop_quit (loop);<br>
              break;<br>
            default:<br>
              /* unhandled message */<br>
              break;<br>
          }<br>
        }<br>
        `<br>
<br>
<br>
<br>
<br>
<br>
<br>
--<br>
Sent from: <a href="http://gstreamer-devel.966125.n4.nabble.com/" rel="noreferrer" target="_blank">http://gstreamer-devel.966125.n4.nabble.com/</a><br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</blockquote></div>