How to investigate gst_element_link_many() funcion's error?
Fred
loca2tango at gmail.com
Mon Jun 12 04:44:15 UTC 2017
I don't know how to fix link confirmation error. Thank you for any
reply in advance.
1. Following commands is working well.
$gst-launch-1.0 -v rtspsrc location=rtsp://
admin:1q2w3e4r at 192.168.0.18/TANK/media.smp ! rtpmp4vdepay ! decodebin !
autovideosink
2. I modified the sample code as followings but It doesn't work. The error
was is 118,119 line number.
** (ex1:30254): WARNING **: Linking part (B) Fail...
1 //Display RTSP streaming of video
2 //(c) 2011 enthusiasticgeek
3 // This code is distributed in the hope that it will be useful,
4 // but WITHOUT ANY WARRANTY; without even the implied warranty of
5 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
7 #include <string.h>
8 #include <math.h>
9 #include <gst/gst.h>
10 #include <glib.h>
11
12 static gboolean bus_call (GstBus *bus,GstMessage *msg, gpointer data){
13 GMainLoop *loop = (GMainLoop *) data;
14
15 switch (GST_MESSAGE_TYPE (msg)) {
16
17 case GST_MESSAGE_EOS:
18 g_printerr ("Stream Ends\n");
19 g_main_loop_quit (loop);
20 break;
21
22 case GST_MESSAGE_ERROR: {
23 gchar *debug;
24 GError *error;
25
26 gst_message_parse_error (msg, &error, &debug);
27 g_free (debug);
28
29 g_printerr ("Error: %s\n", error->message);
30 g_error_free (error);
31
32 g_main_loop_quit (loop);
33 break;
34 }
35 default:
36 break;
37 }
38
39 return TRUE;
40 }
41
42 static void on_pad_added (GstElement *element, GstPad *pad, gpointer
data){
43
44 GstPad *sinkpad;
45 GstElement *decoder = (GstElement *) data;
46
47 /* We can now link this pad with the rtsp-decoder sink pad */
48 g_print ("Dynamic pad created, linking source/demuxer\n");
49
50 sinkpad = gst_element_get_static_pad (decoder, "sink");
51
52 gst_pad_link (pad, sinkpad);
53
54 gst_object_unref (sinkpad);
55 }
56
57 int main (int argc, char *argv[])
58 {
59 GMainLoop *loop;
60 GstBus *bus;
61 GstElement *source;
62 GstElement *decoder;
63 GstElement *sink;
64 GstElement *pipeline;
65 GstElement *demux;
66 GstElement *colorspace;
67
68 /* Initializing GStreamer */
69 gst_init (&argc, &argv);
70 loop = g_main_loop_new (NULL, FALSE);
71
72 //gst-launch-0.10 rtspsrc location=rtsp://<ip> ! decodebin !
ffmpegcolorspace ! autovideosink
73 //gst-launch -v rtspsrc location="rtsp://<ip> ! rtpmp4vdepay !
mpeg4videoparse ! ffdec_mpeg4 ! ffmpe gcolorspace! autovideosink
74 //gst-launch -v rtspsrc location="rtsp://<ip> ! rtpmp4vdepay !
ffdec_mpeg4 ! ffmpegcolorspace! autov ideosink
75
76 /* Create Pipe's Elements */
77 pipeline = gst_pipeline_new ("video player");
78 g_assert (pipeline);
79 source = gst_element_factory_make ("rtspsrc", "Source");
80 g_assert (source);
81
82 demux = gst_element_factory_make ("rtpmp4vdepay", "Depay");
83 g_assert (demux);
84 decoder = gst_element_factory_make ("decodebin", "Decoder");
85 g_assert (decoder);
86
87 sink = gst_element_factory_make ("autovideosink", "Output");
88 g_assert (sink);
89
90 /*Make sure: Every elements was created ok*/
91 if (!pipeline || !source || !demux || !decoder || !sink) {
92 g_printerr ("One of the elements wasn't create... Exiting\n");
93 return -1;
94 }
95
96 if (!pipeline || !source ) {
97 g_printerr ("One of the elements wasn't create... Exiting\n");
98 return -1;
99 }
100
101 g_printerr(" \nPipeline is Part(A) ->(dynamic/runtime link) Part(B)[
Part(B-1) -> Part(B-2) -> Par t(B-3) ]\n\n");
102 g_printerr("
[source](dynamic)->(dynamic)[demux]->[decoder]->[colorspace]->[videosink]
\n\n");
103
104 /* Set video Source */
105 g_printerr(" argv[1]=%s \n", argv[1]);
106 g_object_set (G_OBJECT (source), "location", argv[1], NULL);
107
108
109 /* Putting a Message handler */
110 bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
111 gst_bus_add_watch (bus, bus_call, loop);
112 gst_object_unref (bus);
113
114 /* Add Elements to the Bin */
115 gst_bin_add_many (GST_BIN (pipeline), demux, decoder, sink, NULL);
116
117 /* Link confirmation */
118 if (gst_element_link_many ( demux, decoder, sink, NULL)!=TRUE){
119 g_warning ("Linking part (B) Fail...");
120 }
121
122
123
124 g_printerr("\nNote that the source will be linked to the
demuxer(depayload) dynamically.\n\
125 The reason is that rtspsrc may contain various elements (for
example\n\
126 audio and video). The source pad(s) will be created at run time,\n\
127 by the rtspsrc when it detects the amount and nature of
elements.\n\
128 Therefore we connect a callback function which will be executed\n\
129 when the \"pad-added\" is emitted.\n");
130
131 /* Dynamic Pad Creation */
132 if(! g_signal_connect (source, "pad-added", G_CALLBACK
(on_pad_added),demux))
133 {
134 g_warning ("Linking part (A) with part (B) Fail...
g_sinal_connect");
135
136 }
137 /* Run the pipeline */
138 g_print ("Playing: %s\n", argv[1]);
139 gst_element_set_state (pipeline, GST_STATE_PLAYING);
140 g_main_loop_run (loop);
141
142 /* Ending Playback */
143 g_print ("End of the Streaming... ending the playback\n");
144 gst_element_set_state (pipeline, GST_STATE_NULL);
145
146 /* Eliminating Pipeline */
147 g_print ("Eliminating Pipeline\n");
148 gst_object_unref (GST_OBJECT (pipeline));
149
150 return 0;
151 }
-Its over-
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170612/feec6406/attachment-0001.html>
More information about the gstreamer-devel
mailing list