| /* GstHarness - A test-harness for GStreamer testing |
| * |
| * Copyright (C) 2012-2015 Pexip <pexip.com> |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, write to the |
| * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| * Boston, MA 02111-1307, USA. |
| */ |
| |
| #ifndef __GST_HARNESS_H__ |
| #define __GST_HARNESS_H__ |
| |
| #include <gst/gst.h> |
| #include <gst/check/gsttestclock.h> |
| |
| G_BEGIN_DECLS |
| |
| /** |
| * GstHarnessThread: |
| * |
| * Opaque handle representing a GstHarness stress testing thread. |
| * |
| * Since: 1.6 |
| */ |
| typedef struct _GstHarnessThread GstHarnessThread; |
| |
| typedef struct _GstHarness GstHarness; |
| typedef struct _GstHarnessPrivate GstHarnessPrivate; |
| |
| /** |
| * GstHarness: |
| * @element: the element inside the harness |
| * @srcpad: the internal harness source pad |
| * @sinkpad: the internal harness sink pad |
| * @src_harness: the source (input) harness (if any) |
| * @sink_harness: the sink (output) harness (if any) |
| * |
| * Since: 1.6 |
| */ |
| struct _GstHarness { |
| GstElement * element; |
| |
| GstPad * srcpad; |
| GstPad * sinkpad; |
| |
| GstHarness * src_harness; |
| GstHarness * sink_harness; |
| |
| /*< private >*/ |
| GstHarnessPrivate * priv; |
| }; |
| |
| /* Harness creation */ |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_empty (void); |
| |
| GST_EXPORT |
| void gst_harness_add_element_full (GstHarness * h, |
| GstElement * element, |
| GstStaticPadTemplate * hsrc, |
| const gchar * element_sinkpad_name, |
| GstStaticPadTemplate * hsink, |
| const gchar * element_srcpad_name); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_full (GstElement * element, |
| GstStaticPadTemplate * hsrc, |
| const gchar * element_sinkpad_name, |
| GstStaticPadTemplate * hsink, |
| const gchar * element_srcpad_name); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_with_element (GstElement * element, |
| const gchar * element_sinkpad_name, |
| const gchar * element_srcpad_name); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_with_padnames (const gchar * element_name, |
| const gchar * element_sinkpad_name, |
| const gchar * element_srcpad_name); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_with_templates (const gchar * element_name, |
| GstStaticPadTemplate * hsrc, |
| GstStaticPadTemplate * hsink); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new (const gchar * element_name); |
| |
| GST_EXPORT |
| GstHarness * gst_harness_new_parse (const gchar * launchline); |
| |
| GST_EXPORT |
| void gst_harness_add_parse (GstHarness * h, const gchar * launchline); |
| |
| GST_EXPORT |
| void gst_harness_teardown (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_add_element_src_pad (GstHarness * h, GstPad * srcpad); |
| |
| GST_EXPORT |
| void gst_harness_add_element_sink_pad (GstHarness * h, GstPad * sinkpad); |
| |
| /* Caps Functions */ |
| |
| GST_EXPORT |
| void gst_harness_set_src_caps (GstHarness * h, GstCaps * caps); |
| |
| GST_EXPORT |
| void gst_harness_set_sink_caps (GstHarness * h, GstCaps * caps); |
| |
| GST_EXPORT |
| void gst_harness_set_caps (GstHarness * h, GstCaps * in, GstCaps * out); |
| |
| GST_EXPORT |
| void gst_harness_set_src_caps_str (GstHarness * h, const gchar * str); |
| |
| GST_EXPORT |
| void gst_harness_set_sink_caps_str (GstHarness * h, const gchar * str); |
| |
| GST_EXPORT |
| void gst_harness_set_caps_str (GstHarness * h, |
| const gchar * in, |
| const gchar * out); |
| |
| /* Clock Functions */ |
| |
| GST_EXPORT |
| void gst_harness_use_systemclock (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_use_testclock (GstHarness * h); |
| |
| GST_EXPORT |
| GstTestClock * gst_harness_get_testclock (GstHarness * h); |
| |
| GST_EXPORT |
| gboolean gst_harness_set_time (GstHarness * h, GstClockTime time); |
| |
| GST_EXPORT |
| gboolean gst_harness_wait_for_clock_id_waits (GstHarness * h, |
| guint waits, |
| guint timeout); |
| |
| GST_EXPORT |
| gboolean gst_harness_crank_single_clock_wait (GstHarness * h); |
| |
| GST_EXPORT |
| gboolean gst_harness_crank_multiple_clock_waits (GstHarness * h, |
| guint waits); |
| |
| /* misc */ |
| |
| GST_EXPORT |
| void gst_harness_play (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_set_blocking_push_mode (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_set_forwarding (GstHarness * h, gboolean forwarding); |
| |
| /* buffers */ |
| |
| GST_EXPORT |
| GstBuffer * gst_harness_create_buffer (GstHarness * h, gsize size); |
| |
| GST_EXPORT |
| GstFlowReturn gst_harness_push (GstHarness * h, GstBuffer * buffer); |
| |
| GST_EXPORT |
| GstBuffer * gst_harness_pull (GstHarness * h); |
| |
| GST_EXPORT |
| GstBuffer * gst_harness_try_pull (GstHarness * h); |
| |
| GST_EXPORT |
| GstBuffer * gst_harness_push_and_pull (GstHarness * h, GstBuffer * buffer); |
| |
| GST_EXPORT |
| guint gst_harness_buffers_received (GstHarness * h); |
| |
| GST_EXPORT |
| guint gst_harness_buffers_in_queue (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_set_drop_buffers (GstHarness * h, gboolean drop_buffers); |
| |
| GST_EXPORT |
| void gst_harness_dump_to_file (GstHarness * h, const gchar * filename); |
| |
| GST_EXPORT |
| guint8 * gst_harness_take_all_data (GstHarness * h, gsize * size); |
| |
| GST_EXPORT |
| GstBuffer * gst_harness_take_all_data_as_buffer (GstHarness * h); |
| |
| GST_EXPORT |
| GBytes * gst_harness_take_all_data_as_bytes (GstHarness * h); |
| |
| GST_EXPORT |
| GstClockTime gst_harness_get_last_pushed_timestamp (GstHarness * h); |
| |
| /* downstream events */ |
| |
| GST_EXPORT |
| gboolean gst_harness_push_event (GstHarness * h, GstEvent * event); |
| |
| GST_EXPORT |
| GstEvent * gst_harness_pull_event (GstHarness * h); |
| |
| GST_EXPORT |
| GstEvent * gst_harness_try_pull_event (GstHarness * h); |
| |
| GST_EXPORT |
| guint gst_harness_events_received (GstHarness * h); |
| |
| GST_EXPORT |
| guint gst_harness_events_in_queue (GstHarness * h); |
| |
| /* upstream events */ |
| |
| GST_EXPORT |
| gboolean gst_harness_push_upstream_event (GstHarness * h, GstEvent * event); |
| |
| GST_EXPORT |
| GstEvent * gst_harness_pull_upstream_event (GstHarness * h); |
| |
| GST_EXPORT |
| GstEvent * gst_harness_try_pull_upstream_event (GstHarness * h); |
| |
| GST_EXPORT |
| guint gst_harness_upstream_events_received (GstHarness * h); |
| |
| GST_EXPORT |
| guint gst_harness_upstream_events_in_queue (GstHarness * h); |
| |
| /* latency */ |
| |
| GST_EXPORT |
| GstClockTime gst_harness_query_latency (GstHarness * h); |
| |
| GST_EXPORT |
| void gst_harness_set_upstream_latency (GstHarness * h, GstClockTime latency); |
| |
| /* allocator and allocation params */ |
| |
| GST_EXPORT |
| void gst_harness_set_propose_allocator (GstHarness * h, |
| GstAllocator * allocator, |
| const GstAllocationParams * params); |
| |
| GST_EXPORT |
| void gst_harness_get_allocator (GstHarness * h, |
| GstAllocator ** allocator, |
| GstAllocationParams * params); |
| |
| /* src-harness */ |
| |
| GST_EXPORT |
| void gst_harness_add_src_harness (GstHarness * h, |
| GstHarness * src_harness, |
| gboolean has_clock_wait); |
| |
| GST_EXPORT |
| void gst_harness_add_src (GstHarness * h, |
| const gchar * src_element_name, |
| gboolean has_clock_wait); |
| |
| GST_EXPORT |
| void gst_harness_add_src_parse (GstHarness * h, |
| const gchar * launchline, |
| gboolean has_clock_wait); |
| |
| GST_EXPORT |
| GstFlowReturn gst_harness_push_from_src (GstHarness * h); |
| |
| GST_EXPORT |
| GstFlowReturn gst_harness_src_crank_and_push_many (GstHarness * h, |
| gint cranks, |
| gint pushes); |
| |
| GST_EXPORT |
| gboolean gst_harness_src_push_event (GstHarness * h); |
| |
| /* sink-harness */ |
| |
| GST_EXPORT |
| void gst_harness_add_sink_harness (GstHarness * h, |
| GstHarness * sink_harness); |
| |
| GST_EXPORT |
| void gst_harness_add_sink (GstHarness * h, |
| const gchar * sink_element_name); |
| |
| GST_EXPORT |
| void gst_harness_add_sink_parse (GstHarness * h, |
| const gchar * launchline); |
| |
| GST_EXPORT |
| GstFlowReturn gst_harness_push_to_sink (GstHarness * h); |
| |
| GST_EXPORT |
| GstFlowReturn gst_harness_sink_push_many (GstHarness * h, gint pushes); |
| |
| /* convenience functions */ |
| |
| GST_EXPORT |
| GstElement * gst_harness_find_element (GstHarness * h, |
| const gchar * element_name); |
| |
| GST_EXPORT |
| void gst_harness_set (GstHarness * h, |
| const gchar * element_name, |
| const gchar * first_property_name, ...); |
| |
| GST_EXPORT |
| void gst_harness_get (GstHarness * h, |
| const gchar * element_name, |
| const gchar * first_property_name, ...); |
| |
| GST_EXPORT |
| void gst_harness_add_probe (GstHarness * h, |
| const gchar * element_name, |
| const gchar * pad_name, |
| GstPadProbeType mask, |
| GstPadProbeCallback callback, |
| gpointer user_data, |
| GDestroyNotify destroy_data); |
| |
| /* Stress */ |
| |
| GST_EXPORT |
| guint gst_harness_stress_thread_stop (GstHarnessThread * t); |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_custom_start (GstHarness * h, |
| GFunc init, |
| GFunc callback, |
| gpointer data, |
| gulong sleep); |
| |
| #define gst_harness_stress_statechange_start(h) \ |
| gst_harness_stress_statechange_start_full (h, G_USEC_PER_SEC / 100) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_statechange_start_full (GstHarness * h, |
| gulong sleep); |
| |
| #define gst_harness_stress_push_buffer_start(h, c, s, b) \ |
| gst_harness_stress_push_buffer_start_full (h, c, s, b, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_buffer_start_full (GstHarness * h, |
| GstCaps * caps, |
| const GstSegment * segment, |
| GstBuffer * buf, |
| gulong sleep); |
| |
| /** |
| * GstHarnessPrepareBufferFunc: |
| * @h: a #GstHarness |
| * @data: user data |
| * |
| * Since: 1.6 |
| */ |
| typedef GstBuffer * (*GstHarnessPrepareBufferFunc) (GstHarness * h, gpointer data); |
| |
| #define gst_harness_stress_push_buffer_with_cb_start(h, c, s, f, d, n) \ |
| gst_harness_stress_push_buffer_with_cb_start_full (h, c, s, f, d, n, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_buffer_with_cb_start_full (GstHarness * h, |
| GstCaps * caps, |
| const GstSegment * segment, |
| GstHarnessPrepareBufferFunc func, |
| gpointer data, |
| GDestroyNotify notify, |
| gulong sleep); |
| |
| #define gst_harness_stress_push_event_start(h, e) \ |
| gst_harness_stress_push_event_start_full (h, e, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_event_start_full (GstHarness * h, |
| GstEvent * event, |
| gulong sleep); |
| |
| /** |
| * GstHarnessPrepareEventFunc: |
| * @h: a #GstHarness |
| * @data: user data |
| * |
| * Since: 1.8 |
| */ |
| typedef GstEvent * (*GstHarnessPrepareEventFunc) (GstHarness * h, gpointer data); |
| |
| #define gst_harness_stress_push_event_with_cb_start(h, f, d, n) \ |
| gst_harness_stress_push_event_with_cb_start_full (h, f, d, n, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_event_with_cb_start_full (GstHarness * h, |
| GstHarnessPrepareEventFunc func, |
| gpointer data, |
| GDestroyNotify notify, |
| gulong sleep); |
| |
| #define gst_harness_stress_send_upstream_event_start(h, e) \ |
| gst_harness_stress_push_upstream_event_start_full (h, e, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_upstream_event_start_full (GstHarness * h, |
| GstEvent * event, |
| gulong sleep); |
| |
| #define gst_harness_stress_send_upstream_event_with_cb_start(h, f, d, n) \ |
| gst_harness_stress_push_upstream_event_with_cb_start_full (h, f, d, n, 0) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_push_upstream_event_with_cb_start_full (GstHarness * h, |
| GstHarnessPrepareEventFunc func, |
| gpointer data, |
| GDestroyNotify notify, |
| gulong sleep); |
| |
| |
| #define gst_harness_stress_property_start(h, n, v) \ |
| gst_harness_stress_property_start_full (h, n, v, G_USEC_PER_SEC / 1000) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_property_start_full (GstHarness * h, |
| const gchar * name, |
| const GValue * value, |
| gulong sleep); |
| |
| #define gst_harness_stress_requestpad_start(h, t, n, c, r) \ |
| gst_harness_stress_requestpad_start_full (h, t, n, c, r, G_USEC_PER_SEC / 100) |
| |
| GST_EXPORT |
| GstHarnessThread * gst_harness_stress_requestpad_start_full (GstHarness * h, |
| GstPadTemplate * templ, |
| const gchar * name, |
| GstCaps * caps, |
| gboolean release, |
| gulong sleep); |
| |
| G_END_DECLS |
| |
| #endif /* __GST_HARNESS_H__ */ |