rtpulpfecdec: don't use __builtin_ctzll unconditionally

Fixes build with MSVC, and possibly other compilers too.
diff --git a/gst/rtp/gstrtpulpfecdec.c b/gst/rtp/gstrtpulpfecdec.c
index aec7538..9c362bd 100644
--- a/gst/rtp/gstrtpulpfecdec.c
+++ b/gst/rtp/gstrtpulpfecdec.c
@@ -276,6 +276,30 @@
   return gst_buffer_ref (info->rtp.buffer);
 }
 
+/* __has_builtin only works with clang, so test compiler version for gcc */
+/* Intel compiler and MSVC probably have their own things as well */
+#if defined(__has_builtin) && __has_builtin(__builtin_ctzll)
+#define rtp_ulpfec_ctz64 __builtin_ctzll
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#define rtp_ulpfec_ctz64 __builtin_ctzll
+#else
+static inline gint
+rtp_ulpfec_ctz64_inline (guint64 mask)
+{
+  gint nth_bit = 0;
+
+  do {
+    if ((mask & 1))
+      return nth_bit;
+    mask = mask >> 1;
+  } while (++nth_bit < 64);
+
+  return -1;                    /* should not be reached, since mask must not be 0 */
+}
+
+#define rtp_ulpfec_ctz64 rtp_ulpfec_ctz64_inline
+#endif
+
 static GstBuffer *
 gst_rtp_ulpfec_dec_recover (GstRtpUlpFecDec * self, guint32 ssrc, gint media_pt,
     guint8 * dst_pt, guint16 * dst_seq)
@@ -308,7 +332,7 @@
 
     /* Do we have any 1s? Checking if current FEC packet can be used for recovery */
     if (0 != missing_packets_mask) {
-      guint trailing_zeros = __builtin_ctzll (missing_packets_mask);
+      guint trailing_zeros = rtp_ulpfec_ctz64 (missing_packets_mask);
 
       /* Is it the only 1 in the mask? Checking if we lacking single packet in
        * that case FEC packet can be used for recovery */
@@ -620,4 +644,7 @@
 
   g_object_class_install_properties (gobject_class, N_PROPERTIES,
       klass_properties);
+
+  g_assert (rtp_ulpfec_ctz64 (G_GUINT64_CONSTANT (0x1)) == 0);
+  g_assert (rtp_ulpfec_ctz64 (G_GUINT64_CONSTANT (0x8000000000000000)) == 63);
 }