mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 17:52:29 +00:00
playsink: Make sure to always block all pads before reconfiguring the pipeline
Fixes bug #678762. Conflicts: gst/playback/gstplaysink.c
This commit is contained in:
parent
7ab77c6b32
commit
78b2fc762b
1 changed files with 24 additions and 45 deletions
|
@ -382,6 +382,8 @@ static void notify_mute_cb (GObject * object, GParamSpec * pspec,
|
||||||
|
|
||||||
static void update_av_offset (GstPlaySink * playsink);
|
static void update_av_offset (GstPlaySink * playsink);
|
||||||
|
|
||||||
|
static gboolean gst_play_sink_do_reconfigure (GstPlaySink * playsink);
|
||||||
|
|
||||||
static GQuark _playsink_reset_segment_event_marker_id = 0;
|
static GQuark _playsink_reset_segment_event_marker_id = 0;
|
||||||
|
|
||||||
/* static guint gst_play_sink_signals[LAST_SIGNAL] = { 0 }; */
|
/* static guint gst_play_sink_signals[LAST_SIGNAL] = { 0 }; */
|
||||||
|
@ -620,7 +622,7 @@ gst_play_sink_class_init (GstPlaySinkClass * klass)
|
||||||
gstbin_klass->handle_message =
|
gstbin_klass->handle_message =
|
||||||
GST_DEBUG_FUNCPTR (gst_play_sink_handle_message);
|
GST_DEBUG_FUNCPTR (gst_play_sink_handle_message);
|
||||||
|
|
||||||
klass->reconfigure = GST_DEBUG_FUNCPTR (gst_play_sink_reconfigure);
|
klass->reconfigure = GST_DEBUG_FUNCPTR (gst_play_sink_do_reconfigure);
|
||||||
klass->convert_sample = GST_DEBUG_FUNCPTR (gst_play_sink_convert_sample);
|
klass->convert_sample = GST_DEBUG_FUNCPTR (gst_play_sink_convert_sample);
|
||||||
|
|
||||||
_playsink_reset_segment_event_marker_id =
|
_playsink_reset_segment_event_marker_id =
|
||||||
|
@ -2930,8 +2932,8 @@ link_failed:
|
||||||
* have to construct the final pipeline. Based on the flags we construct the
|
* have to construct the final pipeline. Based on the flags we construct the
|
||||||
* final output pipelines.
|
* final output pipelines.
|
||||||
*/
|
*/
|
||||||
gboolean
|
static gboolean
|
||||||
gst_play_sink_reconfigure (GstPlaySink * playsink)
|
gst_play_sink_do_reconfigure (GstPlaySink * playsink)
|
||||||
{
|
{
|
||||||
GstPlayFlags flags;
|
GstPlayFlags flags;
|
||||||
gboolean need_audio, need_video, need_deinterlace, need_vis, need_text;
|
gboolean need_audio, need_video, need_deinterlace, need_vis, need_text;
|
||||||
|
@ -3833,6 +3835,20 @@ text_set_blocked (GstPlaySink * playsink, gboolean blocked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_play_sink_reconfigure (GstPlaySink * playsink)
|
||||||
|
{
|
||||||
|
GST_LOG_OBJECT (playsink, "Triggering reconfiguration");
|
||||||
|
|
||||||
|
GST_PLAY_SINK_LOCK (playsink);
|
||||||
|
video_set_blocked (playsink, TRUE);
|
||||||
|
audio_set_blocked (playsink, TRUE);
|
||||||
|
text_set_blocked (playsink, TRUE);
|
||||||
|
GST_PLAY_SINK_UNLOCK (playsink);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info,
|
sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
|
@ -3879,7 +3895,7 @@ sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info,
|
||||||
playsink->audio_pad_raw);
|
playsink->audio_pad_raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_play_sink_reconfigure (playsink);
|
gst_play_sink_do_reconfigure (playsink);
|
||||||
|
|
||||||
video_set_blocked (playsink, FALSE);
|
video_set_blocked (playsink, FALSE);
|
||||||
audio_set_blocked (playsink, FALSE);
|
audio_set_blocked (playsink, FALSE);
|
||||||
|
@ -3922,13 +3938,8 @@ caps_notify_cb (GstPad * pad, GParamSpec * unused, GstPlaySink * playsink)
|
||||||
|
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
if (reconfigure) {
|
if (reconfigure)
|
||||||
GST_PLAY_SINK_LOCK (playsink);
|
gst_play_sink_reconfigure (playsink);
|
||||||
video_set_blocked (playsink, TRUE);
|
|
||||||
audio_set_blocked (playsink, TRUE);
|
|
||||||
text_set_blocked (playsink, TRUE);
|
|
||||||
GST_PLAY_SINK_UNLOCK (playsink);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4386,40 +4397,8 @@ gst_play_sink_change_state (GstElement * element, GstStateChange transition)
|
||||||
ret = GST_STATE_CHANGE_ASYNC;
|
ret = GST_STATE_CHANGE_ASYNC;
|
||||||
|
|
||||||
/* block all pads here */
|
/* block all pads here */
|
||||||
GST_PLAY_SINK_LOCK (playsink);
|
if (!gst_play_sink_reconfigure (playsink))
|
||||||
if (playsink->video_pad && playsink->video_block_id == 0) {
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
GstPad *opad =
|
|
||||||
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
|
|
||||||
(playsink->video_pad)));
|
|
||||||
playsink->video_block_id =
|
|
||||||
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
|
||||||
sinkpad_blocked_cb, playsink, NULL);
|
|
||||||
PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_VIDEO);
|
|
||||||
gst_object_unref (opad);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playsink->audio_pad && playsink->audio_block_id == 0) {
|
|
||||||
GstPad *opad =
|
|
||||||
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
|
|
||||||
(playsink->audio_pad)));
|
|
||||||
playsink->audio_block_id =
|
|
||||||
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
|
||||||
sinkpad_blocked_cb, playsink, NULL);
|
|
||||||
PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_AUDIO);
|
|
||||||
gst_object_unref (opad);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playsink->text_pad && playsink->text_block_id == 0) {
|
|
||||||
GstPad *opad =
|
|
||||||
GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD
|
|
||||||
(playsink->text_pad)));
|
|
||||||
playsink->text_block_id =
|
|
||||||
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
|
|
||||||
sinkpad_blocked_cb, playsink, NULL);
|
|
||||||
PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_TEXT);
|
|
||||||
gst_object_unref (opad);
|
|
||||||
}
|
|
||||||
GST_PLAY_SINK_UNLOCK (playsink);
|
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
/* unblock all pads here */
|
/* unblock all pads here */
|
||||||
|
|
Loading…
Reference in a new issue