+static GstBuffer *
+generate_rtcp_sr_buffer (guint ssrc)
+{
+ GstBuffer *buf;
+ GstRTCPBuffer rtcp = GST_RTCP_BUFFER_INIT;
+ GstRTCPPacket packet;
+
+ buf = gst_rtcp_buffer_new (1000);
+ fail_unless (gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp));
+ fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SR, &packet));
+ gst_rtcp_packet_sr_set_sender_info (&packet, ssrc, 0, 0, 1, 1);
+ gst_rtcp_buffer_unmap (&rtcp);
+ return buf;
+}
+
+typedef struct
+{
+ GstHarness *rtp_h;
+ GstHarness *rtcp_h;
+} SimulCtx;
+
+static void
+_simul_ctx_new_ssrc_pad_cb (GstElement * element, guint ssrc,
+ GstPad * rtp_pad, SimulCtx * ctx)
+{
+ GstPad *rtcp_pad;
+ gchar *name;
+
+ gst_harness_add_element_src_pad (ctx->rtp_h, rtp_pad);
+
+ name = g_strdup_printf ("rtcp_src_%u", ssrc);
+ rtcp_pad = gst_element_get_static_pad (element, name);
+ gst_harness_add_element_src_pad (ctx->rtcp_h, rtcp_pad);
+ gst_object_unref (rtcp_pad);
+ g_free (name);
+}
+
+static gpointer
+_simul_ctx_push_rtp_buffers (gpointer user_data)
+{
+ SimulCtx *ctx = user_data;
+
+ gst_harness_set_src_caps_str (ctx->rtp_h, "application/x-rtp");
+ gst_harness_push (ctx->rtp_h, create_buffer (0, 1111));
+ return NULL;
+}
+
+static gpointer
+_simul_ctx_push_rtcp_buffers (gpointer user_data)
+{
+ SimulCtx *ctx = user_data;
+
+ g_usleep (10);
+ gst_harness_set_src_caps_str (ctx->rtcp_h, "application/x-rtcp");
+ gst_harness_push (ctx->rtcp_h, generate_rtcp_sr_buffer (1111));
+ return NULL;
+}
+
+GST_START_TEST (test_rtp_and_rtcp_arrives_simultaneously)
+{
+ guint r;
+ guint repeats = 1000;
+ if (RUNNING_ON_VALGRIND)
+ repeats = 2;
+
+ for (r = 0; r < repeats; r++) {
+ SimulCtx ctx;
+ GThread *t0, *t1;
+
+ ctx.rtp_h = gst_harness_new_with_padnames ("rtpssrcdemux", "sink", NULL);
+ ctx.rtcp_h =
+ gst_harness_new_with_element (ctx.rtp_h->element, "rtcp_sink", NULL);
+
+ g_signal_connect (ctx.rtp_h->element,
+ "new-ssrc-pad", (GCallback) _simul_ctx_new_ssrc_pad_cb, &ctx);