Struct gstreamer_check::TestClock [−][src]
pub struct TestClock(_);
Expand description
GstTestClock is an implementation of gst::Clock
which has different
behaviour compared to gst::SystemClock
. Time for gst::SystemClock
advances
according to the system time, while time for TestClock
changes only
when set_time()
or advance_time()
are
called. TestClock
provides unit tests with the possibility to
precisely advance the time in a deterministic manner, independent of the
system time or any other external factors.
Advancing the time of a TestClock
#include <gst/gst.h>
#include <gst/check/gsttestclock.h>
GstClock *clock;
GstTestClock *test_clock;
clock = gst_test_clock_new ();
test_clock = GST_TEST_CLOCK (clock);
GST_INFO ("Time: %" GST_TIME_FORMAT, GST_TIME_ARGS (gst_clock_get_time (clock)));
gst_test_clock_advance_time ( test_clock, 1 * GST_SECOND);
GST_INFO ("Time: %" GST_TIME_FORMAT, GST_TIME_ARGS (gst_clock_get_time (clock)));
g_usleep (10 * G_USEC_PER_SEC);
GST_INFO ("Time: %" GST_TIME_FORMAT, GST_TIME_ARGS (gst_clock_get_time (clock)));
gst_test_clock_set_time (test_clock, 42 * GST_SECOND);
GST_INFO ("Time: %" GST_TIME_FORMAT, GST_TIME_ARGS (gst_clock_get_time (clock)));
...
gst::Clock
allows for setting up single shot or periodic clock notifications
as well as waiting for these notifications synchronously (using
gst_clock_id_wait()
) or asynchronously (using gst_clock_id_wait_async()
or
gst_clock_id_wait_async()
). This is used by many GStreamer elements,
among them GstBaseSrc
and GstBaseSink
.
TestClock
keeps track of these clock notifications. By calling
wait_for_next_pending_id()
or
wait_for_multiple_pending_ids()
a unit tests may wait for the
next one or several clock notifications to be requested. Additionally unit
tests may release blocked waits in a controlled fashion by calling
process_next_clock_id()
. This way a unit test can control the
inaccuracy (jitter) of clock notifications, since the test can decide to
release blocked waits when the clock time has advanced exactly to, or past,
the requested clock notification time.
There are also interfaces for determining if a notification belongs to a
TestClock
or not, as well as getting the number of requested clock
notifications so far.
N.B.: When a unit test waits for a certain amount of clock notifications to
be requested in wait_for_next_pending_id()
or
wait_for_multiple_pending_ids()
then these functions may block
for a long time. If they block forever then the expected clock notifications
were never requested from TestClock
, and so the assumptions in the code
of the unit test are wrong. The unit test case runner in gstcheck is
expected to catch these cases either by the default test case timeout or the
one set for the unit test by calling tcase_set_timeout().
The sample code below assumes that the element under test will delay a
buffer pushed on the source pad by some latency until it arrives on the sink
pad. Moreover it is assumed that the element will at some point call
gst_clock_id_wait()
to synchronously wait for a specific time. The first
buffer sent will arrive exactly on time only delayed by the latency. The
second buffer will arrive a little late (7ms) due to simulated jitter in the
clock notification.
Demonstration of how to work with clock notifications and TestClock
#include <gst/gst.h>
#include <gst/check/gstcheck.h>
#include <gst/check/gsttestclock.h>
GstClockTime latency;
GstElement *element;
GstPad *srcpad;
GstClock *clock;
GstTestClock *test_clock;
GstBuffer buf;
GstClockID pending_id;
GstClockID processed_id;
latency = 42 * GST_MSECOND;
element = create_element (latency, ...);
srcpad = get_source_pad (element);
clock = gst_test_clock_new ();
test_clock = GST_TEST_CLOCK (clock);
gst_element_set_clock (element, clock);
GST_INFO ("Set time, create and push the first buffer\n");
gst_test_clock_set_time (test_clock, 0);
buf = create_test_buffer (gst_clock_get_time (clock), ...);
gst_assert_cmpint (gst_pad_push (srcpad, buf), ==, GST_FLOW_OK);
GST_INFO ("Block until element is waiting for a clock notification\n");
gst_test_clock_wait_for_next_pending_id (test_clock, &pending_id);
GST_INFO ("Advance to the requested time of the clock notification\n");
gst_test_clock_advance_time (test_clock, latency);
GST_INFO ("Release the next blocking wait and make sure it is the one from element\n");
processed_id = gst_test_clock_process_next_clock_id (test_clock);
g_assert (processed_id == pending_id);
g_assert_cmpint (GST_CLOCK_ENTRY_STATUS (processed_id), ==, GST_CLOCK_OK);
gst_clock_id_unref (pending_id);
gst_clock_id_unref (processed_id);
GST_INFO ("Validate that element produced an output buffer and check its timestamp\n");
g_assert_cmpint (get_number_of_output_buffer (...), ==, 1);
buf = get_buffer_pushed_by_element (element, ...);
g_assert_cmpint (GST_BUFFER_TIMESTAMP (buf), ==, latency);
gst_buffer_unref (buf);
GST_INFO ("Check that element does not wait for any clock notification\n");
g_assert (!gst_test_clock_peek_next_pending_id (test_clock, NULL));
GST_INFO ("Set time, create and push the second buffer\n");
gst_test_clock_advance_time (test_clock, 10 * GST_SECOND);
buf = create_test_buffer (gst_clock_get_time (clock), ...);
gst_assert_cmpint (gst_pad_push (srcpad, buf), ==, GST_FLOW_OK);
GST_INFO ("Block until element is waiting for a new clock notification\n");
(gst_test_clock_wait_for_next_pending_id (test_clock, &pending_id);
GST_INFO ("Advance past 7ms beyond the requested time of the clock notification\n");
gst_test_clock_advance_time (test_clock, latency + 7 * GST_MSECOND);
GST_INFO ("Release the next blocking wait and make sure it is the one from element\n");
processed_id = gst_test_clock_process_next_clock_id (test_clock);
g_assert (processed_id == pending_id);
g_assert_cmpint (GST_CLOCK_ENTRY_STATUS (processed_id), ==, GST_CLOCK_OK);
gst_clock_id_unref (pending_id);
gst_clock_id_unref (processed_id);
GST_INFO ("Validate that element produced an output buffer and check its timestamp\n");
g_assert_cmpint (get_number_of_output_buffer (...), ==, 1);
buf = get_buffer_pushed_by_element (element, ...);
g_assert_cmpint (GST_BUFFER_TIMESTAMP (buf), ==,
10 * GST_SECOND + latency + 7 * GST_MSECOND);
gst_buffer_unref (buf);
GST_INFO ("Check that element does not wait for any clock notification\n");
g_assert (!gst_test_clock_peek_next_pending_id (test_clock, NULL));
...
Since TestClock
is only supposed to be used in unit tests it calls
g_assert()
, g_assert_cmpint()
or g_assert_cmpuint()
to validate all function
arguments. This will highlight any issues with the unit test code itself.
Implements
gst::prelude::ClockExt
, gst::prelude::ObjectExt
, trait@glib::ObjectExt
Implementations
Creates a new test clock with its time set to zero.
MT safe.
Returns
a TestClock
cast to gst::Clock
.
Creates a new test clock with its time set to the specified time.
MT safe.
start_time
a GstClockTime
set to the desired start time of the clock.
Returns
a TestClock
cast to gst::Clock
.
Advances the time of the self
by the amount given by delta
. The
time of self
is monotonically increasing, therefore providing a
delta
which is negative or zero is a programming error.
MT safe.
delta
a positive GstClockTimeDiff
to be added to the time of the clock
A “crank” consists of three steps:
1: Wait for a GstClockID
to be registered with the TestClock
.
2: Advance the TestClock
to the time the GstClockID
is waiting, unless
the clock time is already passed the clock id (Since: 1.18).
3: Release the GstClockID
wait.
A “crank” can be though of as the notion of
manually driving the clock forward to its next logical step.
Returns
true
if the crank was successful, false
otherwise.
MT safe.
Retrieve the requested time for the next pending clock notification.
MT safe.
Returns
a GstClockTime
set to the time of the next pending clock
notification. If no clock notifications have been requested
GST_CLOCK_TIME_NONE
will be returned.
Determine the number of pending clock notifications that have been
requested from the self
.
MT safe.
Returns
the number of pending clock notifications.
Sets the time of self
to the time given by new_time
. The time of
self
is monotonically increasing, therefore providing a new_time
which is earlier or equal to the time of the clock as given by
[ClockExtManual::time()
][crate::gst::prelude::ClockExtManual::time()] is a programming error.
MT safe.
new_time
a GstClockTime
later than that returned by [ClockExtManual::time()
][crate::gst::prelude::ClockExtManual::time()]
Blocks until at least count
clock notifications have been requested from
self
. There is no timeout for this wait, see the main description of
TestClock
.
Deprecated
use wait_for_multiple_pending_ids()
instead.
count
the number of pending clock notifications to wait for
When a TestClock
is constructed it will have a certain start time set.
If the clock was created using with_start_time()
then
this property contains the value of the start_time
argument. If
new()
was called the clock started at time zero, and thus
this property contains the value 0.
pub fn connect_clock_type_notify<F: Fn(&Self) + Send + Sync + 'static>(
&self,
f: F
) -> SignalHandlerId
[src]Determines if the pending_id
is the next clock notification scheduled to
be triggered given the current time of the self
.
MT safe.
Returns
true
if pending_id
is the next clock notification to be
triggered, false
otherwise.
pending_id
a GstClockID
clock
notification to look for
This is supported on crate feature v1_18
only.
v1_18
only.Processes and releases the pending IDs in the list.
MT safe.
pending_list
List
of pending GstClockIDs
Blocks until at least count
clock notifications have been requested from
self
. There is no timeout for this wait, see the main description of
TestClock
.
MT safe.
count
the number of pending clock notifications to wait for
Returns
pending_list
Address
of a GList
pointer variable to store the list of pending GstClockIDs
that expired, or None
Waits until a clock notification is requested from self
. There is no
timeout for this wait, see the main description of TestClock
. A reference
to the pending clock notification is stored in pending_id
.
MT safe.
Returns
pending_id
GstClockID
with information about the pending clock notification
pub fn timed_wait_for_multiple_pending_ids(
&self,
count: u32,
timeout_ms: u32
) -> (bool, Vec<ClockId>)
[src]This is supported on crate feature v1_16
only.
pub fn timed_wait_for_multiple_pending_ids(
&self,
count: u32,
timeout_ms: u32
) -> (bool, Vec<ClockId>)
[src]v1_16
only.Blocks until at least count
clock notifications have been requested from
self
, or the timeout expires.
MT safe.
count
the number of pending clock notifications to wait for
timeout_ms
the timeout in milliseconds
Returns
a gboolean
true
if the waits have been registered, false
if not.
(Could be that it timed out waiting or that more waits than waits was found)
pending_list
Address
of a GList
pointer variable to store the list of pending GstClockIDs
that expired, or None
Trait Implementations
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
Returns the type identifier of Self
.
Auto Trait Implementations
Blanket Implementations
Mutably borrows from an owned value. Read more
Upcasts an object to a superclass or interface T
. Read more
Upcasts an object to a reference of its superclass or interface T
. Read more
Tries to downcast to a subclass or interface implementor T
. Read more
Tries to downcast to a reference of its subclass or interface implementor T
. Read more
Tries to cast to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already. Read more
Tries to cast to reference to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already. Read more
Casts to T
unconditionally. Read more
Casts to &T
unconditionally. Read more
The time master
of the master clock and the time slave
of the slave
clock are added to the list of observations. If enough observations
are available, a linear regression algorithm is run on the
observations and self
is recalibrated. Read more
Add a clock observation to the internal slaving algorithm the same as
add_observation()
, and return the result of the master clock
estimation, without updating the internal calibration. Read more
Converts the given internal
clock time to the external time, adjusting for the
rate and reference time set with set_calibration()
and making sure
that the returned time is increasing. This function should be called with the
clock’s OBJECT_LOCK held and is mainly used by clock subclasses. Read more
Gets the internal rate and reference time of self
. See
set_calibration()
for more information. Read more
Gets the current internal time of the given clock. The time is returned unadjusted for the offset and the rate. Read more
Gets the current time of the given clock. The time is always monotonically increasing and adjusted according to the current offset and rate. Read more
Gets the amount of time that master and slave clocks are sampled. Read more
Checks if the clock is currently synced, by looking at whether
ClockFlags::NEEDS_STARTUP_SYNC
is set. Read more
Adjusts the rate and time of self
. A rate of 1/1 is the normal speed of
the clock. Values bigger than 1/1 make the clock go faster. Read more
Sets the accuracy of the clock. Some clocks have the possibility to operate
with different accuracy at the expense of more resource usage. There is
normally no need to change the default resolution of a clock. The resolution
of a clock can only be changed if the clock has the
ClockFlags::CAN_SET_RESOLUTION
flag set. Read more
Sets self
to synced and emits the signal::Clock::synced
signal, and wakes up any
thread waiting in wait_for_sync()
. Read more
Sets the amount of time, in nanoseconds, to sample master and slave clocks Read more
pub fn connect_synced<F>(&self, f: F) -> SignalHandlerId where
F: 'static + Fn(&O, bool) + Send + Sync,
[src]pub fn connect_timeout_notify<F>(&self, f: F) -> SignalHandlerId where
F: 'static + Fn(&O) + Send + Sync,
[src]pub fn connect_window_size_notify<F>(&self, f: F) -> SignalHandlerId where
F: 'static + Fn(&O) + Send + Sync,
[src]pub fn connect_window_threshold_notify<F>(&self, f: F) -> SignalHandlerId where
F: 'static + Fn(&O) + Send + Sync,
[src]pub fn periodic_id_reinit(
&self,
id: &PeriodicClockId,
start_time: ClockTime,
interval: ClockTime
) -> Result<(), BoolError>
[src]pub fn single_shot_id_reinit(
&self,
id: &SingleShotClockId,
time: ClockTime
) -> Result<(), BoolError>
[src]pub fn add_control_binding<P>(&self, binding: &P) -> Result<(), BoolError> where
P: IsA<ControlBinding>,
[src]
pub fn add_control_binding<P>(&self, binding: &P) -> Result<(), BoolError> where
P: IsA<ControlBinding>,
[src]Attach the ControlBinding
to the object. If there already was a
ControlBinding
for this property it will be replaced. Read more
A default error function that uses g_printerr()
to display the error message
and the optional debug string.. Read more
Gets the corresponding ControlBinding
for the property. This should be
unreferenced again after use. Read more
Obtain the control-rate for this self
. Audio processing Element
objects will use this rate to sub-divide their processing loop and call
sync_values()
in between. The length of the processing segment
should be up to control
-rate nanoseconds. Read more
Returns the parent of self
. This function increases the refcount
of the parent object so you should gst_object_unref()
it after usage. Read more
Generates a string describing the path of self
in
the object hierarchy. Only useful (or used) for debugging. Read more
Gets the value for the given controlled property at the requested time. Read more
pub fn connect_parent_notify<F>(&self, f: F) -> SignalHandlerId where
F: 'static + Fn(&O) + Send + Sync,
[src]Returns true
if the object is an instance of (can be cast to) T
.
pub fn set_properties(
&self,
property_values: &[(&str, &dyn ToValue)]
) -> Result<(), BoolError>
[src]pub fn set_properties_from_value(
&self,
property_values: &[(&str, Value)]
) -> Result<(), BoolError>
[src]pub fn set_property<'a, N, V>(
&self,
property_name: N,
value: V
) -> Result<(), BoolError> where
V: ToValue,
N: Into<&'a str>,
[src]pub fn set_property_from_value<'a, N>(
&self,
property_name: N,
value: &Value
) -> Result<(), BoolError> where
N: Into<&'a str>,
[src]pub fn property<'a, N>(&self, property_name: N) -> Result<Value, BoolError> where
N: Into<&'a str>,
[src]Safety Read more
Safety Read more
Safety Read more
Safety Read more
pub fn connect_notify<F>(&self, name: Option<&str>, f: F) -> SignalHandlerId where
F: 'static + Fn(&T, &ParamSpec) + Send + Sync,
[src]pub fn connect_notify_local<F>(
&self,
name: Option<&str>,
f: F
) -> SignalHandlerId where
F: 'static + Fn(&T, &ParamSpec),
[src]pub unsafe fn connect_notify_unsafe<F>(
&self,
name: Option<&str>,
f: F
) -> SignalHandlerId where
F: Fn(&T, &ParamSpec),
[src]pub fn has_property<'a, N>(&self, property_name: N, type_: Option<Type>) -> bool where
N: Into<&'a str>,
[src]pub fn find_property<'a, N>(&self, property_name: N) -> Option<ParamSpec> where
N: Into<&'a str>,
[src]pub fn connect<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
F: Fn(&[Value]) -> Option<Value> + Send + Sync + 'static,
N: Into<&'a str>,
[src]Same as connect
but takes a SignalId
instead of a signal name.
pub fn connect_local<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
F: Fn(&[Value]) -> Option<Value> + 'static,
N: Into<&'a str>,
[src]Same as connect_local
but takes a SignalId
instead of a signal name.
pub unsafe fn connect_unsafe<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
F: Fn(&[Value]) -> Option<Value>,
N: Into<&'a str>,
[src]Same as connect_unsafe
but takes a SignalId
instead of a signal name.
Emit signal by signal id.
Emit signal with details by signal id.
Emit signal by it’s name.
pub fn bind_property<'a, O, N, M>(
&'a self,
source_property: N,
target: &'a O,
target_property: M
) -> BindingBuilder<'a> where
N: Into<&'a str>,
O: ObjectType,
M: Into<&'a str>,
[src]Same as emit
but takes Value
for the arguments.
Same as emit_by_name
but takes Value
for the arguments.
Returns a SendValue
clone of self
.
impl<'a, T, C> FromValueOptional<'a> for T where
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError>,
T: FromValue<'a, Checker = C>,
[src]