<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><DIV>About the Gobject system,</DIV>
<DIV>Why Gobject &nbsp;not C++ ? </DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; It designed for cross language programming.</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Please read "Inside the C++ Object Mode", It will help you understand all of the OO programming &nbsp;language.</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For other things, You just need a KDE and trying to debug Gstreamer sample step by step, and look at the call stack.</DIV>
<DIV><BR>At&nbsp;2012-05-02&nbsp;04:55:59,"Dave&nbsp;Mateer"&nbsp;&lt;dave_mateer@ntm.org&gt;&nbsp;wrote:<BR>&gt;I'm&nbsp;brand&nbsp;new&nbsp;to&nbsp;gstreamer,&nbsp;but&nbsp;am&nbsp;pretty&nbsp;sure&nbsp;it&nbsp;is&nbsp;going&nbsp;to&nbsp;be&nbsp;the&nbsp;right&nbsp;library&nbsp;for&nbsp;an&nbsp;application&nbsp;we&nbsp;are&nbsp;working&nbsp;on.&nbsp;I&nbsp;am&nbsp;very&nbsp;impressed&nbsp;with&nbsp;the&nbsp;feature&nbsp;set&nbsp;that&nbsp;the&nbsp;library&nbsp;implements.&nbsp;I&nbsp;have&nbsp;a&nbsp;proof-of-concept&nbsp;application&nbsp;that&nbsp;reads&nbsp;a&nbsp;video&nbsp;file&nbsp;and&nbsp;then&nbsp;plays&nbsp;the&nbsp;audio&nbsp;on&nbsp;the&nbsp;computer&nbsp;and&nbsp;displays&nbsp;the&nbsp;video&nbsp;in&nbsp;a&nbsp;Qt&nbsp;widget.&nbsp;I&nbsp;was&nbsp;wondering&nbsp;if&nbsp;some&nbsp;of&nbsp;the&nbsp;more&nbsp;experienced&nbsp;devs&nbsp;would&nbsp;mind&nbsp;offering&nbsp;a&nbsp;critique--I'm&nbsp;sure&nbsp;I'm&nbsp;doing&nbsp;a&nbsp;bunch&nbsp;of&nbsp;things&nbsp;The&nbsp;Wrong&nbsp;Way,&nbsp;but&nbsp;there&nbsp;are&nbsp;a&nbsp;lot&nbsp;of&nbsp;new&nbsp;things&nbsp;for&nbsp;me&nbsp;here:&nbsp;the&nbsp;gstreamer&nbsp;API&nbsp;itself,&nbsp;C&nbsp;(I'm&nbsp;more&nbsp;of&nbsp;a&nbsp;C++&nbsp;guy),&nbsp;the&nbsp;GObject&nbsp;system,&nbsp;etc.<BR>&gt;<BR>&gt;Among&nbsp;other&nbsp;things,&nbsp;the&nbsp;fact&nbsp;that&nbsp;I'm&nbsp;testing&nbsp;for&nbsp;audio&nbsp;vs.&nbsp;video&nbsp;pad&nbsp;by&nbsp;comparing&nbsp;a&nbsp;string&nbsp;prefix&nbsp;seems&nbsp;fragile&nbsp;and&nbsp;smelly.&nbsp;That&nbsp;can't&nbsp;be&nbsp;right.&nbsp;Also,&nbsp;it&nbsp;seems&nbsp;like&nbsp;I'm&nbsp;leaking&nbsp;memory&nbsp;in&nbsp;the&nbsp;call&nbsp;to&nbsp;gst_bin_get_by_name&nbsp;because&nbsp;the&nbsp;docs&nbsp;say&nbsp;that&nbsp;transfers&nbsp;ownership&nbsp;(not&nbsp;just&nbsp;a&nbsp;reference&nbsp;count?).&nbsp;Not&nbsp;sure&nbsp;about&nbsp;that&nbsp;one.&nbsp;I'm&nbsp;sure&nbsp;there&nbsp;are&nbsp;many&nbsp;other&nbsp;things&nbsp;as&nbsp;well.<BR>&gt;<BR>&gt;I&nbsp;appreciate&nbsp;any&nbsp;help&nbsp;anyone&nbsp;could&nbsp;offer.&nbsp;It's&nbsp;my&nbsp;first&nbsp;attempt,&nbsp;so&nbsp;I&nbsp;know&nbsp;it's&nbsp;bad,&nbsp;so&nbsp;be&nbsp;honest!&nbsp;I&nbsp;stripped&nbsp;out&nbsp;some&nbsp;of&nbsp;the&nbsp;more&nbsp;Qt-specific&nbsp;stuff.<BR>&gt;<BR>&gt;static&nbsp;void&nbsp;on_pad_added(GstElement&nbsp;*element,<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GstPad&nbsp;*new_pad,<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gpointer&nbsp;user_data)&nbsp;{<BR>&gt;&nbsp;&nbsp;GstCaps&nbsp;*caps&nbsp;=&nbsp;gst_pad_get_caps_reffed(new_pad);<BR>&gt;&nbsp;&nbsp;gchar&nbsp;*name&nbsp;=&nbsp;gst_caps_to_string(caps);<BR>&gt;&nbsp;&nbsp;GstBin&nbsp;*pipeline&nbsp;=&nbsp;(GstBin*)user_data;<BR>&gt;<BR>&gt;&nbsp;&nbsp;if&nbsp;(g_str_has_prefix(name,&nbsp;"audio"))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;g_print("audio\n");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Leaking&nbsp;memory??&nbsp;gst_bin_get_by_name&nbsp;transfers&nbsp;ownership?<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;GstElement&nbsp;*audio_sink&nbsp;=&nbsp;gst_bin_get_by_name(pipeline,&nbsp;"audio-sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!audio_sink)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;extract&nbsp;audio&nbsp;sink&nbsp;from&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;GstPad&nbsp;*sink_pad&nbsp;=&nbsp;gst_element_get_static_pad(audio_sink,&nbsp;"sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!sink_pad)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;get&nbsp;sink&nbsp;pad&nbsp;from&nbsp;audio&nbsp;element.");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GST_PAD_LINK_FAILED(gst_pad_link(new_pad,&nbsp;sink_pad)))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Failed&nbsp;to&nbsp;link&nbsp;audio&nbsp;src&nbsp;and&nbsp;sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;gst_object_unref(sink_pad);<BR>&gt;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;g_print("video\n");<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Leaking&nbsp;memory??&nbsp;gst_bin_get_by_name&nbsp;transfers&nbsp;ownership?<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;GstElement&nbsp;*video_sink&nbsp;=&nbsp;gst_bin_get_by_name(pipeline,&nbsp;"video-sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!video_sink)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;extract&nbsp;video&nbsp;sink&nbsp;from&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;GstPad&nbsp;*sink_pad&nbsp;=&nbsp;gst_element_get_static_pad(video_sink,&nbsp;"sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!sink_pad)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;get&nbsp;sink&nbsp;pad&nbsp;from&nbsp;video&nbsp;element.");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GST_PAD_LINK_FAILED(gst_pad_link(new_pad,&nbsp;sink_pad)))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Failed&nbsp;to&nbsp;link&nbsp;video&nbsp;src&nbsp;and&nbsp;sink");<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;gst_object_unref(sink_pad);<BR>&gt;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;g_free(name);<BR>&gt;&nbsp;&nbsp;gst_caps_unref(caps);<BR>&gt;}<BR>&gt;<BR>&gt;MainWindow::MainWindow(QWidget&nbsp;*parent)<BR>&gt;&nbsp;&nbsp;:&nbsp;QMainWindow(parent),<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;ui(new&nbsp;Ui::MainWindow)&nbsp;{<BR>&gt;&nbsp;&nbsp;ui-&gt;setupUi(this);<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;top-level&nbsp;pipeline.<BR>&gt;&nbsp;&nbsp;pipeline_&nbsp;=&nbsp;gst_pipeline_new(NULL);<BR>&gt;&nbsp;&nbsp;if&nbsp;(!pipeline_)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;create&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;decode&nbsp;bin&nbsp;for&nbsp;our&nbsp;video&nbsp;source.<BR>&gt;&nbsp;&nbsp;GstElement&nbsp;*src&nbsp;=&nbsp;gst_element_factory_make("uridecodebin",&nbsp;NULL);<BR>&gt;&nbsp;&nbsp;if&nbsp;(!src)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;create&nbsp;uridecodebin");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;&nbsp;&nbsp;g_object_set(src,&nbsp;"uri",&nbsp;"file:///path/to/media.ogg",&nbsp;NULL);<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Add&nbsp;the&nbsp;decode&nbsp;bin&nbsp;to&nbsp;the&nbsp;pipeline.<BR>&gt;&nbsp;&nbsp;if&nbsp;(!gst_bin_add(GST_BIN(pipeline_),&nbsp;src))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;add&nbsp;uridecodebin&nbsp;to&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;video&nbsp;sink.&nbsp;This&nbsp;will&nbsp;be&nbsp;linked&nbsp;in&nbsp;the&nbsp;pad-added&nbsp;signal&nbsp;handler.<BR>&gt;&nbsp;&nbsp;GstElement&nbsp;*video_sink&nbsp;=&nbsp;gst_element_factory_make("xvimagesink",<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"video-sink");<BR>&gt;&nbsp;&nbsp;if&nbsp;(!video_sink)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;create&nbsp;xvimagesink");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;&nbsp;&nbsp;if&nbsp;(!gst_bin_add(GST_BIN(pipeline_),&nbsp;video_sink))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;add&nbsp;video&nbsp;sink&nbsp;to&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;&nbsp;&nbsp;WId&nbsp;id&nbsp;=&nbsp;ui-&gt;video_widget-&gt;winId();<BR>&gt;&nbsp;&nbsp;gst_x_overlay_set_window_handle(GST_X_OVERLAY(video_sink),&nbsp;id);<BR>&gt;&nbsp;&nbsp;qApp-&gt;syncX();<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Create&nbsp;the&nbsp;audio&nbsp;sink.&nbsp;This&nbsp;will&nbsp;be&nbsp;linked&nbsp;in&nbsp;the&nbsp;pad-added&nbsp;signal&nbsp;handler.<BR>&gt;&nbsp;&nbsp;GstElement&nbsp;*audio_sink&nbsp;=&nbsp;gst_element_factory_make("autoaudiosink",<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"audio-sink");<BR>&gt;&nbsp;&nbsp;if&nbsp;(!audio_sink)&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;create&nbsp;autoaudiosink");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;&nbsp;&nbsp;if&nbsp;(!gst_bin_add(GST_BIN(pipeline_),&nbsp;audio_sink))&nbsp;{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;std::runtime_error("Could&nbsp;not&nbsp;add&nbsp;audio&nbsp;sink&nbsp;to&nbsp;pipeline");<BR>&gt;&nbsp;&nbsp;}<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Register&nbsp;our&nbsp;interest&nbsp;in&nbsp;the&nbsp;pad-added&nbsp;signal&nbsp;so&nbsp;we&nbsp;can&nbsp;connect&nbsp;our&nbsp;sinks.<BR>&gt;&nbsp;&nbsp;g_signal_connect(src,&nbsp;"pad-added",&nbsp;G_CALLBACK(on_pad_added),&nbsp;pipeline_);<BR>&gt;<BR>&gt;&nbsp;&nbsp;//&nbsp;Start&nbsp;the&nbsp;playback.<BR>&gt;&nbsp;&nbsp;gst_element_set_state(pipeline_,&nbsp;GST_STATE_PLAYING);<BR>&gt;}<BR>&gt;<BR>&gt;MainWindow::~MainWindow()&nbsp;{<BR>&gt;&nbsp;&nbsp;gst_element_set_state&nbsp;(pipeline_,&nbsp;GST_STATE_NULL);<BR>&gt;&nbsp;&nbsp;gst_object_unref(pipeline_);<BR>&gt;&nbsp;&nbsp;delete&nbsp;ui;<BR>&gt;}<BR>&gt;<BR>&gt;<BR>&gt;_______________________________________________<BR>&gt;gstreamer-devel&nbsp;mailing&nbsp;list<BR>&gt;gstreamer-devel@lists.freedesktop.org<BR>&gt;http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel<BR></DIV></div><br><br><span title="neteasefooter"><span id="netease_mail_footer"></span></span>