• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GstHarness - A test-harness for GStreamer testing
2  *
3  * Copyright (C) 2012-2015 Pexip <pexip.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #ifndef __GST_HARNESS_H__
22 #define __GST_HARNESS_H__
23 
24 #include <gst/gst.h>
25 #include <gst/check/gsttestclock.h>
26 #include <gst/check/check-prelude.h>
27 
28 G_BEGIN_DECLS
29 
30 /**
31  * GstHarnessThread:
32  *
33  * Opaque handle representing a GstHarness stress testing thread.
34  *
35  * Since: 1.6
36  */
37 typedef struct _GstHarnessThread GstHarnessThread;
38 
39 typedef struct _GstHarness GstHarness;
40 typedef struct _GstHarnessPrivate GstHarnessPrivate;
41 
42 /**
43  * GstHarness:
44  * @element: the element inside the harness
45  * @srcpad: the internal harness source pad
46  * @sinkpad: the internal harness sink pad
47  * @src_harness: the source (input) harness (if any)
48  * @sink_harness: the sink (output) harness (if any)
49  *
50  * Since: 1.6
51  */
52 struct _GstHarness {
53   GstElement * element;
54 
55   GstPad * srcpad;
56   GstPad * sinkpad;
57 
58   GstHarness * src_harness;
59   GstHarness * sink_harness;
60 
61   /*< private >*/
62   GstHarnessPrivate * priv;
63 };
64 
65 /* Harness creation */
66 
67 GST_CHECK_API
68 GstHarness * gst_harness_new_empty (void);
69 
70 GST_CHECK_API
71 void         gst_harness_add_element_full (GstHarness           * h,
72                                            GstElement           * element,
73                                            GstStaticPadTemplate * hsrc,
74                                            const gchar          * element_sinkpad_name,
75                                            GstStaticPadTemplate * hsink,
76                                            const gchar          * element_srcpad_name);
77 
78 GST_CHECK_API
79 GstHarness * gst_harness_new_full (GstElement * element,
80                                    GstStaticPadTemplate * hsrc,
81                                    const gchar          * element_sinkpad_name,
82                                    GstStaticPadTemplate * hsink,
83                                    const gchar          * element_srcpad_name);
84 
85 GST_CHECK_API
86 GstHarness * gst_harness_new_with_element  (GstElement  * element,
87                                             const gchar * element_sinkpad_name,
88                                             const gchar * element_srcpad_name);
89 
90 GST_CHECK_API
91 GstHarness * gst_harness_new_with_padnames (const gchar * element_name,
92                                             const gchar * element_sinkpad_name,
93                                             const gchar * element_srcpad_name);
94 
95 GST_CHECK_API
96 GstHarness * gst_harness_new_with_templates (const gchar * element_name,
97                                              GstStaticPadTemplate * hsrc,
98                                              GstStaticPadTemplate * hsink);
99 
100 GST_CHECK_API
101 GstHarness * gst_harness_new (const gchar * element_name);
102 
103 GST_CHECK_API
104 GstHarness * gst_harness_new_parse (const gchar * launchline);
105 
106 GST_CHECK_API
107 void         gst_harness_add_parse (GstHarness * h, const gchar * launchline);
108 
109 GST_CHECK_API
110 void         gst_harness_teardown (GstHarness * h);
111 
112 GST_CHECK_API
113 void         gst_harness_add_element_src_pad  (GstHarness * h, GstPad * srcpad);
114 
115 GST_CHECK_API
116 void         gst_harness_add_element_sink_pad (GstHarness * h, GstPad * sinkpad);
117 
118 /* Caps Functions */
119 
120 GST_CHECK_API
121 void         gst_harness_set_src_caps  (GstHarness * h, GstCaps * caps);
122 
123 GST_CHECK_API
124 void         gst_harness_set_sink_caps (GstHarness * h, GstCaps * caps);
125 
126 GST_CHECK_API
127 void         gst_harness_set_caps (GstHarness * h, GstCaps * in, GstCaps * out);
128 
129 GST_CHECK_API
130 void         gst_harness_set_src_caps_str  (GstHarness * h, const gchar * str);
131 
132 GST_CHECK_API
133 void         gst_harness_set_sink_caps_str (GstHarness * h, const gchar * str);
134 
135 GST_CHECK_API
136 void         gst_harness_set_caps_str (GstHarness  * h,
137                                        const gchar * in,
138                                        const gchar * out);
139 
140 /* Clock Functions */
141 
142 GST_CHECK_API
143 void           gst_harness_use_systemclock (GstHarness * h);
144 
145 GST_CHECK_API
146 void           gst_harness_use_testclock (GstHarness * h);
147 
148 GST_CHECK_API
149 GstTestClock * gst_harness_get_testclock (GstHarness * h);
150 
151 GST_CHECK_API
152 gboolean       gst_harness_set_time (GstHarness * h, GstClockTime time);
153 
154 GST_CHECK_API
155 gboolean       gst_harness_wait_for_clock_id_waits (GstHarness * h,
156                                                     guint waits,
157                                                     guint timeout);
158 
159 GST_CHECK_API
160 gboolean       gst_harness_crank_single_clock_wait (GstHarness * h);
161 
162 GST_CHECK_API
163 gboolean       gst_harness_crank_multiple_clock_waits (GstHarness * h,
164                                                        guint waits);
165 
166 /* misc */
167 
168 GST_CHECK_API
169 void           gst_harness_play (GstHarness * h);
170 
171 GST_CHECK_API
172 void           gst_harness_set_blocking_push_mode (GstHarness * h);
173 
174 GST_CHECK_API
175 void           gst_harness_set_forwarding (GstHarness * h, gboolean forwarding);
176 
177 /* buffers */
178 
179 GST_CHECK_API
180 GstBuffer *    gst_harness_create_buffer (GstHarness * h, gsize size);
181 
182 GST_CHECK_API
183 GstFlowReturn  gst_harness_push (GstHarness * h, GstBuffer * buffer);
184 
185 GST_CHECK_API
186 GstBuffer *    gst_harness_pull (GstHarness * h);
187 
188 GST_CHECK_API
189 GstBuffer *    gst_harness_try_pull (GstHarness * h);
190 
191 GST_CHECK_API
192 gboolean       gst_harness_pull_until_eos (GstHarness * h, GstBuffer ** buf);
193 
194 GST_CHECK_API
195 GstBuffer *    gst_harness_push_and_pull (GstHarness * h, GstBuffer * buffer);
196 
197 GST_CHECK_API
198 guint          gst_harness_buffers_received (GstHarness * h);
199 
200 GST_CHECK_API
201 guint          gst_harness_buffers_in_queue (GstHarness * h);
202 
203 GST_CHECK_API
204 void           gst_harness_set_drop_buffers (GstHarness * h, gboolean drop_buffers);
205 
206 GST_CHECK_API
207 void           gst_harness_dump_to_file (GstHarness * h, const gchar * filename);
208 
209 GST_CHECK_API
210 guint8 *       gst_harness_take_all_data (GstHarness * h, gsize * size);
211 
212 GST_CHECK_API
213 GstBuffer *    gst_harness_take_all_data_as_buffer (GstHarness * h);
214 
215 GST_CHECK_API
216 GBytes *       gst_harness_take_all_data_as_bytes (GstHarness * h);
217 
218 GST_CHECK_API
219 GstClockTime   gst_harness_get_last_pushed_timestamp (GstHarness * h);
220 
221 /* downstream events */
222 
223 GST_CHECK_API
224 gboolean       gst_harness_push_event (GstHarness * h, GstEvent * event);
225 
226 GST_CHECK_API
227 GstEvent *     gst_harness_pull_event (GstHarness * h);
228 
229 GST_CHECK_API
230 GstEvent *     gst_harness_try_pull_event  (GstHarness * h);
231 
232 GST_CHECK_API
233 guint          gst_harness_events_received (GstHarness * h);
234 
235 GST_CHECK_API
236 guint          gst_harness_events_in_queue (GstHarness * h);
237 
238 /* upstream events */
239 
240 GST_CHECK_API
241 gboolean   gst_harness_push_upstream_event (GstHarness * h, GstEvent * event);
242 
243 GST_CHECK_API
244 GstEvent * gst_harness_pull_upstream_event (GstHarness * h);
245 
246 GST_CHECK_API
247 GstEvent * gst_harness_try_pull_upstream_event  (GstHarness * h);
248 
249 GST_CHECK_API
250 guint      gst_harness_upstream_events_received (GstHarness * h);
251 
252 GST_CHECK_API
253 guint      gst_harness_upstream_events_in_queue (GstHarness * h);
254 
255 /* latency */
256 
257 GST_CHECK_API
258 GstClockTime gst_harness_query_latency (GstHarness * h);
259 
260 GST_CHECK_API
261 void         gst_harness_set_upstream_latency (GstHarness * h, GstClockTime latency);
262 
263 GST_CHECK_API
264 void         gst_harness_set_live (GstHarness * h, gboolean is_live);
265 
266 /* allocation query parameters */
267 
268 GST_CHECK_API
269 void         gst_harness_set_propose_allocator (GstHarness                * h,
270                                                 GstAllocator              * allocator,
271                                                 const GstAllocationParams * params);
272 
273 GST_CHECK_API
274 void         gst_harness_get_allocator         (GstHarness          * h,
275                                                 GstAllocator       ** allocator,
276                                                 GstAllocationParams * params);
277 
278 GST_CHECK_API
279 void         gst_harness_add_propose_allocation_meta (GstHarness                * h,
280                                                       GType                       api,
281                                                       const GstStructure        * params);
282 
283 /* src-harness */
284 
285 GST_CHECK_API
286 void          gst_harness_add_src_harness (GstHarness * h,
287                                            GstHarness * src_harness,
288                                            gboolean has_clock_wait);
289 
290 GST_CHECK_API
291 void          gst_harness_add_src (GstHarness  * h,
292                                    const gchar * src_element_name,
293                                    gboolean      has_clock_wait);
294 
295 GST_CHECK_API
296 void          gst_harness_add_src_parse (GstHarness  * h,
297                                          const gchar * launchline,
298                                          gboolean      has_clock_wait);
299 
300 GST_CHECK_API
301 GstFlowReturn gst_harness_push_from_src (GstHarness * h);
302 
303 GST_CHECK_API
304 GstFlowReturn gst_harness_src_crank_and_push_many (GstHarness * h,
305                                                    gint         cranks,
306                                                    gint         pushes);
307 
308 GST_CHECK_API
309 gboolean      gst_harness_src_push_event (GstHarness * h);
310 
311 /* sink-harness */
312 
313 GST_CHECK_API
314 void          gst_harness_add_sink_harness (GstHarness * h,
315                                             GstHarness * sink_harness);
316 
317 GST_CHECK_API
318 void          gst_harness_add_sink (GstHarness  * h,
319                                     const gchar * sink_element_name);
320 
321 GST_CHECK_API
322 void          gst_harness_add_sink_parse (GstHarness  * h,
323                                           const gchar * launchline);
324 
325 GST_CHECK_API
326 GstFlowReturn gst_harness_push_to_sink   (GstHarness * h);
327 
328 GST_CHECK_API
329 GstFlowReturn gst_harness_sink_push_many (GstHarness * h, gint pushes);
330 
331 /* convenience functions */
332 
333 GST_CHECK_API
334 GstElement *  gst_harness_find_element (GstHarness * h,
335                                        const gchar * element_name);
336 
337 GST_CHECK_API
338 void          gst_harness_set (GstHarness  * h,
339                                const gchar * element_name,
340                                const gchar * first_property_name, ...) G_GNUC_NULL_TERMINATED;
341 
342 GST_CHECK_API
343 void          gst_harness_get (GstHarness  * h,
344                                const gchar * element_name,
345                                const gchar * first_property_name, ...) G_GNUC_NULL_TERMINATED;
346 
347 GST_CHECK_API
348 void          gst_harness_add_probe (GstHarness        * h,
349                                      const gchar       * element_name,
350                                      const gchar       * pad_name,
351                                      GstPadProbeType     mask,
352                                      GstPadProbeCallback callback,
353                                      gpointer            user_data,
354                                      GDestroyNotify      destroy_data);
355 
356 /* Stress */
357 
358 GST_CHECK_API
359 guint              gst_harness_stress_thread_stop  (GstHarnessThread * t);
360 
361 GST_CHECK_API
362 GstHarnessThread * gst_harness_stress_custom_start (GstHarness * h,
363                                                     GFunc        init,
364                                                     GFunc        callback,
365                                                     gpointer     data,
366                                                     gulong       sleep);
367 
368 #define gst_harness_stress_statechange_start(h)                                \
369   gst_harness_stress_statechange_start_full (h, G_USEC_PER_SEC / 100)
370 
371 GST_CHECK_API
372 GstHarnessThread * gst_harness_stress_statechange_start_full (GstHarness * h,
373                                                               gulong       sleep);
374 
375 #define gst_harness_stress_push_buffer_start(h, c, s, b)                       \
376   gst_harness_stress_push_buffer_start_full (h, c, s, b, 0)
377 
378 GST_CHECK_API
379 GstHarnessThread * gst_harness_stress_push_buffer_start_full (GstHarness * h,
380                                                               GstCaps    * caps,
381                                                               const GstSegment * segment,
382                                                               GstBuffer  * buf,
383                                                               gulong       sleep);
384 
385 /**
386  * GstHarnessPrepareBufferFunc:
387  * @h: a #GstHarness
388  * @data: user data
389  *
390  * Since: 1.6
391  */
392 typedef GstBuffer * (*GstHarnessPrepareBufferFunc) (GstHarness * h, gpointer data);
393 
394 #define gst_harness_stress_push_buffer_with_cb_start(h, c, s, f, d, n)         \
395   gst_harness_stress_push_buffer_with_cb_start_full (h, c, s, f, d, n, 0)
396 
397 GST_CHECK_API
398 GstHarnessThread * gst_harness_stress_push_buffer_with_cb_start_full (GstHarness   * h,
399                                                                       GstCaps      * caps,
400                                                                       const GstSegment * segment,
401                                                                       GstHarnessPrepareBufferFunc func,
402                                                                       gpointer       data,
403                                                                       GDestroyNotify notify,
404                                                                       gulong         sleep);
405 
406 #define gst_harness_stress_push_event_start(h, e)                              \
407   gst_harness_stress_push_event_start_full (h, e, 0)
408 
409 GST_CHECK_API
410 GstHarnessThread * gst_harness_stress_push_event_start_full (GstHarness * h,
411                                                              GstEvent   * event,
412                                                              gulong       sleep);
413 
414 /**
415  * GstHarnessPrepareEventFunc:
416  * @h: a #GstHarness
417  * @data: user data
418  *
419  * Since: 1.8
420  */
421 typedef GstEvent * (*GstHarnessPrepareEventFunc) (GstHarness * h, gpointer data);
422 
423 #define gst_harness_stress_push_event_with_cb_start(h, f, d, n)                \
424   gst_harness_stress_push_event_with_cb_start_full (h, f, d, n, 0)
425 
426 GST_CHECK_API
427 GstHarnessThread * gst_harness_stress_push_event_with_cb_start_full (GstHarness   * h,
428                                                                      GstHarnessPrepareEventFunc func,
429                                                                      gpointer       data,
430                                                                      GDestroyNotify notify,
431                                                                      gulong         sleep);
432 
433 #define gst_harness_stress_send_upstream_event_start(h, e)                     \
434   gst_harness_stress_push_upstream_event_start_full (h, e, 0)
435 
436 GST_CHECK_API
437 GstHarnessThread * gst_harness_stress_push_upstream_event_start_full (GstHarness * h,
438                                                                       GstEvent   * event,
439                                                                       gulong       sleep);
440 
441 #define gst_harness_stress_send_upstream_event_with_cb_start(h, f, d, n)       \
442   gst_harness_stress_push_upstream_event_with_cb_start_full (h, f, d, n, 0)
443 
444 GST_CHECK_API
445 GstHarnessThread * gst_harness_stress_push_upstream_event_with_cb_start_full (GstHarness   * h,
446                                                                               GstHarnessPrepareEventFunc func,
447                                                                               gpointer       data,
448                                                                               GDestroyNotify notify,
449                                                                               gulong         sleep);
450 
451 
452 #define gst_harness_stress_property_start(h, n, v)                             \
453   gst_harness_stress_property_start_full (h, n, v, G_USEC_PER_SEC / 1000)
454 
455 GST_CHECK_API
456 GstHarnessThread * gst_harness_stress_property_start_full (GstHarness   * h,
457                                                            const gchar  * name,
458                                                            const GValue * value,
459                                                            gulong         sleep);
460 
461 #define gst_harness_stress_requestpad_start(h, t, n, c, r)                     \
462   gst_harness_stress_requestpad_start_full (h, t, n, c, r, G_USEC_PER_SEC / 100)
463 
464 GST_CHECK_API
465 GstHarnessThread * gst_harness_stress_requestpad_start_full (GstHarness     * h,
466                                                              GstPadTemplate * templ,
467                                                              const gchar    * name,
468                                                              GstCaps        * caps,
469                                                              gboolean         release,
470                                                              gulong           sleep);
471 
472 G_END_DECLS
473 
474 #endif /* __GST_HARNESS_H__ */
475