return GST_VALIDATE_MONITOR (monitor)->level;
}
-static GstPipeline *
-_get_pipeline (GstValidateReporter * monitor)
+/**
+ * gst_validate_monitor_get_pipeline:
+ * @monitor: The monitor to get the pipeline from
+ *
+ * Returns: (transfer full): The pipeline in which @monitor
+ * target is in.
+ */
+GstPipeline *
+gst_validate_monitor_get_pipeline (GstValidateMonitor * monitor)
{
- GstPipeline *pipeline;
+ return g_weak_ref_get (&monitor->pipeline);
+}
- GST_OBJECT_LOCK (monitor);
- pipeline = GST_VALIDATE_MONITOR (monitor)->pipeline;
- if (pipeline)
- gst_object_ref (pipeline);
- GST_OBJECT_UNLOCK (monitor);
+/**
+ * gst_validate_monitor_get_target:
+ * @monitor: The monitor to get the target from
+ *
+ * Returns: (transfer full): The target object
+ */
+GstObject *
+gst_validate_monitor_get_target (GstValidateMonitor * monitor)
+{
+ return g_weak_ref_get (&monitor->target);
+}
- return pipeline;
+static GstPipeline *
+_get_pipeline (GstValidateReporter * monitor)
+{
+ return g_weak_ref_get (&(GST_VALIDATE_MONITOR (monitor)->pipeline));
}
static void
GST_TYPE_OBJECT, _do_init);
static void
-_target_freed_cb (GstValidateMonitor * monitor, GObject * where_the_object_was)
-{
- GST_DEBUG_OBJECT (monitor, "Target was freed");
- monitor->target = NULL;
- GST_OBJECT_LOCK (monitor);
- monitor->pipeline = NULL;
- GST_OBJECT_UNLOCK (monitor);
-}
-
-static void
-_pipeline_freed_cb (GstValidateMonitor * monitor,
- GObject * where_the_object_was)
-{
- GST_DEBUG_OBJECT (monitor, "Pipeline was freed");
- GST_OBJECT_LOCK (monitor);
- monitor->pipeline = NULL;
- GST_OBJECT_UNLOCK (monitor);
-}
-
-static void
gst_validate_monitor_dispose (GObject * object)
{
GstValidateMonitor *monitor = GST_VALIDATE_MONITOR_CAST (object);
g_mutex_clear (&monitor->overrides_mutex);
g_queue_clear (&monitor->overrides);
- if (monitor->target)
- g_object_weak_unref (G_OBJECT (monitor->target),
- (GWeakNotify) _target_freed_cb, monitor);
-
- if (monitor->pipeline)
- g_object_weak_unref (G_OBJECT (monitor->pipeline),
- (GWeakNotify) _pipeline_freed_cb, monitor);
+ g_weak_ref_clear (&monitor->pipeline);
+ g_weak_ref_clear (&monitor->target);
if (monitor->media_descriptor)
gst_object_unref (monitor->media_descriptor);
construct_params));
if (monitor->parent) {
+ GstPipeline *parent_pipeline =
+ gst_validate_monitor_get_pipeline (monitor->parent);
+
gst_validate_monitor_set_media_descriptor (monitor,
monitor->parent->media_descriptor);
- GST_OBJECT_LOCK (monitor);
- if (monitor->parent->pipeline) {
- g_object_weak_ref (G_OBJECT (monitor->parent->pipeline),
- (GWeakNotify) _pipeline_freed_cb, monitor);
- monitor->pipeline = monitor->parent->pipeline;
+ if (parent_pipeline) {
+ g_weak_ref_init (&monitor->pipeline, parent_pipeline);
+
+ gst_object_unref (parent_pipeline);
}
- GST_OBJECT_UNLOCK (monitor);
}
gst_validate_monitor_setup (monitor);
gchar *object_name;
GstValidateReportingDetails level = GST_VALIDATE_SHOW_UNKNOWN;
- object = gst_object_ref (monitor->target);
+ object = gst_validate_monitor_get_target (monitor);
runner = gst_validate_reporter_get_runner (GST_VALIDATE_REPORTER (monitor));
do {
}
object_name = gst_object_get_name (object);
- level =
- gst_validate_runner_get_reporting_level_for_name (runner, object_name);
+ level = gst_validate_runner_get_reporting_level_for_name (runner,
+ object_name);
parent = gst_object_get_parent (object);
gst_object_unref (object);
object = parent;
return element;
}
-const gchar *
+gchar *
gst_validate_monitor_get_element_name (GstValidateMonitor * monitor)
{
+ gchar *res = NULL;
GstElement *element;
element = gst_validate_monitor_get_element (monitor);
- if (element)
- return GST_ELEMENT_NAME (element);
- return NULL;
+ if (element) {
+ res = g_strdup (GST_ELEMENT_NAME (element));
+ gst_object_unref (element);
+ }
+
+ return res;
}
/* Check if any of our overrides wants to change the report severity */
switch (prop_id) {
case PROP_OBJECT:
- g_assert (monitor->target == NULL);
- monitor->target = g_value_get_object (value);
- g_object_weak_ref (G_OBJECT (monitor->target),
- (GWeakNotify) _target_freed_cb, monitor);
+ {
+ GstObject *target;
+
+ target = g_value_get_object (value);
- if (monitor->target)
+ g_assert (gst_validate_monitor_get_target (monitor) == NULL);
+ g_weak_ref_init (&monitor->target, target);
+
+ if (target)
gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (monitor),
- g_strdup (GST_OBJECT_NAME (monitor->target)));
+ gst_object_get_name (target));
+
break;
+ }
case PROP_PIPELINE:
- GST_OBJECT_LOCK (monitor);
- monitor->pipeline = g_value_get_object (value);
- if (monitor->pipeline)
- g_object_weak_ref (G_OBJECT (monitor->pipeline),
- (GWeakNotify) _pipeline_freed_cb, monitor);
- GST_OBJECT_UNLOCK (monitor);
+ g_weak_ref_init (&monitor->pipeline, g_value_get_object (value));
case PROP_RUNNER:
gst_validate_reporter_set_runner (GST_VALIDATE_REPORTER (monitor),
g_value_get_object (value));
switch (prop_id) {
case PROP_OBJECT:
- g_value_set_object (value, GST_VALIDATE_MONITOR_GET_OBJECT (monitor));
+ g_value_take_object (value, gst_validate_monitor_get_target (monitor));
break;
case PROP_PIPELINE:
- g_value_set_object (value, monitor->pipeline);
+ g_value_take_object (value, gst_validate_monitor_get_pipeline (monitor));
break;
case PROP_RUNNER:
g_value_set_object (value, GST_VALIDATE_MONITOR_GET_RUNNER (monitor));
{
GstValidateMonitorClass *klass = GST_VALIDATE_MONITOR_GET_CLASS (monitor);
- GST_DEBUG_OBJECT (monitor->target, "Set media desc: %" GST_PTR_FORMAT,
+ GST_DEBUG_OBJECT (monitor, "Set media desc: %" GST_PTR_FORMAT,
media_descriptor);
if (monitor->media_descriptor)
gst_object_unref (monitor->media_descriptor);
{
GstPad *peerpad;
gboolean result = FALSE;
+ GstPad *pad =
+ GST_PAD_CAST (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
- peerpad = gst_pad_get_peer (pad_monitor->pad);
+ peerpad = gst_pad_get_peer (pad);
+ gst_object_unref (pad);
/* If the peer src pad already has a similar report no need to look
* any further */
{
GstIterator *iter;
gboolean done;
- GstPad *pad;
gboolean result = FALSE;
+ GstPad *target =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (pad_monitor));
+ iter = gst_pad_iterate_internal_links (target);
done = FALSE;
while (!done) {
GValue value = { 0, };
switch (gst_iterator_next (iter, &value)) {
case GST_ITERATOR_OK:
- pad = g_value_get_object (&value);
+ {
+ GstPad *pad = g_value_get_object (&value);
if (_find_master_report_on_pad (pad, report)) {
result = TRUE;
g_value_reset (&value);
break;
+ }
case GST_ITERATOR_RESYNC:
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (pad_monitor->pad,
- "Internal links pad iteration error");
+ GST_WARNING_OBJECT (target, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
break;
}
}
+ gst_object_unref (target);
gst_iterator_free (iter);
return result;
_concatenate_issues (GstValidatePadMonitor * pad_monitor,
GstValidateReport * report)
{
- if (GST_PAD_IS_SINK (pad_monitor->pad)
- && _find_master_report_for_sink_pad (pad_monitor, report))
+ GstPad *pad =
+ GST_PAD_CAST (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
+
+ if (GST_PAD_IS_SINK (pad)
+ && _find_master_report_for_sink_pad (pad_monitor, report)) {
+ gst_object_unref (pad);
return GST_VALIDATE_REPORTER_KEEP;
- else if (GST_PAD_IS_SRC (pad_monitor->pad)
- && _find_master_report_for_src_pad (pad_monitor, report))
+ } else if (GST_PAD_IS_SRC (pad)
+ && _find_master_report_for_src_pad (pad_monitor, report)) {
+ gst_object_unref (pad);
return GST_VALIDATE_REPORTER_KEEP;
+ }
+ gst_object_unref (pad);
return GST_VALIDATE_REPORTER_REPORT;
}
GstStructure *structure;
gint i;
- GST_DEBUG_OBJECT (monitor->pad, "Checking caps %" GST_PTR_FORMAT, caps);
+ GST_DEBUG_OBJECT (monitor, "Checking caps %" GST_PTR_FORMAT, caps);
for (i = 0; i < gst_caps_get_size (caps); i++) {
structure = gst_caps_get_structure (caps, i);
gboolean done;
GstPad *otherpad;
GstCaps *peercaps;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ iter = gst_pad_iterate_internal_links (pad);
done = FALSE;
while (!done) {
GValue value = { 0, };
caps = gst_caps_new_empty ();
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
break;
}
}
- gst_iterator_free (iter);
+ GST_DEBUG_OBJECT (pad, "Otherpad caps: %" GST_PTR_FORMAT, caps);
- GST_DEBUG_OBJECT (monitor->pad, "Otherpad caps: %" GST_PTR_FORMAT, caps);
+ gst_iterator_free (iter);
+ gst_object_unref (pad);
return caps;
}
gboolean done;
GstPad *otherpad;
GstCaps *template_caps;
+ GstPad *pad;
+
- GST_DEBUG_OBJECT (monitor->pad, "Transform caps %" GST_PTR_FORMAT, caps);
+ GST_DEBUG_OBJECT (monitor, "Transform caps %" GST_PTR_FORMAT, caps);
if (caps == NULL)
return NULL;
othercaps = gst_caps_new_empty ();
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ iter = gst_pad_iterate_internal_links (pad);
done = FALSE;
while (!done) {
GValue value = { 0, };
othercaps = gst_caps_new_empty ();
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
}
gst_iterator_free (iter);
- GST_DEBUG_OBJECT (monitor->pad, "Transformed caps: %" GST_PTR_FORMAT,
- othercaps);
+ GST_DEBUG_OBJECT (pad, "Transformed caps: %" GST_PTR_FORMAT, othercaps);
+ gst_object_unref (pad);
return othercaps;
}
monitor, GstClockTime ts)
{
gint i;
+ GstPad *pad;
if (!GST_CLOCK_TIME_IS_VALID (ts))
return;
- GST_DEBUG_OBJECT (monitor->pad, "Timestamp to check %" GST_TIME_FORMAT,
+ pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+
+ GST_DEBUG_OBJECT (pad, "Timestamp to check %" GST_TIME_FORMAT,
GST_TIME_ARGS (ts));
for (i = 0; i < monitor->serialized_events->len; i++) {
SerializedEventData *data =
g_ptr_array_index (monitor->serialized_events, i);
- GST_DEBUG_OBJECT (monitor->pad, "Event #%d (%s) ts: %" GST_TIME_FORMAT,
+ GST_DEBUG_OBJECT (pad, "Event #%d (%s) ts: %" GST_TIME_FORMAT,
i, GST_EVENT_TYPE_NAME (data->event), GST_TIME_ARGS (data->timestamp));
if (GST_CLOCK_TIME_IS_VALID (data->timestamp) && data->timestamp < ts) {
GST_VALIDATE_REPORT (monitor, SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME,
"Serialized event %s wasn't pushed before expected timestamp %"
GST_TIME_FORMAT " on pad %s:%s", event_str,
- GST_TIME_ARGS (data->timestamp),
- GST_DEBUG_PAD_NAME (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor)));
+ GST_TIME_ARGS (data->timestamp), GST_DEBUG_PAD_NAME (pad));
g_free (event_str);
} else {
}
if (i) {
- debug_pending_event (monitor->pad, monitor->serialized_events);
+ debug_pending_event (pad, monitor->serialized_events);
g_ptr_array_remove_range (monitor->serialized_events, 0, i);
}
+
+ gst_object_unref (pad);
}
static void
gst_validate_pad_monitor_dispose (GObject * object)
{
GstValidatePadMonitor *monitor = GST_VALIDATE_PAD_MONITOR_CAST (object);
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
if (pad) {
if (monitor->pad_probe_id)
gst_pad_remove_probe (pad, monitor->pad_probe_id);
+ gst_object_unref (pad);
}
if (monitor->expected_segment)
GstValidatePadMonitor *monitor = g_object_new (GST_TYPE_VALIDATE_PAD_MONITOR,
"object", pad, "validate-runner", runner, "validate-parent",
parent, NULL);
+ GstObject *target =
+ gst_validate_monitor_get_target (GST_VALIDATE_MONITOR (monitor));
- if (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor) == NULL) {
+ if (target == NULL) {
g_object_unref (monitor);
return NULL;
}
+
+ gst_object_unref (target);
return monitor;
}
static GstElement *
gst_validate_pad_monitor_get_element (GstValidateMonitor * monitor)
{
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ GstElement *parent = GST_ELEMENT (gst_pad_get_parent (pad));
+
+ gst_object_unref (pad);
- return GST_PAD_PARENT (pad);
+ return parent;
}
static void
gst_validate_pad_monitor_timestamp_is_in_received_range (GstValidatePadMonitor *
monitor, GstClockTime ts, GstClockTime tolerance)
{
- GST_DEBUG_OBJECT (monitor->pad, "Checking if timestamp %" GST_TIME_FORMAT
- " is in range: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " for pad "
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+
+ GST_DEBUG_OBJECT (pad,
+ "Checking if timestamp %" GST_TIME_FORMAT " is in range: %"
+ GST_TIME_FORMAT " - %" GST_TIME_FORMAT " for pad "
"%s:%s with tolerance: %" GST_TIME_FORMAT, GST_TIME_ARGS (ts),
GST_TIME_ARGS (monitor->timestamp_range_start),
- GST_TIME_ARGS (monitor->timestamp_range_end),
- GST_DEBUG_PAD_NAME (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor)),
+ GST_TIME_ARGS (monitor->timestamp_range_end), GST_DEBUG_PAD_NAME (pad),
GST_TIME_ARGS (tolerance));
+ gst_object_unref (pad);
+
return !GST_CLOCK_TIME_IS_VALID (monitor->timestamp_range_start) ||
!GST_CLOCK_TIME_IS_VALID (monitor->timestamp_range_end) ||
((monitor->timestamp_range_start >= tolerance ?
gboolean done;
GstPad *otherpad;
GstValidatePadMonitor *othermonitor;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
if (!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))
|| !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer))) {
- GST_DEBUG_OBJECT (monitor->pad,
+ GST_DEBUG_OBJECT (pad,
"Can't check buffer timestamps range as "
"buffer has no valid timestamp/duration");
- return;
+ goto done;
}
+
ts = GST_BUFFER_TIMESTAMP (buffer);
ts_end = ts + GST_BUFFER_DURATION (buffer);
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ iter = gst_pad_iterate_internal_links (pad);
if (iter == NULL) {
- GST_WARNING_OBJECT (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor),
- "No iterator available");
- return;
+ GST_WARNING_OBJECT (pad, "No iterator available");
+ goto done;
}
done = FALSE;
switch (gst_iterator_next (iter, &value)) {
case GST_ITERATOR_OK:
otherpad = g_value_get_object (&value);
- GST_DEBUG_OBJECT (monitor->pad, "Checking pad %s:%s input timestamps",
+ GST_DEBUG_OBJECT (pad, "Checking pad %s:%s input timestamps",
GST_DEBUG_PAD_NAME (otherpad));
othermonitor =
g_object_get_data ((GObject *) otherpad, "validate-monitor");
found = FALSE;
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
gst_iterator_free (iter);
if (!has_one) {
- GST_DEBUG_OBJECT (monitor->pad, "Skipping timestamp in range check as no "
+ GST_DEBUG_OBJECT (pad, "Skipping timestamp in range check as no "
"internal linked pad was found");
- return;
+ goto done;
}
if (!found) {
GST_VALIDATE_REPORT (monitor, BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE,
" is out of range of received input", GST_TIME_ARGS (ts),
GST_TIME_ARGS (ts_end));
}
+done:
+ if (pad)
+ gst_object_unref (pad);
}
static void
gst_validate_pad_monitor_check_first_buffer (GstValidatePadMonitor *
pad_monitor, GstBuffer * buffer)
{
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
+
if (G_UNLIKELY (pad_monitor->first_buffer)) {
pad_monitor->first_buffer = FALSE;
- if (!pad_monitor->has_segment
- && PAD_IS_IN_PUSH_MODE (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor)))
- {
+ if (!pad_monitor->has_segment && PAD_IS_IN_PUSH_MODE (pad)) {
GST_VALIDATE_REPORT (pad_monitor, BUFFER_BEFORE_SEGMENT,
"Received buffer before Segment event");
}
- GST_DEBUG_OBJECT (pad_monitor->pad,
+ GST_DEBUG_OBJECT (pad,
"Checking first buffer (pts:%" GST_TIME_FORMAT " dts:%" GST_TIME_FORMAT
")", GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
GST_TIME_ARGS (GST_BUFFER_DTS (buffer)));
}
+
+ gst_object_unref (pad);
}
static void
gst_validate_pad_monitor_update_buffer_data (GstValidatePadMonitor *
pad_monitor, GstBuffer * buffer)
{
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
pad_monitor->current_timestamp = GST_BUFFER_TIMESTAMP (buffer);
pad_monitor->current_duration = GST_BUFFER_DURATION (buffer);
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) {
}
}
}
- GST_DEBUG_OBJECT (pad_monitor->pad, "Current stored range: %" GST_TIME_FORMAT
+ GST_DEBUG_OBJECT (pad, "Current stored range: %" GST_TIME_FORMAT
" - %" GST_TIME_FORMAT,
GST_TIME_ARGS (pad_monitor->timestamp_range_start),
GST_TIME_ARGS (pad_monitor->timestamp_range_end));
+
+ gst_object_unref (pad);
}
static GstFlowReturn
GstValidatePadMonitor *othermonitor;
GstFlowReturn aggregated = GST_FLOW_NOT_LINKED;
gboolean found_a_pad = FALSE;
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
iter = gst_pad_iterate_internal_links (pad);
done = FALSE;
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
gst_iterator_free (iter);
if (!found_a_pad) {
/* no peer pad found, nothing to do */
- return;
+ goto done;
}
if (aggregated == GST_FLOW_OK || aggregated == GST_FLOW_EOS) {
GstState state, pending;
/* those are acceptable situations */
if (GST_PAD_IS_FLUSHING (pad) && ret == GST_FLOW_FLUSHING) {
/* pad is flushing, always acceptable to return flushing */
- return;
+ goto done;
}
gst_element_get_state (GST_ELEMENT (parent), &state, &pending, 0);
|| pending < GST_STATE_PAUSED)) {
/* Element is being teared down, accept FLOW_FLUSHING */
- return;
+ goto done;
}
if (monitor->is_eos && ret == GST_FLOW_EOS) {
/* this element received eos and returned eos */
- return;
+ goto done;
}
if (PAD_PARENT_IS_DEMUXER (monitor) && ret == GST_FLOW_EOS) {
/* a demuxer can return EOS when the samples end */
- return;
+ goto done;
}
}
gst_flow_get_name (ret), ret, gst_flow_get_name (aggregated),
aggregated);
}
+
+done:
+ gst_object_unref (pad);
}
static void
gboolean done;
GstPad *otherpad;
GstValidatePadMonitor *othermonitor;
+ GstPad *pad;
+
if (!GST_EVENT_IS_SERIALIZED (event))
return;
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ iter = gst_pad_iterate_internal_links (pad);
if (iter == NULL) {
/* inputselector will return NULL if the sinkpad is not the active one .... */
- GST_FIXME_OBJECT (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor), "No iterator");
+ GST_FIXME_OBJECT (pad, "No iterator");
+ gst_object_unref (pad);
return;
}
+
done = FALSE;
while (!done) {
GValue value = { 0, };
data->timestamp = last_ts;
data->event = gst_event_ref (event);
GST_VALIDATE_MONITOR_LOCK (othermonitor);
- GST_DEBUG_OBJECT (monitor->pad, "Storing for pad %s:%s event %p %s",
+ GST_DEBUG_OBJECT (pad, "Storing for pad %s:%s event %p %s",
GST_DEBUG_PAD_NAME (otherpad), event,
GST_EVENT_TYPE_NAME (event));
g_ptr_array_add (othermonitor->serialized_events, data);
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
}
}
gst_iterator_free (iter);
+ gst_object_unref (pad);
}
static void
GstPad *otherpad;
GstValidatePadMonitor *othermonitor;
const GValue *v;
+ GstPad *pad;
v = gst_structure_get_value (structure, field);
+ pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+
if (v == NULL) {
- GST_DEBUG_OBJECT (monitor->pad, "Not adding pending field %s as it isn't "
+ GST_DEBUG_OBJECT (pad, "Not adding pending field %s as it isn't "
"present on structure %" GST_PTR_FORMAT, field, structure);
+ gst_object_unref (pad);
return;
}
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ iter = gst_pad_iterate_internal_links (pad);
done = FALSE;
while (!done) {
GValue value = { 0, };
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
}
}
gst_iterator_free (iter);
+ gst_object_unref (pad);
}
static void
GstPad *otherpad;
GstValidatePadMonitor *othermonitor;
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ iter = gst_pad_iterate_internal_links (pad);
if (iter == NULL) {
+ gst_object_unref (pad);
GST_DEBUG_OBJECT (monitor, "No internally linked pad");
return;
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
break;
}
}
+ gst_object_unref (pad);
gst_iterator_free (iter);
}
gboolean done;
GstPad *otherpad;
GstValidatePadMonitor *othermonitor;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
- iter =
- gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD
- (monitor));
-
+ iter = gst_pad_iterate_internal_links (pad);
if (iter == NULL) {
GST_DEBUG_OBJECT (monitor, "No internally linked pad");
+ gst_object_unref (pad);
return;
}
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (monitor->pad, "Internal links pad iteration error");
+ GST_WARNING_OBJECT (pad, "Internal links pad iteration error");
done = TRUE;
break;
case GST_ITERATOR_DONE:
}
}
gst_iterator_free (iter);
+ gst_object_unref (pad);
}
static void
mark_pads_eos (GstValidatePadMonitor * pad_monitor)
{
GstValidatePadMonitor *peer_monitor;
- GstPad *peer = gst_pad_get_peer (pad_monitor->pad);
GstPad *real_peer;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
+ GstPad *peer = gst_pad_get_peer (pad);
+ gst_object_unref (pad);
pad_monitor->is_eos = TRUE;
if (peer) {
real_peer = _get_actual_pad (peer);
_should_check_buffers (GstValidatePadMonitor * pad_monitor,
gboolean force_checks)
{
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
GstValidateMonitor *monitor = GST_VALIDATE_MONITOR (pad_monitor);
if (pad_monitor->first_buffer || force_checks) {
pad_monitor->check_buffers = TRUE;
}
}
+ gst_object_unref (pad);
return pad_monitor->check_buffers;
}
GstFlowReturn ret = GST_FLOW_OK;
const GstSegment *segment;
guint32 seqnum = gst_event_get_seqnum (event);
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
gst_validate_pad_monitor_common_event_check (pad_monitor, event);
/* parse segment data to be used if event is handled */
gst_event_parse_segment (event, &segment);
- GST_DEBUG_OBJECT (pad_monitor->pad, "Got segment %" GST_SEGMENT_FORMAT,
- segment);
+ GST_DEBUG_OBJECT (pad, "Got segment %" GST_SEGMENT_FORMAT, segment);
/* Reset expected flush start/stop values, we have a segment */
pad_monitor->pending_flush_start_seqnum = 0;
if (handler)
gst_event_unref (event);
+ gst_object_unref (pad);
return ret;
}
GstSeekFlags seek_flags;
GstSeekType start_type, stop_type;
guint32 seqnum = gst_event_get_seqnum (event);
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
gst_validate_pad_monitor_common_event_check (pad_monitor, event);
/* Safely store pending accurate seek values */
if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) {
if (seek_flags & GST_SEEK_FLAG_ACCURATE) {
- GST_DEBUG_OBJECT (pad_monitor->pad,
+ GST_DEBUG_OBJECT (pad,
"Storing expected accurate seek time %" GST_TIME_FORMAT,
GST_TIME_ARGS (start));
pad_monitor->pending_seek_accurate_time = start;
* expected accurate seek value */
if (ret && pad_monitor->has_segment
&& seqnum == pad_monitor->pending_eos_seqnum) {
- GST_DEBUG_OBJECT (pad_monitor->pad,
+ GST_DEBUG_OBJECT (pad,
"Resetting expected accurate seek value, was already handled");
pad_monitor->pending_seek_accurate_time = GST_CLOCK_TIME_NONE;
} else if (!ret) {
if (handler)
gst_event_unref (event);
+ gst_object_unref (pad);
return ret;
}
GstMapInfo map, wanted_map;
gboolean ret = TRUE;
- GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor);
+ GstPad *pad;
+
if (_should_check_buffers (pad_monitor, FALSE) == FALSE)
return FALSE;
+ pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
if (pad_monitor->current_buf == NULL) {
GST_INFO_OBJECT (pad, "No current buffer one pad, Why?");
+ gst_object_unref (pad);
return FALSE;
}
gst_buffer_unmap (wanted_buf, &wanted_map);
gst_buffer_unmap (buffer, &map);
g_free (checksum);
+ gst_object_unref (pad);
pad_monitor->current_buf = pad_monitor->current_buf->next;
GstCaps * caps)
{
GstStructure *structure;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (pad_monitor)));
/* Check if caps are identical to last caps and complain if so
* Only checked for sink pads as src pads might push the same caps
* multiple times during unlinked/autoplugging scenarios */
- if (GST_PAD_IS_SINK (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor)) &&
- pad_monitor->last_caps
+ if (GST_PAD_IS_SINK (pad) && pad_monitor->last_caps
&& gst_caps_is_equal (caps, pad_monitor->last_caps)) {
gchar *caps_str = gst_caps_to_string (caps);
}
}
- if (GST_PAD_IS_SINK (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor)) &&
+ if (GST_PAD_IS_SINK (pad) &&
gst_validate_pad_monitor_pad_should_proxy_othercaps (pad_monitor)) {
if (_structure_is_video (structure)) {
- GST_DEBUG_OBJECT (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor),
+ GST_DEBUG_OBJECT (pad,
"Adding video common pending fields to other pad: %" GST_PTR_FORMAT,
structure);
gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor,
gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor,
structure, "pixel-aspect-ratio");
} else if (_structure_is_audio (structure)) {
- GST_DEBUG_OBJECT (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor),
+ GST_DEBUG_OBJECT (pad,
"Adding audio common pending fields to other pad: %" GST_PTR_FORMAT,
structure);
gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor,
gst_structure_free (pad_monitor->pending_setcaps_fields);
pad_monitor->pending_setcaps_fields =
gst_structure_new_empty (PENDING_FIELDS);
+ gst_object_unref (pad);
gst_validate_pad_monitor_setcaps_overrides (pad_monitor, caps);
}
gst_validate_pad_monitor_do_setup (GstValidateMonitor * monitor)
{
GstValidatePadMonitor *pad_monitor = GST_VALIDATE_PAD_MONITOR_CAST (monitor);
- GstPad *pad;
- if (!GST_IS_PAD (GST_VALIDATE_MONITOR_GET_OBJECT (monitor))) {
+ GstPad *pad = (gpointer) gst_validate_monitor_get_target (monitor);
+
+ if (!GST_IS_PAD (pad)) {
GST_WARNING_OBJECT (monitor, "Trying to create pad monitor with other "
"type of object");
+ gst_object_unref (pad);
return FALSE;
}
- pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor);
-
if (g_object_get_data ((GObject *) pad, "validate-monitor")) {
GST_WARNING_OBJECT (pad_monitor,
"Pad already has a validate-monitor associated");
+ gst_object_unref (pad);
return FALSE;
}
g_object_set_data ((GObject *) pad, "validate-monitor", pad_monitor);
- pad_monitor->pad = pad;
-
pad_monitor->event_func = GST_PAD_EVENTFUNC (pad);
pad_monitor->event_full_func = GST_PAD_EVENTFULLFUNC (pad);
pad_monitor->query_func = GST_PAD_QUERYFUNC (pad);
if (G_UNLIKELY (GST_PAD_PARENT (pad) == NULL))
GST_FIXME ("Saw a pad not belonging to any object");
+ gst_object_unref (pad);
return TRUE;
}
gint64 position, duration;
JsonBuilder *jbuilder;
GstElement *pipeline =
- GST_ELEMENT (GST_VALIDATE_MONITOR_GET_OBJECT (monitor));
+ GST_ELEMENT (gst_validate_monitor_get_pipeline (monitor));
gdouble rate = 1.0;
GstFormat format = GST_FORMAT_TIME;
if (!gst_element_query_position (pipeline, format, &position)) {
GST_DEBUG_OBJECT (monitor, "Could not query position");
- return TRUE;
+ goto done;
}
format = GST_FORMAT_TIME;
if (!gst_element_query_duration (pipeline, format, &duration)) {
GST_DEBUG_OBJECT (monitor, "Could not query duration");
- return TRUE;
+ goto done;
}
query = gst_query_new_segment (GST_FORMAT_DEFAULT);
"<position: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT
" speed: %f />\r", GST_TIME_ARGS (position), GST_TIME_ARGS (duration),
rate);
+done:
+ gst_object_unref (pipeline);
return TRUE;
}
gint i, j;
gboolean found = FALSE, empty_filter;
GstCaps *filter = gst_caps_copy (monitor->last_query_filter);
- GstCaps *possible_caps = gst_pad_query_caps (monitor->pad, NULL);
const gchar *filter_name, *possible_name;
GstStructure *filter_struct, *possible_struct;
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ GstCaps *possible_caps = gst_pad_query_caps (pad, NULL);
g_string_append_printf (str,
"\n Caps negotiation failed starting from pad '%s'"
empty_filter = gst_caps_is_empty (filter);
if (empty_filter) {
- GstPad *peer = _get_peer_pad (monitor->pad);
+ GstPad *peer = _get_peer_pad (pad);
gchar *prev_path = NULL;
if (peer) {
gst_caps_unref (possible_caps);
gst_caps_unref (filter);
+ gst_object_unref (pad);
}
{
gint i, j;
GstCaps *refused_caps = gst_caps_copy (monitor->last_refused_caps);
- GstCaps *possible_caps = gst_pad_query_caps (monitor->pad, NULL);
+ GstPad *pad =
+ GST_PAD (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR
+ (monitor)));
+ GstCaps *possible_caps = gst_pad_query_caps (pad, NULL);
gchar *caps_str = gst_caps_to_string (monitor->last_refused_caps);
StructureIncompatibleFieldsInfo info = {
.str = str,
}
gst_caps_unref (possible_caps);
+ gst_object_unref (pad);
return TRUE;
}
break;
case GST_MESSAGE_STATE_CHANGED:
{
- if (GST_MESSAGE_SRC (message) == GST_VALIDATE_MONITOR (monitor)->target) {
+ GstObject *target =
+ gst_validate_monitor_get_target (GST_VALIDATE_MONITOR (monitor));
+ if (GST_MESSAGE_SRC (message) == target) {
GstState oldstate, newstate, pending;
gst_message_parse_state_changed (message, &oldstate, &newstate,
}
}
+ if (target)
+ gst_object_unref (target);
+
break;
}
case GST_MESSAGE_BUFFERING:
{
/* scenarios currently only make sense for pipelines */
const gchar *scenarios_names;
- gchar **scenarios;
+ gchar **scenarios = NULL;
+ GstObject *target =
+ gst_validate_monitor_get_target (GST_VALIDATE_MONITOR (monitor));
if ((scenarios_names = g_getenv ("GST_VALIDATE_SCENARIO"))) {
gint i;
for (i = 0; scenarios[i]; i++) {
gchar **scenario_v = g_strsplit (scenarios[i], "->", 2);
- if (scenario_v[1] && GST_VALIDATE_MONITOR_GET_OBJECT (monitor)) {
- if (!g_pattern_match_simple (scenario_v[1],
- GST_OBJECT_NAME (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)))) {
+ if (scenario_v[1] && target) {
+ if (!g_pattern_match_simple (scenario_v[1], GST_OBJECT_NAME (target))) {
GST_INFO_OBJECT (monitor, "Not attaching to pipeline %" GST_PTR_FORMAT
- " as not matching pattern %s",
- GST_VALIDATE_MONITOR_GET_OBJECT (monitor), scenario_v[1]);
+ " as not matching pattern %s", target, scenario_v[1]);
- g_strfreev (scenario_v);
- return;
+ goto done;
}
}
monitor->scenario =
gst_validate_scenario_factory_create (GST_VALIDATE_MONITOR_GET_RUNNER
- (monitor),
- GST_ELEMENT_CAST (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)),
- scenario_v[0]);
+ (monitor), GST_ELEMENT_CAST (target), scenario_v[0]);
g_strfreev (scenario_v);
}
-
- g_strfreev (scenarios);
}
+done:
+ g_strfreev (scenarios);
+ if (target)
+ gst_object_unref (target);
}
/**
g_object_new (GST_TYPE_VALIDATE_PIPELINE_MONITOR, "object",
pipeline, "validate-runner", runner, "validate-parent", parent,
"pipeline", pipeline, NULL);
+ GstObject *target =
+ gst_validate_monitor_get_target (GST_VALIDATE_MONITOR (monitor));
- if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) {
+ if (target == NULL) {
g_object_unref (monitor);
return NULL;
}
monitor->is_playbin = TRUE;
else if (g_strcmp0 (G_OBJECT_TYPE_NAME (pipeline), "GstPlayBin3") == 0)
monitor->is_playbin3 = TRUE;
+ gst_object_unref (target);
return monitor;
}