4 GstPad *srcpad, *sinkpad;
5 GstPad *srcconvpad, *sinkconvpad;
6 GstPad *srcpadtempl, *sinkpadtempl;
7 GstPad *srcconvtempl, *sinkconvtempl;
9 gint converter_in = -1, converter_out = -1;
10 gint target_rate = 2000;
12 static GstPadFactory src_factory = {
15 GST_PAD_FACTORY_ALWAYS,
19 "rate", GST_PROPS_INT_RANGE (16, 20000)
24 static GstPadFactory src_conv_factory = {
27 GST_PAD_FACTORY_ALWAYS,
31 "rate", GST_PROPS_INT_RANGE (16, 20000)
36 static GstPadFactory sink_conv_factory = {
39 GST_PAD_FACTORY_ALWAYS,
43 "rate", GST_PROPS_INT_RANGE (16, 20000)
48 static GstPadFactory sink_factory = {
51 GST_PAD_FACTORY_ALWAYS,
55 "rate", GST_PROPS_INT_RANGE (16, 20000)
60 static GstCapsFactory sink_caps = {
63 "rate", GST_PROPS_INT (6000),
67 static GstCapsFactory src_caps = {
70 "rate", GST_PROPS_INT (3000),
74 static GstPadTemplate *srctempl, *sinktempl;
75 static GstCaps *srccaps, *sinkcaps;
77 static GstPadNegotiateReturn
78 converter_negotiate_src (GstPad *pad, GstCaps **caps, gint counter)
84 return GST_PAD_NEGOTIATE_TRY;
87 converter_out = gst_caps_get_int (*caps, "rate");
88 return GST_PAD_NEGOTIATE_AGREE;
91 return GST_PAD_NEGOTIATE_FAIL;
94 static GstPadNegotiateReturn
95 converter_negotiate_sink (GstPad *pad, GstCaps **caps, gint counter)
99 *caps = GST_PAD_CAPS (srcconvpad);
100 return GST_PAD_NEGOTIATE_TRY;
103 converter_in = gst_caps_get_int (*caps, "rate");
106 converter_out = gst_caps_get_int (*caps, "rate");
107 return gst_pad_negotiate_proxy (srcconvpad, caps, counter);
109 return GST_PAD_NEGOTIATE_AGREE;
112 return GST_PAD_NEGOTIATE_FAIL;
115 static GstPadNegotiateReturn
116 target_negotiate_sink (GstPad *pad, GstCaps **caps, gint counter)
120 *caps = gst_caps_new_with_props (
124 "rate", GST_PROPS_INT (target_rate),
127 return GST_PAD_NEGOTIATE_TRY;
130 target_rate = gst_caps_get_int (*caps, "rate");
131 g_print ("target set %d\n", target_rate);
132 return GST_PAD_NEGOTIATE_AGREE;
135 return GST_PAD_NEGOTIATE_FAIL;
139 main (int argc, char *argv[])
141 gboolean overall = TRUE;
144 gst_init (&argc, &argv);
146 srctempl = gst_padtemplate_new (&src_factory);
147 sinktempl = gst_padtemplate_new (&sink_factory);
148 srcpad = gst_pad_new_from_template (srctempl, "src");
149 sinkpad = gst_pad_new_from_template (sinktempl, "sink");
151 srcconvtempl = gst_padtemplate_new (&src_conv_factory);
152 sinkconvtempl = gst_padtemplate_new (&sink_conv_factory);
153 srcconvpad = gst_pad_new_from_template (srcconvtempl, "csrc");
154 sinkconvpad = gst_pad_new_from_template (sinkconvtempl, "csink");
156 gst_pad_set_negotiate_function (srcconvpad, converter_negotiate_src);
157 gst_pad_set_negotiate_function (sinkconvpad, converter_negotiate_sink);
158 gst_pad_set_negotiate_function (sinkpad, target_negotiate_sink);
160 sinkcaps = gst_caps_register (&sink_caps);
161 srccaps = gst_caps_register (&src_caps);
163 g_print ("-------) (-----------) (----- \n");
164 g_print (" ! ! converter ! ! \n");
165 g_print (" src -- csink csrc -- sink \n");
166 g_print ("-------) (-----------) (----- \n\n");
167 g_print ("The convertor first tries to proxy the caps received\n");
168 g_print ("on its csink pad to its csrc pad, when that fails, it\n");
169 g_print ("sets up the conversion.\n\n");
172 g_print ("sink pad set caps (rate=%d), converter status: %d %d\n", target_rate,
173 converter_in, converter_out);
174 gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
175 result = gst_pad_set_caps (sinkpad, sinkcaps);
176 g_print ("result: %d, converter status: %d %d, target: %d\n\n", result,
177 converter_in, converter_out, target_rate);
179 result = gst_pad_connect (srcpad, sinkconvpad);
180 g_print ("pad connect 1: %d\n", result);
181 overall &= (result == TRUE);
182 result = gst_pad_connect (srcconvpad, sinkpad);
183 g_print ("pad connect 2: %d\n", result);
184 overall &= (result == TRUE);
186 g_print ("after connect, converter status: %d %d, target %d\n\n", converter_in, converter_out, target_rate);
188 g_print ("src pad set caps (rate=%d), converter status: %d %d, target %d \n", gst_caps_get_int (srccaps, "rate"),
189 converter_in, converter_out, target_rate);
190 result = gst_pad_set_caps (srcpad, srccaps);
191 g_print ("result %d, converter status: %d %d, target %d\n\n", result,
192 converter_in, converter_out, target_rate);
194 g_print ("sink pad set caps (rate=2000), converter status: %d %d, target %d \n",
195 converter_in, converter_out, target_rate);
197 gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
198 result = gst_pad_set_caps (sinkpad, sinkcaps);
199 g_print ("result %d, converter status: %d %d, target: %d\n\n", result,
200 converter_in, converter_out, target_rate);
202 gst_caps_set (srccaps, "rate", GST_PROPS_INT (4000));
203 result = gst_pad_renegotiate (srcpad);
204 g_print ("sink pad renegotiate caps %d, converter status: %d %d, target: %d\n", result,
205 converter_in, converter_out, target_rate);
207 gst_caps_set (srccaps, "rate", GST_PROPS_INT (40000));
208 result = gst_pad_set_caps (srcpad, srccaps);
209 g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
210 converter_in, converter_out, target_rate);
212 gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (40000));
213 result = gst_pad_set_caps (sinkpad, sinkcaps);
214 g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
215 converter_in, converter_out, target_rate);
218 gst_caps_set (sinkcaps, "rate", GST_PROPS_INT (target_rate));
219 result = gst_pad_set_caps (sinkpad, sinkcaps);
220 g_print ("sink pad set caps %d, converter status: %d %d, target: %d\n", result,
221 converter_in, converter_out, target_rate);