mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
gst/playback/gstplaybasebin.*: Make the subtitle detection work from any thread so we don't deadlock. Fixes #343397.
Original commit message from CVS: * gst/playback/gstplaybasebin.c: (group_create), (group_commit), (setup_source): * gst/playback/gstplaybasebin.h: Make the subtitle detection work from any thread so we don't deadlock. Fixes #343397.
This commit is contained in:
parent
81b007feef
commit
571ba11a3b
3 changed files with 58 additions and 25 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2006-06-02 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/playback/gstplaybasebin.c: (group_create), (group_commit),
|
||||||
|
(setup_source):
|
||||||
|
* gst/playback/gstplaybasebin.h:
|
||||||
|
Make the subtitle detection work from any thread so we don't
|
||||||
|
deadlock. Fixes #343397.
|
||||||
|
|
||||||
2006-06-02 Thomas Vander Stichele <thomas at apestaart dot org>
|
2006-06-02 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* gst/volume/Makefile.am:
|
* gst/volume/Makefile.am:
|
||||||
|
|
|
@ -271,6 +271,8 @@ group_create (GstPlayBaseBin * play_base_bin)
|
||||||
group->bin = play_base_bin;
|
group->bin = play_base_bin;
|
||||||
group->streaminfo_value_array = g_value_array_new (0);
|
group->streaminfo_value_array = g_value_array_new (0);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (play_base_bin, "created new group %p", group);
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,6 +402,9 @@ group_commit (GstPlayBaseBin * play_base_bin, gboolean fatal, gboolean subtitle)
|
||||||
group = play_base_bin->building_group;
|
group = play_base_bin->building_group;
|
||||||
had_active_group = (get_active_group (play_base_bin) != NULL);
|
had_active_group = (get_active_group (play_base_bin) != NULL);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (play_base_bin, "commit group %p, had active %d",
|
||||||
|
group, had_active_group);
|
||||||
|
|
||||||
/* if an element signalled a no-more-pads after we stopped due
|
/* if an element signalled a no-more-pads after we stopped due
|
||||||
* to preroll, the group is NULL. This is not an error */
|
* to preroll, the group is NULL. This is not an error */
|
||||||
if (group == NULL) {
|
if (group == NULL) {
|
||||||
|
@ -407,40 +412,49 @@ group_commit (GstPlayBaseBin * play_base_bin, gboolean fatal, gboolean subtitle)
|
||||||
GROUP_UNLOCK (play_base_bin);
|
GROUP_UNLOCK (play_base_bin);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG ("Group loading failed, bailing out");
|
GST_DEBUG_OBJECT (play_base_bin, "Group loading failed, bailing out");
|
||||||
}
|
}
|
||||||
} else if (!subtitle) {
|
} else {
|
||||||
gint n;
|
if (!subtitle) {
|
||||||
|
gint n;
|
||||||
|
|
||||||
GST_DEBUG ("group %p done", group);
|
GST_DEBUG_OBJECT (play_base_bin, "group %p done", group);
|
||||||
|
|
||||||
play_base_bin->queued_groups = g_list_append (play_base_bin->queued_groups,
|
play_base_bin->queued_groups =
|
||||||
group);
|
g_list_append (play_base_bin->queued_groups, group);
|
||||||
|
|
||||||
play_base_bin->building_group = NULL;
|
play_base_bin->building_group = NULL;
|
||||||
|
|
||||||
/* remove signals. We don't want anymore signals from the preroll
|
/* remove signals. We don't want anymore signals from the preroll
|
||||||
* elements at this stage. */
|
* elements at this stage. */
|
||||||
for (n = 0; n < NUM_TYPES; n++) {
|
for (n = 0; n < NUM_TYPES; n++) {
|
||||||
GstElement *element = group->type[n].preroll;
|
GstElement *element = group->type[n].preroll;
|
||||||
guint sig_id;
|
guint sig_id;
|
||||||
|
|
||||||
if (!element)
|
if (!element)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sig_id =
|
sig_id =
|
||||||
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (element), "signal_id"));
|
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (element),
|
||||||
|
"signal_id"));
|
||||||
|
|
||||||
if (sig_id) {
|
if (sig_id) {
|
||||||
GST_LOG ("removing preroll signal %s", GST_ELEMENT_NAME (element));
|
GST_LOG_OBJECT (play_base_bin, "removing preroll signal %s",
|
||||||
g_signal_handler_disconnect (G_OBJECT (element), sig_id);
|
GST_ELEMENT_NAME (element));
|
||||||
|
g_signal_handler_disconnect (G_OBJECT (element), sig_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
/* this is a special subtitle bin, we don't commit the group but
|
||||||
|
* mark the subtitles as detected before se signal. */
|
||||||
|
GST_DEBUG_OBJECT (play_base_bin, "marking subtitle bin as complete");
|
||||||
|
play_base_bin->subtitle_done = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG ("signal group done");
|
GST_DEBUG_OBJECT (play_base_bin, "signal group done");
|
||||||
GROUP_SIGNAL (play_base_bin);
|
GROUP_SIGNAL (play_base_bin);
|
||||||
GST_DEBUG ("signaled group done");
|
GST_DEBUG_OBJECT (play_base_bin, "signaled group done");
|
||||||
|
|
||||||
if (!subtitle && !had_active_group) {
|
if (!subtitle && !had_active_group) {
|
||||||
if (!prepare_output (play_base_bin)) {
|
if (!prepare_output (play_base_bin)) {
|
||||||
|
@ -449,10 +463,10 @@ group_commit (GstPlayBaseBin * play_base_bin, gboolean fatal, gboolean subtitle)
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_substreams (play_base_bin);
|
setup_substreams (play_base_bin);
|
||||||
GST_DEBUG ("Emitting signal");
|
GST_DEBUG_OBJECT (play_base_bin, "Emitting signal");
|
||||||
res = GST_PLAY_BASE_BIN_GET_CLASS (play_base_bin)->
|
res = GST_PLAY_BASE_BIN_GET_CLASS (play_base_bin)->
|
||||||
setup_output_pads (play_base_bin, group);
|
setup_output_pads (play_base_bin, group);
|
||||||
GST_DEBUG ("done");
|
GST_DEBUG_OBJECT (play_base_bin, "done");
|
||||||
|
|
||||||
GROUP_UNLOCK (play_base_bin);
|
GROUP_UNLOCK (play_base_bin);
|
||||||
|
|
||||||
|
@ -1346,6 +1360,8 @@ setup_source (GstPlayBaseBin * play_base_bin, gchar ** new_location)
|
||||||
if (!play_base_bin->need_rebuild)
|
if (!play_base_bin->need_rebuild)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (play_base_bin, "setup source");
|
||||||
|
|
||||||
/* delete old src */
|
/* delete old src */
|
||||||
if (play_base_bin->source) {
|
if (play_base_bin->source) {
|
||||||
GST_DEBUG_OBJECT (play_base_bin, "removing old src element");
|
GST_DEBUG_OBJECT (play_base_bin, "removing old src element");
|
||||||
|
@ -1394,12 +1410,20 @@ setup_source (GstPlayBaseBin * play_base_bin, gchar ** new_location)
|
||||||
* has no more dynamic streams, the cond is unlocked. We can remove
|
* has no more dynamic streams, the cond is unlocked. We can remove
|
||||||
* the signal handlers then
|
* the signal handlers then
|
||||||
*/
|
*/
|
||||||
|
GST_DEBUG_OBJECT (play_base_bin, "starting subtitle bin");
|
||||||
|
|
||||||
|
/* for subtitles in a separate bin we will not commit the
|
||||||
|
* current building group since we need to add the other
|
||||||
|
* audio/video streams to the group. We check if we managed
|
||||||
|
* to commit the subtitle group using an extra flag. */
|
||||||
|
play_base_bin->subtitle_done = FALSE;
|
||||||
|
|
||||||
gst_element_set_state (subbin, GST_STATE_PAUSED);
|
gst_element_set_state (subbin, GST_STATE_PAUSED);
|
||||||
|
|
||||||
GROUP_LOCK (play_base_bin);
|
GROUP_LOCK (play_base_bin);
|
||||||
GST_DEBUG ("waiting for first group...");
|
GST_DEBUG ("waiting for subtitle to complete...");
|
||||||
GROUP_WAIT (play_base_bin);
|
while (!play_base_bin->subtitle_done)
|
||||||
|
GROUP_WAIT (play_base_bin);
|
||||||
GST_DEBUG ("group done !");
|
GST_DEBUG ("group done !");
|
||||||
GROUP_UNLOCK (play_base_bin);
|
GROUP_UNLOCK (play_base_bin);
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,7 @@ struct _GstPlayBaseBin {
|
||||||
GstElement *source;
|
GstElement *source;
|
||||||
GstElement *decoder;
|
GstElement *decoder;
|
||||||
GstElement *subtitle; /* additional filesrc ! subparse bin */
|
GstElement *subtitle; /* additional filesrc ! subparse bin */
|
||||||
|
gboolean subtitle_done;
|
||||||
GSList *subtitle_elements; /* subtitle elements that have 'subtitle-encoding' property */
|
GSList *subtitle_elements; /* subtitle elements that have 'subtitle-encoding' property */
|
||||||
gchar *subencoding; /* encoding to propagate to the above subtitle elements */
|
gchar *subencoding; /* encoding to propagate to the above subtitle elements */
|
||||||
gboolean need_rebuild;
|
gboolean need_rebuild;
|
||||||
|
|
Loading…
Reference in a new issue