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