diff --git a/validate/gst/validate/gst-validate-pad-monitor.c b/validate/gst/validate/gst-validate-pad-monitor.c index 87dadff84d..ec614d68dc 100644 --- a/validate/gst/validate/gst-validate-pad-monitor.c +++ b/validate/gst/validate/gst-validate-pad-monitor.c @@ -1513,6 +1513,13 @@ gst_validate_pad_monitor_setcaps_pre (GstValidatePadMonitor * pad_monitor, { GstStructure *structure; + /* Check if caps are identical to last caps and complain if so */ + if (pad_monitor->last_caps + && gst_caps_is_equal (caps, pad_monitor->last_caps)) { + GST_VALIDATE_REPORT (pad_monitor, EVENT_CAPS_DUPLICATE, "%" GST_PTR_FORMAT, + caps); + } + gst_validate_pad_monitor_check_caps_complete (pad_monitor, caps); if (caps) { @@ -1574,6 +1581,12 @@ gst_validate_pad_monitor_setcaps_post (GstValidatePadMonitor * pad_monitor, { if (!ret) gst_validate_pad_monitor_otherpad_clear_pending_fields (pad_monitor); + else { + if (pad_monitor->last_caps) { + gst_caps_unref (pad_monitor->last_caps); + } + pad_monitor->last_caps = gst_caps_ref (caps); + } } static gboolean @@ -1596,6 +1609,8 @@ gst_validate_pad_monitor_do_setup (GstValidateMonitor * monitor) g_object_set_data ((GObject *) pad, "qa-monitor", pad_monitor); + pad_monitor->pad = pad; + pad_monitor->event_func = GST_PAD_EVENTFUNC (pad); pad_monitor->query_func = GST_PAD_QUERYFUNC (pad); if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) { diff --git a/validate/gst/validate/gst-validate-pad-monitor.h b/validate/gst/validate/gst-validate-pad-monitor.h index d923534415..5b11dbad41 100644 --- a/validate/gst/validate/gst-validate-pad-monitor.h +++ b/validate/gst/validate/gst-validate-pad-monitor.h @@ -68,6 +68,9 @@ struct _GstValidatePadMonitor { gulong pad_probe_id; /*< private >*/ + /* Last caps pushed/received */ + GstCaps *last_caps; + /* FIXME : Let's migrate all those booleans into a 32 (or 64) bit flag */ gboolean first_buffer; gboolean has_segment; diff --git a/validate/gst/validate/gst-validate-report.c b/validate/gst/validate/gst-validate-report.c index d0372da974..a51d190afb 100644 --- a/validate/gst/validate/gst-validate-report.c +++ b/validate/gst/validate/gst-validate-report.c @@ -164,6 +164,8 @@ gst_validate_report_load_issues (void) _("received an unexpected flush start event"), NULL); REGISTER_VALIDATE_ISSUE (WARNING, EVENT_FLUSH_STOP_UNEXPECTED, _("received an unexpected flush stop event"), NULL); + REGISTER_VALIDATE_ISSUE (WARNING, EVENT_CAPS_DUPLICATE, + _("received the same caps twice"), NULL); REGISTER_VALIDATE_ISSUE (CRITICAL, EVENT_SEEK_NOT_HANDLED, _("seek event wasn't handled"), NULL); diff --git a/validate/gst/validate/gst-validate-report.h b/validate/gst/validate/gst-validate-report.h index 09ea4a46ea..207f63b2a8 100644 --- a/validate/gst/validate/gst-validate-report.h +++ b/validate/gst/validate/gst-validate-report.h @@ -86,6 +86,7 @@ typedef enum { #define GST_VALIDATE_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 5) #define GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 6) #define GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 7) +#define GST_VALIDATE_ISSUE_ID_EVENT_CAPS_DUPLICATE (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 8) #define GST_VALIDATE_ISSUE_ID_EVENT_SEEK_NOT_HANDLED (((GstValidateIssueId) GST_VALIDATE_AREA_SEEK) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) #define GST_VALIDATE_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG (((GstValidateIssueId) GST_VALIDATE_AREA_SEEK) << GST_VALIDATE_ISSUE_ID_SHIFT | 2)