gstharness.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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. #ifndef __GST_HARNESS_H__
  21. #define __GST_HARNESS_H__
  22. #include <gst/gst.h>
  23. #include <gst/check/gsttestclock.h>
  24. G_BEGIN_DECLS
  25. /**
  26. * GstHarnessThread:
  27. *
  28. * Opaque handle representing a GstHarness stress testing thread.
  29. *
  30. * Since: 1.6
  31. */
  32. typedef struct _GstHarnessThread GstHarnessThread;
  33. typedef struct _GstHarness GstHarness;
  34. typedef struct _GstHarnessPrivate GstHarnessPrivate;
  35. /**
  36. * GstHarness:
  37. * @element: the element inside the harness
  38. * @srcpad: the internal harness source pad
  39. * @sinkpad: the internal harness sink pad
  40. * @src_harness: the source (input) harness (if any)
  41. * @sink_harness: the sink (output) harness (if any)
  42. *
  43. * Since: 1.6
  44. */
  45. struct _GstHarness {
  46. GstElement * element;
  47. GstPad * srcpad;
  48. GstPad * sinkpad;
  49. GstHarness * src_harness;
  50. GstHarness * sink_harness;
  51. /*< private >*/
  52. GstHarnessPrivate * priv;
  53. };
  54. /* Harness creation */
  55. GstHarness * gst_harness_new_empty (void);
  56. void gst_harness_add_element_full (GstHarness * h,
  57. GstElement * element,
  58. GstStaticPadTemplate * hsrc,
  59. const gchar * element_sinkpad_name,
  60. GstStaticPadTemplate * hsink,
  61. const gchar * element_srcpad_name);
  62. GstHarness * gst_harness_new_full (GstElement * element,
  63. GstStaticPadTemplate * hsrc,
  64. const gchar * element_sinkpad_name,
  65. GstStaticPadTemplate * hsink,
  66. const gchar * element_srcpad_name);
  67. GstHarness * gst_harness_new_with_element (GstElement * element,
  68. const gchar * element_sinkpad_name,
  69. const gchar * element_srcpad_name);
  70. GstHarness * gst_harness_new_with_padnames (const gchar * element_name,
  71. const gchar * element_sinkpad_name,
  72. const gchar * element_srcpad_name);
  73. GstHarness * gst_harness_new_with_templates (const gchar * element_name,
  74. GstStaticPadTemplate * hsrc,
  75. GstStaticPadTemplate * hsink);
  76. GstHarness * gst_harness_new (const gchar * element_name);
  77. GstHarness * gst_harness_new_parse (const gchar * launchline);
  78. void gst_harness_add_parse (GstHarness * h, const gchar * launchline);
  79. void gst_harness_teardown (GstHarness * h);
  80. void gst_harness_add_element_src_pad (GstHarness * h, GstPad * srcpad);
  81. void gst_harness_add_element_sink_pad (GstHarness * h, GstPad * sinkpad);
  82. /* Caps Functions */
  83. void gst_harness_set_src_caps (GstHarness * h, GstCaps * caps);
  84. void gst_harness_set_sink_caps (GstHarness * h, GstCaps * caps);
  85. void gst_harness_set_caps (GstHarness * h, GstCaps * in, GstCaps * out);
  86. void gst_harness_set_src_caps_str (GstHarness * h, const gchar * str);
  87. void gst_harness_set_sink_caps_str (GstHarness * h, const gchar * str);
  88. void gst_harness_set_caps_str (GstHarness * h,
  89. const gchar * in,
  90. const gchar * out);
  91. /* Clock Functions */
  92. void gst_harness_use_systemclock (GstHarness * h);
  93. void gst_harness_use_testclock (GstHarness * h);
  94. GstTestClock * gst_harness_get_testclock (GstHarness * h);
  95. gboolean gst_harness_set_time (GstHarness * h, GstClockTime time);
  96. gboolean gst_harness_wait_for_clock_id_waits (GstHarness * h,
  97. guint waits,
  98. guint timeout);
  99. gboolean gst_harness_crank_single_clock_wait (GstHarness * h);
  100. gboolean gst_harness_crank_multiple_clock_waits (GstHarness * h,
  101. guint waits);
  102. /* misc */
  103. void gst_harness_play (GstHarness * h);
  104. void gst_harness_set_blocking_push_mode (GstHarness * h);
  105. void gst_harness_set_forwarding (GstHarness * h, gboolean forwarding);
  106. /* buffers */
  107. GstBuffer * gst_harness_create_buffer (GstHarness * h, gsize size);
  108. GstFlowReturn gst_harness_push (GstHarness * h, GstBuffer * buffer);
  109. GstBuffer * gst_harness_pull (GstHarness * h);
  110. GstBuffer * gst_harness_try_pull (GstHarness * h);
  111. GstBuffer * gst_harness_push_and_pull (GstHarness * h, GstBuffer * buffer);
  112. guint gst_harness_buffers_received (GstHarness * h);
  113. guint gst_harness_buffers_in_queue (GstHarness * h);
  114. void gst_harness_set_drop_buffers (GstHarness * h, gboolean drop_buffers);
  115. void gst_harness_dump_to_file (GstHarness * h, const gchar * filename);
  116. GstClockTime gst_harness_get_last_pushed_timestamp (GstHarness * h);
  117. /* downstream events */
  118. gboolean gst_harness_push_event (GstHarness * h, GstEvent * event);
  119. GstEvent * gst_harness_pull_event (GstHarness * h);
  120. GstEvent * gst_harness_try_pull_event (GstHarness * h);
  121. guint gst_harness_events_received (GstHarness * h);
  122. guint gst_harness_events_in_queue (GstHarness * h);
  123. /* upstream events */
  124. gboolean gst_harness_push_upstream_event (GstHarness * h, GstEvent * event);
  125. GstEvent * gst_harness_pull_upstream_event (GstHarness * h);
  126. GstEvent * gst_harness_try_pull_upstream_event (GstHarness * h);
  127. guint gst_harness_upstream_events_received (GstHarness * h);
  128. guint gst_harness_upstream_events_in_queue (GstHarness * h);
  129. /* latency */
  130. GstClockTime gst_harness_query_latency (GstHarness * h);
  131. void gst_harness_set_upstream_latency (GstHarness * h, GstClockTime latency);
  132. /* allocator and allocation params */
  133. void gst_harness_set_propose_allocator (GstHarness * h,
  134. GstAllocator * allocator,
  135. const GstAllocationParams * params);
  136. void gst_harness_get_allocator (GstHarness * h,
  137. GstAllocator ** allocator,
  138. GstAllocationParams * params);
  139. /* src-harness */
  140. void gst_harness_add_src_harness (GstHarness * h,
  141. GstHarness * src_harness,
  142. gboolean has_clock_wait);
  143. void gst_harness_add_src (GstHarness * h,
  144. const gchar * src_element_name,
  145. gboolean has_clock_wait);
  146. void gst_harness_add_src_parse (GstHarness * h,
  147. const gchar * launchline,
  148. gboolean has_clock_wait);
  149. GstFlowReturn gst_harness_push_from_src (GstHarness * h);
  150. GstFlowReturn gst_harness_src_crank_and_push_many (GstHarness * h,
  151. gint cranks,
  152. gint pushes);
  153. gboolean gst_harness_src_push_event (GstHarness * h);
  154. /* sink-harness */
  155. void gst_harness_add_sink_harness (GstHarness * h,
  156. GstHarness * sink_harness);
  157. void gst_harness_add_sink (GstHarness * h,
  158. const gchar * sink_element_name);
  159. void gst_harness_add_sink_parse (GstHarness * h,
  160. const gchar * launchline);
  161. GstFlowReturn gst_harness_push_to_sink (GstHarness * h);
  162. GstFlowReturn gst_harness_sink_push_many (GstHarness * h, gint pushes);
  163. /* convenience functions */
  164. GstElement * gst_harness_find_element (GstHarness * h,
  165. const gchar * element_name);
  166. void gst_harness_set (GstHarness * h,
  167. const gchar * element_name,
  168. const gchar * first_property_name, ...);
  169. void gst_harness_get (GstHarness * h,
  170. const gchar * element_name,
  171. const gchar * first_property_name, ...);
  172. void gst_harness_add_probe (GstHarness * h,
  173. const gchar * element_name,
  174. const gchar * pad_name,
  175. GstPadProbeType mask,
  176. GstPadProbeCallback callback,
  177. gpointer user_data,
  178. GDestroyNotify destroy_data);
  179. /* Stress */
  180. guint gst_harness_stress_thread_stop (GstHarnessThread * t);
  181. GstHarnessThread * gst_harness_stress_custom_start (GstHarness * h,
  182. GFunc init,
  183. GFunc callback,
  184. gpointer data,
  185. gulong sleep);
  186. #define gst_harness_stress_statechange_start(h) \
  187. gst_harness_stress_statechange_start_full (h, G_USEC_PER_SEC / 100)
  188. GstHarnessThread * gst_harness_stress_statechange_start_full (GstHarness * h,
  189. gulong sleep);
  190. #define gst_harness_stress_push_buffer_start(h, c, s, b) \
  191. gst_harness_stress_push_buffer_start_full (h, c, s, b, 0)
  192. GstHarnessThread * gst_harness_stress_push_buffer_start_full (GstHarness * h,
  193. GstCaps * caps,
  194. const GstSegment * segment,
  195. GstBuffer * buf,
  196. gulong sleep);
  197. /**
  198. * GstHarnessPrepareBufferFunc:
  199. * @h: a #GstHarness
  200. * @data: user data
  201. *
  202. * Since: 1.6
  203. */
  204. typedef GstBuffer * (*GstHarnessPrepareBufferFunc) (GstHarness * h, gpointer data);
  205. #define gst_harness_stress_push_buffer_with_cb_start(h, c, s, f, d, n) \
  206. gst_harness_stress_push_buffer_with_cb_start_full (h, c, s, f, d, n, 0)
  207. GstHarnessThread * gst_harness_stress_push_buffer_with_cb_start_full (GstHarness * h,
  208. GstCaps * caps,
  209. const GstSegment * segment,
  210. GstHarnessPrepareBufferFunc func,
  211. gpointer data,
  212. GDestroyNotify notify,
  213. gulong sleep);
  214. #define gst_harness_stress_push_event_start(h, e) \
  215. gst_harness_stress_push_event_start_full (h, e, 0)
  216. GstHarnessThread * gst_harness_stress_push_event_start_full (GstHarness * h,
  217. GstEvent * event,
  218. gulong sleep);
  219. /**
  220. * GstHarnessPrepareEventFunc:
  221. * @h: a #GstHarness
  222. * @data: user data
  223. *
  224. * Since: 1.8
  225. */
  226. typedef GstEvent * (*GstHarnessPrepareEventFunc) (GstHarness * h, gpointer data);
  227. #define gst_harness_stress_push_event_with_cb_start(h, f, d, n) \
  228. gst_harness_stress_push_event_with_cb_start_full (h, f, d, n, 0)
  229. GstHarnessThread * gst_harness_stress_push_event_with_cb_start_full (GstHarness * h,
  230. GstHarnessPrepareEventFunc func,
  231. gpointer data,
  232. GDestroyNotify notify,
  233. gulong sleep);
  234. #define gst_harness_stress_send_upstream_event_start(h, e) \
  235. gst_harness_stress_push_upstream_event_start_full (h, e, 0)
  236. GstHarnessThread * gst_harness_stress_push_upstream_event_start_full (GstHarness * h,
  237. GstEvent * event,
  238. gulong sleep);
  239. #define gst_harness_stress_send_upstream_event_with_cb_start(h, f, d, n) \
  240. gst_harness_stress_push_upstream_event_with_cb_start_full (h, f, d, n, 0)
  241. GstHarnessThread * gst_harness_stress_push_upstream_event_with_cb_start_full (GstHarness * h,
  242. GstHarnessPrepareEventFunc func,
  243. gpointer data,
  244. GDestroyNotify notify,
  245. gulong sleep);
  246. #define gst_harness_stress_property_start(h, n, v) \
  247. gst_harness_stress_property_start_full (h, n, v, G_USEC_PER_SEC / 1000)
  248. GstHarnessThread * gst_harness_stress_property_start_full (GstHarness * h,
  249. const gchar * name,
  250. const GValue * value,
  251. gulong sleep);
  252. #define gst_harness_stress_requestpad_start(h, t, n, c, r) \
  253. gst_harness_stress_requestpad_start_full (h, t, n, c, r, G_USEC_PER_SEC / 100)
  254. GstHarnessThread * gst_harness_stress_requestpad_start_full (GstHarness * h,
  255. GstPadTemplate * templ,
  256. const gchar * name,
  257. GstCaps * caps,
  258. gboolean release,
  259. gulong sleep);
  260. G_END_DECLS
  261. #endif /* __GST_HARNESS_H__ */