static gboolean default_query_position (GstRTSPMedia * media,
gint64 * position);
static gboolean default_query_stop (GstRTSPMedia * media, gint64 * stop);
+static GstElement *default_create_rtpbin (GstRTSPMedia * media);
static gboolean wait_preroll (GstRTSPMedia * media);
klass->convert_range = default_convert_range;
klass->query_position = default_query_position;
klass->query_stop = default_query_stop;
+ klass->create_rtpbin = default_create_rtpbin;
}
static void
return res;
}
+static GstElement *
+default_create_rtpbin (GstRTSPMedia * media)
+{
+ GstElement *rtpbin;
+
+ rtpbin = gst_element_factory_make ("rtpbin", NULL);
+
+ return rtpbin;
+}
+
/* must be called with state lock */
static void
collect_media_stats (GstRTSPMedia * media)
GstRTSPMediaPrivate *priv;
GstBus *bus;
GSource *source;
+ GstRTSPMediaClass *klass;
g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), FALSE);
g_return_val_if_fail (GST_IS_RTSP_THREAD (thread), FALSE);
if (!priv->reusable && priv->reused)
goto is_reused;
- priv->rtpbin = gst_element_factory_make ("rtpbin", NULL);
+ klass = GST_RTSP_MEDIA_GET_CLASS (media);
+
+ if (!klass->create_rtpbin)
+ goto no_create_rtpbin;
+
+ priv->rtpbin = klass->create_rtpbin (media);
if (priv->rtpbin != NULL) {
- GstRTSPMediaClass *klass;
gboolean success = TRUE;
- klass = GST_RTSP_MEDIA_GET_CLASS (media);
if (klass->setup_rtpbin)
success = klass->setup_rtpbin (media, priv->rtpbin);
GST_WARNING ("can not reuse media %p", media);
return FALSE;
}
+no_create_rtpbin:
+ {
+ priv->prepare_count--;
+ g_rec_mutex_unlock (&priv->state_lock);
+ GST_ERROR ("no create_rtpbin function");
+ g_critical ("no create_rtpbin vmethod function set");
+ return FALSE;
+ }
no_rtpbin:
{
priv->prepare_count--;