mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
gst/playback/gstdecodebin2.c: Protect caps property with the object lock.
Original commit message from CVS: * gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose), (gst_decode_bin_set_caps), (gst_decode_bin_get_caps), (gst_decode_bin_set_subs_encoding), (gst_decode_bin_get_subs_encoding), (gst_decode_bin_autoplug_factories), (connect_pad), (are_raw_caps), (deactivate_free_recursive): Protect caps property with the object lock. Protect encoding property with the object lock. Keep list of elements we added that have the subtitle-encoding property. Distribute the subtitle-encoding to all of the elements when it changes.
This commit is contained in:
parent
877a45b791
commit
8eb84372bd
2 changed files with 68 additions and 26 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
2008-03-24 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose),
|
||||||
|
(gst_decode_bin_set_caps), (gst_decode_bin_get_caps),
|
||||||
|
(gst_decode_bin_set_subs_encoding),
|
||||||
|
(gst_decode_bin_get_subs_encoding),
|
||||||
|
(gst_decode_bin_autoplug_factories), (connect_pad), (are_raw_caps),
|
||||||
|
(deactivate_free_recursive):
|
||||||
|
Protect caps property with the object lock.
|
||||||
|
Protect encoding property with the object lock.
|
||||||
|
Keep list of elements we added that have the subtitle-encoding property.
|
||||||
|
Distribute the subtitle-encoding to all of the elements when it
|
||||||
|
changes.
|
||||||
|
|
||||||
2008-03-24 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-03-24 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_release):
|
* gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_release):
|
||||||
|
|
|
@ -100,6 +100,7 @@ struct _GstDecodeBin
|
||||||
gint nbpads; /* unique identifier for source pads */
|
gint nbpads; /* unique identifier for source pads */
|
||||||
|
|
||||||
GValueArray *factories; /* factories we can use for selecting elements */
|
GValueArray *factories; /* factories we can use for selecting elements */
|
||||||
|
GList *subtitles; /* List of elements with subtitle-encoding */
|
||||||
|
|
||||||
gboolean have_type; /* if we received the have_type signal */
|
gboolean have_type; /* if we received the have_type signal */
|
||||||
guint have_type_id; /* signal id for have-type from typefind */
|
guint have_type_id; /* signal id for have-type from typefind */
|
||||||
|
@ -654,6 +655,9 @@ gst_decode_bin_dispose (GObject * object)
|
||||||
|
|
||||||
remove_fakesink (decode_bin);
|
remove_fakesink (decode_bin);
|
||||||
|
|
||||||
|
g_list_free (decode_bin->subtitles);
|
||||||
|
decode_bin->subtitles = NULL;
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -685,13 +689,13 @@ gst_decode_bin_set_caps (GstDecodeBin * dbin, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (dbin, "Setting new caps: %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (dbin, "Setting new caps: %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
DECODE_BIN_LOCK (dbin);
|
GST_OBJECT_LOCK (dbin);
|
||||||
if (dbin->caps)
|
if (dbin->caps)
|
||||||
gst_caps_unref (dbin->caps);
|
gst_caps_unref (dbin->caps);
|
||||||
if (caps)
|
if (caps)
|
||||||
gst_caps_ref (caps);
|
gst_caps_ref (caps);
|
||||||
dbin->caps = caps;
|
dbin->caps = caps;
|
||||||
DECODE_BIN_UNLOCK (dbin);
|
GST_OBJECT_UNLOCK (dbin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* _get_caps
|
/* _get_caps
|
||||||
|
@ -708,11 +712,11 @@ gst_decode_bin_get_caps (GstDecodeBin * dbin)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (dbin, "Getting currently set caps");
|
GST_DEBUG_OBJECT (dbin, "Getting currently set caps");
|
||||||
|
|
||||||
DECODE_BIN_LOCK (dbin);
|
GST_OBJECT_LOCK (dbin);
|
||||||
caps = dbin->caps;
|
caps = dbin->caps;
|
||||||
if (caps)
|
if (caps)
|
||||||
gst_caps_ref (caps);
|
gst_caps_ref (caps);
|
||||||
DECODE_BIN_UNLOCK (dbin);
|
GST_OBJECT_UNLOCK (dbin);
|
||||||
|
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
@ -720,11 +724,21 @@ gst_decode_bin_get_caps (GstDecodeBin * dbin)
|
||||||
static void
|
static void
|
||||||
gst_decode_bin_set_subs_encoding (GstDecodeBin * dbin, const gchar * encoding)
|
gst_decode_bin_set_subs_encoding (GstDecodeBin * dbin, const gchar * encoding)
|
||||||
{
|
{
|
||||||
|
GList *walk;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (dbin, "Setting new encoding: %s", GST_STR_NULL (encoding));
|
GST_DEBUG_OBJECT (dbin, "Setting new encoding: %s", GST_STR_NULL (encoding));
|
||||||
|
|
||||||
DECODE_BIN_LOCK (dbin);
|
DECODE_BIN_LOCK (dbin);
|
||||||
|
GST_OBJECT_LOCK (dbin);
|
||||||
g_free (dbin->encoding);
|
g_free (dbin->encoding);
|
||||||
dbin->encoding = g_strdup (encoding);
|
dbin->encoding = g_strdup (encoding);
|
||||||
|
GST_OBJECT_UNLOCK (dbin);
|
||||||
|
|
||||||
|
/* set the subtitle encoding on all added elements */
|
||||||
|
for (walk = dbin->subtitles; walk; walk = g_list_next (walk)) {
|
||||||
|
g_object_set (G_OBJECT (walk->data), "subtitle-encoding", dbin->encoding,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
DECODE_BIN_UNLOCK (dbin);
|
DECODE_BIN_UNLOCK (dbin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -735,9 +749,9 @@ gst_decode_bin_get_subs_encoding (GstDecodeBin * dbin)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (dbin, "Getting currently set encoding");
|
GST_DEBUG_OBJECT (dbin, "Getting currently set encoding");
|
||||||
|
|
||||||
DECODE_BIN_LOCK (dbin);
|
GST_OBJECT_LOCK (dbin);
|
||||||
encoding = g_strdup (dbin->encoding);
|
encoding = g_strdup (dbin->encoding);
|
||||||
DECODE_BIN_UNLOCK (dbin);
|
GST_OBJECT_UNLOCK (dbin);
|
||||||
|
|
||||||
return encoding;
|
return encoding;
|
||||||
}
|
}
|
||||||
|
@ -784,9 +798,6 @@ gst_decode_bin_get_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static GValueArray *find_compatibles (GstDecodeBin * decode_bin,
|
|
||||||
GstPad * pad, const GstCaps * caps);
|
|
||||||
|
|
||||||
/*****
|
/*****
|
||||||
* Default autoplug signal handlers
|
* Default autoplug signal handlers
|
||||||
*****/
|
*****/
|
||||||
|
@ -806,8 +817,11 @@ gst_decode_bin_autoplug_factories (GstElement * element, GstPad * pad,
|
||||||
{
|
{
|
||||||
GValueArray *result;
|
GValueArray *result;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (element, "finding factories");
|
||||||
|
|
||||||
/* return all compatible factories for caps */
|
/* return all compatible factories for caps */
|
||||||
result = find_compatibles (GST_DECODE_BIN (element), pad, caps);
|
result =
|
||||||
|
gst_factory_list_filter (GST_DECODE_BIN_CAST (element)->factories, caps);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (element, "autoplug-factories returns %p", result);
|
GST_DEBUG_OBJECT (element, "autoplug-factories returns %p", result);
|
||||||
|
|
||||||
|
@ -1047,6 +1061,7 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad,
|
||||||
GstElementFactory *factory;
|
GstElementFactory *factory;
|
||||||
GstElement *element;
|
GstElement *element;
|
||||||
GstPad *sinkpad;
|
GstPad *sinkpad;
|
||||||
|
gboolean subtitle;
|
||||||
|
|
||||||
/* take first factory */
|
/* take first factory */
|
||||||
factory = g_value_get_object (g_value_array_get_nth (factories, 0));
|
factory = g_value_get_object (g_value_array_get_nth (factories, 0));
|
||||||
|
@ -1126,6 +1141,17 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad,
|
||||||
/* link this element further */
|
/* link this element further */
|
||||||
connect_element (dbin, element, group);
|
connect_element (dbin, element, group);
|
||||||
|
|
||||||
|
/* try to configure the subtitle encoding property when we can */
|
||||||
|
if (g_object_class_find_property (G_OBJECT_GET_CLASS (element),
|
||||||
|
"subtitle-encoding")) {
|
||||||
|
GST_DEBUG_OBJECT (dbin,
|
||||||
|
"setting subtitle-encoding=%s to element", dbin->encoding);
|
||||||
|
g_object_set (G_OBJECT (element), "subtitle-encoding", dbin->encoding,
|
||||||
|
NULL);
|
||||||
|
subtitle = TRUE;
|
||||||
|
} else
|
||||||
|
subtitle = FALSE;
|
||||||
|
|
||||||
/* Bring the element to the state of the parent */
|
/* Bring the element to the state of the parent */
|
||||||
if ((gst_element_set_state (element,
|
if ((gst_element_set_state (element,
|
||||||
GST_STATE_PAUSED)) == GST_STATE_CHANGE_FAILURE) {
|
GST_STATE_PAUSED)) == GST_STATE_CHANGE_FAILURE) {
|
||||||
|
@ -1135,6 +1161,13 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstPad * pad,
|
||||||
gst_bin_remove (GST_BIN (dbin), element);
|
gst_bin_remove (GST_BIN (dbin), element);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (subtitle) {
|
||||||
|
DECODE_BIN_LOCK (dbin);
|
||||||
|
/* we added the element now, add it to the list of subtitle-encoding
|
||||||
|
* elements when we can set the property */
|
||||||
|
dbin->subtitles = g_list_prepend (dbin->subtitles, element);
|
||||||
|
DECODE_BIN_UNLOCK (dbin);
|
||||||
|
}
|
||||||
|
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -1453,21 +1486,6 @@ caps_notify_group_cb (GstPad * pad, GParamSpec * unused, GstDecodeGroup * group)
|
||||||
gst_object_unref (element);
|
gst_object_unref (element);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this function runs through the element factories and returns a value array of
|
|
||||||
* all elements that are able to sink the given caps
|
|
||||||
*/
|
|
||||||
static GValueArray *
|
|
||||||
find_compatibles (GstDecodeBin * decode_bin, GstPad * pad, const GstCaps * caps)
|
|
||||||
{
|
|
||||||
GValueArray *result;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (decode_bin, "finding factories");
|
|
||||||
|
|
||||||
result = gst_factory_list_filter (decode_bin->factories, caps);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decide whether an element is a demuxer based on the
|
/* Decide whether an element is a demuxer based on the
|
||||||
* klass and number/type of src pad templates it has */
|
* klass and number/type of src pad templates it has */
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1531,7 +1549,10 @@ are_raw_caps (GstDecodeBin * dbin, GstCaps * caps)
|
||||||
|
|
||||||
GST_LOG_OBJECT (dbin, "Checking with caps %" GST_PTR_FORMAT, caps);
|
GST_LOG_OBJECT (dbin, "Checking with caps %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
|
/* lock for getting the caps */
|
||||||
|
GST_OBJECT_LOCK (dbin);
|
||||||
intersection = gst_caps_intersect (dbin->caps, caps);
|
intersection = gst_caps_intersect (dbin->caps, caps);
|
||||||
|
GST_OBJECT_UNLOCK (dbin);
|
||||||
|
|
||||||
res = (!(gst_caps_is_empty (intersection)));
|
res = (!(gst_caps_is_empty (intersection)));
|
||||||
|
|
||||||
|
@ -2059,6 +2080,9 @@ deactivate_free_recursive (GstDecodeGroup * group, GstElement * element)
|
||||||
GstIterator *it;
|
GstIterator *it;
|
||||||
GstIteratorResult res;
|
GstIteratorResult res;
|
||||||
gpointer point;
|
gpointer point;
|
||||||
|
GstDecodeBin *dbin;
|
||||||
|
|
||||||
|
dbin = group->dbin;
|
||||||
|
|
||||||
GST_LOG ("element:%s", GST_ELEMENT_NAME (element));
|
GST_LOG ("element:%s", GST_ELEMENT_NAME (element));
|
||||||
|
|
||||||
|
@ -2106,7 +2130,11 @@ restart:
|
||||||
|
|
||||||
done:
|
done:
|
||||||
gst_element_set_state (element, GST_STATE_NULL);
|
gst_element_set_state (element, GST_STATE_NULL);
|
||||||
gst_bin_remove (GST_BIN (group->dbin), element);
|
DECODE_BIN_LOCK (dbin);
|
||||||
|
/* remove possible subtitle element */
|
||||||
|
dbin->subtitles = g_list_remove (dbin->subtitles, element);
|
||||||
|
DECODE_BIN_UNLOCK (dbin);
|
||||||
|
gst_bin_remove (GST_BIN (dbin), element);
|
||||||
|
|
||||||
beach:
|
beach:
|
||||||
gst_iterator_free (it);
|
gst_iterator_free (it);
|
||||||
|
|
Loading…
Reference in a new issue