mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-20 23:36:38 +00:00
playbin: Don't change the state of sinks that we passed to playsink already
This commit is contained in:
parent
c725591010
commit
841d738f7c
1 changed files with 40 additions and 12 deletions
|
@ -1294,6 +1294,19 @@ init_group (GstPlayBin * playbin, GstSourceGroup * group)
|
||||||
group->combiner[PLAYBIN_STREAM_TEXT].channels = group->text_channels;
|
group->combiner[PLAYBIN_STREAM_TEXT].channels = group->text_channels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_playsink_sink (GstPlayBin * playbin, GstElement * sink, GstPlaySinkType type)
|
||||||
|
{
|
||||||
|
GstElement *tmp;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
|
tmp = gst_play_sink_get_sink (playbin->playsink, type);
|
||||||
|
ret = (tmp == sink);
|
||||||
|
if (tmp)
|
||||||
|
gst_object_unref (tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_group (GstPlayBin * playbin, GstSourceGroup * group)
|
free_group (GstPlayBin * playbin, GstSourceGroup * group)
|
||||||
{
|
{
|
||||||
|
@ -1305,13 +1318,15 @@ free_group (GstPlayBin * playbin, GstSourceGroup * group)
|
||||||
|
|
||||||
g_mutex_clear (&group->lock);
|
g_mutex_clear (&group->lock);
|
||||||
if (group->audio_sink) {
|
if (group->audio_sink) {
|
||||||
if (group->audio_sink != playbin->audio_sink)
|
if (!is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO))
|
||||||
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->audio_sink);
|
gst_object_unref (group->audio_sink);
|
||||||
}
|
}
|
||||||
group->audio_sink = NULL;
|
group->audio_sink = NULL;
|
||||||
if (group->video_sink) {
|
if (group->video_sink) {
|
||||||
if (group->video_sink != playbin->video_sink)
|
if (!is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))
|
||||||
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->video_sink);
|
gst_object_unref (group->video_sink);
|
||||||
}
|
}
|
||||||
|
@ -3412,6 +3427,7 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GST_SOURCE_GROUP_UNLOCK (group);
|
GST_SOURCE_GROUP_UNLOCK (group);
|
||||||
|
gst_play_sink_reconfigure (playbin->playsink);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_PLAY_BIN_SHUTDOWN_UNLOCK (playbin);
|
GST_PLAY_BIN_SHUTDOWN_UNLOCK (playbin);
|
||||||
|
@ -4267,8 +4283,11 @@ autoplug_select_cb (GstElement * decodebin, GstPad * pad,
|
||||||
* sink or if we have a fixed sink, try the decoder. We will fail later
|
* sink or if we have a fixed sink, try the decoder. We will fail later
|
||||||
* anyway */
|
* anyway */
|
||||||
gst_object_unref (sinkpad);
|
gst_object_unref (sinkpad);
|
||||||
if ((isaudiodec && group->audio_sink != playbin->audio_sink) ||
|
if ((isaudiodec
|
||||||
(isvideodec && group->video_sink != playbin->video_sink)) {
|
&& is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO)) || (isvideodec
|
||||||
|
&& is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))) {
|
||||||
gst_element_set_state (*sinkp, GST_STATE_NULL);
|
gst_element_set_state (*sinkp, GST_STATE_NULL);
|
||||||
gst_object_unref (*sinkp);
|
gst_object_unref (*sinkp);
|
||||||
*sinkp = NULL;
|
*sinkp = NULL;
|
||||||
|
@ -4316,8 +4335,11 @@ autoplug_select_cb (GstElement * decodebin, GstPad * pad,
|
||||||
|
|
||||||
/* If it is not compatible, either continue with the next possible
|
/* If it is not compatible, either continue with the next possible
|
||||||
* sink or if we have a fixed sink, skip the decoder */
|
* sink or if we have a fixed sink, skip the decoder */
|
||||||
if ((isaudiodec && group->audio_sink != playbin->audio_sink) ||
|
if ((isaudiodec
|
||||||
(isvideodec && group->video_sink != playbin->video_sink)) {
|
&& is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO)) || (isvideodec
|
||||||
|
&& is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))) {
|
||||||
gst_element_set_state (*sinkp, GST_STATE_NULL);
|
gst_element_set_state (*sinkp, GST_STATE_NULL);
|
||||||
gst_object_unref (*sinkp);
|
gst_object_unref (*sinkp);
|
||||||
*sinkp = NULL;
|
*sinkp = NULL;
|
||||||
|
@ -4949,14 +4971,16 @@ no_decodebin:
|
||||||
/* delete any custom sinks we might have */
|
/* delete any custom sinks we might have */
|
||||||
if (group->audio_sink) {
|
if (group->audio_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->audio_sink != playbin->audio_sink)
|
if (!is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO))
|
||||||
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->audio_sink);
|
gst_object_unref (group->audio_sink);
|
||||||
}
|
}
|
||||||
group->audio_sink = NULL;
|
group->audio_sink = NULL;
|
||||||
if (group->video_sink) {
|
if (group->video_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->video_sink != playbin->video_sink)
|
if (!is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))
|
||||||
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->video_sink);
|
gst_object_unref (group->video_sink);
|
||||||
}
|
}
|
||||||
|
@ -4977,14 +5001,16 @@ uridecodebin_failure:
|
||||||
/* delete any custom sinks we might have */
|
/* delete any custom sinks we might have */
|
||||||
if (group->audio_sink) {
|
if (group->audio_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->audio_sink != playbin->audio_sink)
|
if (!is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO))
|
||||||
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->audio_sink);
|
gst_object_unref (group->audio_sink);
|
||||||
}
|
}
|
||||||
group->audio_sink = NULL;
|
group->audio_sink = NULL;
|
||||||
if (group->video_sink) {
|
if (group->video_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->video_sink != playbin->video_sink)
|
if (!is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))
|
||||||
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->video_sink);
|
gst_object_unref (group->video_sink);
|
||||||
}
|
}
|
||||||
|
@ -5051,14 +5077,16 @@ deactivate_group (GstPlayBin * playbin, GstSourceGroup * group)
|
||||||
/* delete any custom sinks we might have */
|
/* delete any custom sinks we might have */
|
||||||
if (group->audio_sink) {
|
if (group->audio_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->audio_sink != playbin->audio_sink)
|
if (!is_playsink_sink (playbin, group->audio_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_AUDIO))
|
||||||
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
gst_element_set_state (group->audio_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->audio_sink);
|
gst_object_unref (group->audio_sink);
|
||||||
}
|
}
|
||||||
group->audio_sink = NULL;
|
group->audio_sink = NULL;
|
||||||
if (group->video_sink) {
|
if (group->video_sink) {
|
||||||
/* If this is a automatically created sink set it to NULL */
|
/* If this is a automatically created sink set it to NULL */
|
||||||
if (group->video_sink != playbin->video_sink)
|
if (!is_playsink_sink (playbin, group->video_sink,
|
||||||
|
GST_PLAY_SINK_TYPE_VIDEO))
|
||||||
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
gst_element_set_state (group->video_sink, GST_STATE_NULL);
|
||||||
gst_object_unref (group->video_sink);
|
gst_object_unref (group->video_sink);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue