diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index 7f39155..489fff3 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -1432,6 +1432,8 @@ rtp_session_process_rtp (RTPSession * sess, GstBuffer * buffer,
   gboolean created;
   gboolean prevsender, prevactive;
   RTPArrivalStats arrival;
+  GList *csrc_list = NULL ;
+  guint8 i, count ;
 
   g_return_val_if_fail (RTP_IS_SESSION (sess), GST_FLOW_ERROR);
   g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
@@ -1457,8 +1459,14 @@ rtp_session_process_rtp (RTPSession * sess, GstBuffer * buffer,
   prevsender = RTP_SOURCE_IS_SENDER (source);
   prevactive = RTP_SOURCE_IS_ACTIVE (source);
 
-  /* we need to ref so that we can process the CSRCs later */
-  gst_buffer_ref (buffer);
+  /* List available csrc */
+  count = gst_rtp_buffer_get_csrc_count (buffer);
+
+  for (i = 0; i < count; i++) {
+    guint32 csrc;
+    csrc = gst_rtp_buffer_get_csrc (buffer, i);
+    csrc_list = g_list_prepend(csrc_list, GUINT_TO_POINTER(csrc)) ;
+  }
 
   /* let source process the packet */
   result = rtp_source_process_rtp (source, buffer, &arrival);
@@ -1480,35 +1488,36 @@ rtp_session_process_rtp (RTPSession * sess, GstBuffer * buffer,
     on_new_ssrc (sess, source);
 
   if (source->validated) {
-    guint8 i, count;
     gboolean created;
-
+    guint32 csrc;
+    GList *csrc_item ;
     /* for validated sources, we add the CSRCs as well */
-    count = gst_rtp_buffer_get_csrc_count (buffer);
-
-    for (i = 0; i < count; i++) {
-      guint32 csrc;
-      RTPSource *csrc_src;
-
-      csrc = gst_rtp_buffer_get_csrc (buffer, i);
-
-      /* get source */
-      csrc_src = obtain_source (sess, csrc, &created, &arrival, TRUE);
-      if (!csrc_src)
-        continue;
-
-      if (created) {
-        GST_DEBUG ("created new CSRC: %08x", csrc);
-        rtp_source_set_as_csrc (csrc_src);
-        if (RTP_SOURCE_IS_ACTIVE (csrc_src))
-          sess->stats.active_sources++;
-        on_new_ssrc (sess, csrc_src);
+    csrc_item = g_list_first(csrc_list) ;
+    while (csrc_item)
+      {
+	RTPSource *csrc_src;
+	csrc = GPOINTER_TO_UINT(csrc_item->data) ;
+	/* get source */
+	csrc_src = obtain_source (sess, csrc, &created, &arrival, TRUE);
+	if (!csrc_src)
+	  {
+	    csrc_item = g_list_next(csrc_item) ;	    
+	    continue;
+	  }
+	
+	if (created) {
+	  GST_DEBUG ("created new CSRC: %08x", csrc);
+	  rtp_source_set_as_csrc (csrc_src);
+	  if (RTP_SOURCE_IS_ACTIVE (csrc_src))
+	    sess->stats.active_sources++;
+	  on_new_ssrc (sess, csrc_src);
+	}
+	g_object_unref (csrc_src);
+	csrc_item = g_list_next(csrc_item) ;
       }
-      g_object_unref (csrc_src);
-    }
   }
   g_object_unref (source);
-  gst_buffer_unref (buffer);
+  g_list_free(csrc_list) ;
 
   RTP_SESSION_UNLOCK (sess);
 
