PLAYBIN_STREAM_LAST
};
-static void avelements_list_free (GList * list);
-static GList *avelements_list_create (GstPlayBin * playbin,
+static void avelements_free (gpointer data);
+static GSequence *avelements_create (GstPlayBin * playbin,
gboolean isaudioelement);
/* The GstAudioVideoElement structure holding the audio/video decoder
GstElement *video_sink; /* configured video sink, or NULL */
GstElement *text_sink; /* configured text sink, or NULL */
- GList *aelements; /* a list of GstAVElements for audio stream */
- GList *velements; /* a list of GstAVElements for video stream */
+ GSequence *aelements; /* a list of GstAVElements for audio stream */
+ GSequence *velements; /* a list of GstAVElements for video stream */
struct
{
if (!playbin->aelements || playbin->elements_cookie != cookie) {
if (playbin->aelements)
- avelements_list_free (playbin->aelements);
- playbin->aelements = avelements_list_create (playbin, TRUE);
+ g_sequence_free (playbin->aelements);
+ playbin->aelements = avelements_create (playbin, TRUE);
}
if (!playbin->velements || playbin->elements_cookie != cookie) {
if (playbin->velements)
- avelements_list_free (playbin->velements);
- playbin->velements = avelements_list_create (playbin, FALSE);
-
+ g_sequence_free (playbin->velements);
+ playbin->velements = avelements_create (playbin, FALSE);
}
playbin->elements_cookie = cookie;
gst_plugin_feature_list_free (playbin->elements);
if (playbin->aelements)
- avelements_list_free (playbin->aelements);
+ g_sequence_free (playbin->aelements);
if (playbin->velements)
- avelements_list_free (playbin->velements);
+ g_sequence_free (playbin->velements);
g_rec_mutex_clear (&playbin->lock);
g_mutex_clear (&playbin->dyn_lock);
}
static void
-avelements_list_free (GList * list)
+avelements_free (gpointer avelement)
{
- GList *l;
- GstAVElement *elm;
-
- for (l = list; l; l = l->next) {
- elm = (GstAVElement *) l->data;
- if (elm->dec)
- gst_object_unref (elm->dec);
- if (elm->sink)
- gst_object_unref (elm->sink);
- g_slice_free (GstAVElement, elm);
- }
- g_list_free (list);
+ GstAVElement *elm = (GstAVElement *) avelement;
+
+ if (elm->dec)
+ gst_object_unref (elm->dec);
+ if (elm->sink)
+ gst_object_unref (elm->sink);
+ g_slice_free (GstAVElement, elm);
}
static gint
-avelement_compare (gconstpointer p1, gconstpointer p2)
+avelement_compare (gconstpointer p1, gconstpointer p2, gpointer user_data)
{
GstAVElement *v1, *v2;
GstPluginFeature *fd1, *fd2, *fs1, *fs2;
return n_common_cf;
}
-static GList *
-avelements_list_create (GstPlayBin * playbin, gboolean isaudioelement)
+static GSequence *
+avelements_create (GstPlayBin * playbin, gboolean isaudioelement)
{
GstElementFactory *d_factory, *s_factory;
GList *dec_list, *sink_list, *dl, *sl;
- GList *ave_list = NULL;
+ GSequence *ave_seq = NULL;
GstAVElement *ave;
guint n_common_cf = 0;
dl = dec_list;
sl = sink_list;
+ ave_seq = g_sequence_new ((GDestroyNotify) avelements_free);
+
for (; dl; dl = dl->next) {
d_factory = (GstElementFactory *) dl->data;
for (; sl; sl = sl->next) {
ave->dec = gst_object_ref (d_factory);
ave->sink = gst_object_ref (s_factory);
ave->n_comm_cf = n_common_cf;
- ave_list = g_list_prepend (ave_list, ave);
+ g_sequence_append (ave_seq, ave);
}
sl = sink_list;
}
+ g_sequence_sort (ave_seq, (GCompareDataFunc) avelement_compare, NULL);
gst_plugin_feature_list_free (dec_list);
gst_plugin_feature_list_free (sink_list);
- ave_list = g_list_sort (ave_list, (GCompareFunc) avelement_compare);
-
- return ave_list;
+ return ave_seq;
}
static GList *
-create_decoders_list (GList * factory_list, GList * avelements)
+create_decoders_list (GList * factory_list, GSequence * avelements)
{
GList *dec_list = NULL, *tmp;
+ GSequenceIter *seq_iter = NULL;
GstElementFactory *factory;
GstAVElement *ave;
guint dl_length, dl_count = 0;
- if (!factory_list || !avelements)
- return NULL;
+ g_return_val_if_fail (factory_list != NULL, NULL);
+ g_return_val_if_fail (avelements != NULL, NULL);
dl_length = g_list_length (factory_list);
tmp = factory_list;
for (; tmp; tmp = tmp->next) {
factory = (GstElementFactory *) tmp->data;
- /* if there are parsers, add them first */
+ /* if there are parsers or sink elements, add them first */
if (!gst_element_factory_list_is_type (factory,
GST_ELEMENT_FACTORY_TYPE_DECODER)) {
dec_list = g_list_prepend (dec_list, factory);
}
}
- for (; avelements; avelements = avelements->next) {
- ave = (GstAVElement *) avelements->data;
+ seq_iter = g_sequence_get_begin_iter (avelements);
+ while (!g_sequence_iter_is_end (seq_iter)) {
+ ave = (GstAVElement *) g_sequence_get (seq_iter);
if (g_list_find (factory_list, ave->dec)
&& !g_list_find (dec_list, ave->dec)) {
if (++dl_count == dl_length)
break;
}
+ seq_iter = g_sequence_iter_next (seq_iter);
}
dec_list = g_list_reverse (dec_list);
}
if (isaudiodeclist || isvideodeclist) {
- GList **ave_list;
+ GSequence **ave_list;
if (isaudiodeclist)
ave_list = &playbin->aelements;
else
GstPlaySinkType type;
GstElement **sinkp;
GstAVElement *ave = NULL;
- GList *ave_list = NULL, *tmp = NULL;
+ GSequence *ave_seq = NULL;
+ GSequenceIter *seq_iter;
playbin = group->playbin;
g_mutex_lock (&playbin->elements_lock);
if (isaudiodec) {
- ave_list = playbin->aelements;
+ ave_seq = playbin->aelements;
sinkp = &group->audio_sink;
} else {
- ave_list = playbin->velements;
+ ave_seq = playbin->velements;
sinkp = &group->video_sink;
}
/* if it is a decoder and we don't have a fixed sink, then find out
* the matching audio/video sink from GstAVElements list */
- for (tmp = ave_list; tmp; tmp = tmp->next) {
- ave = (GstAVElement *) tmp->data;
- if (ave->dec != factory)
+ seq_iter = g_sequence_get_begin_iter (ave_seq);
+ while (!g_sequence_iter_is_end (seq_iter)) {
+ ave = (GstAVElement *) g_sequence_get (seq_iter);
+ if (ave->dec != factory) {
+ seq_iter = g_sequence_iter_next (seq_iter);
continue;
+ }
if (((isaudiodec && !group->audio_sink) ||
- (isvideodec && !group->video_sink)) && ave_list) {
+ (isvideodec && !group->video_sink))) {
GST_SOURCE_GROUP_LOCK (group);
if (ave && ave->sink) {
return GST_AUTOPLUG_SELECT_SKIP;
}
}
+ seq_iter = g_sequence_iter_next (seq_iter);
}
g_mutex_unlock (&playbin->elements_lock);
return GST_AUTOPLUG_SELECT_TRY;