mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 12:10:37 +00:00
mssdemux: handle error messages from internal source
set up a bin message handler to get notified of error messages from the internal source element
This commit is contained in:
parent
b627d7df83
commit
6b8448c245
1 changed files with 49 additions and 9 deletions
|
@ -122,6 +122,7 @@ static void gst_mss_demux_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
static GstStateChangeReturn gst_mss_demux_change_state (GstElement * element,
|
static GstStateChangeReturn gst_mss_demux_change_state (GstElement * element,
|
||||||
GstStateChange transition);
|
GstStateChange transition);
|
||||||
|
static void gst_mss_demux_handle_message (GstBin * bin, GstMessage * msg);
|
||||||
static GstFlowReturn gst_mss_demux_chain (GstPad * pad, GstObject * parent,
|
static GstFlowReturn gst_mss_demux_chain (GstPad * pad, GstObject * parent,
|
||||||
GstBuffer * buffer);
|
GstBuffer * buffer);
|
||||||
static GstFlowReturn gst_mss_demux_event (GstPad * pad, GstObject * parent,
|
static GstFlowReturn gst_mss_demux_event (GstPad * pad, GstObject * parent,
|
||||||
|
@ -143,9 +144,11 @@ gst_mss_demux_class_init (GstMssDemuxClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
|
GstBinClass *gstbin_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
gstelement_class = (GstElementClass *) klass;
|
gstelement_class = (GstElementClass *) klass;
|
||||||
|
gstbin_class = (GstBinClass *) klass;
|
||||||
|
|
||||||
gst_element_class_add_pad_template (gstelement_class,
|
gst_element_class_add_pad_template (gstelement_class,
|
||||||
gst_static_pad_template_get (&gst_mss_demux_sink_template));
|
gst_static_pad_template_get (&gst_mss_demux_sink_template));
|
||||||
|
@ -185,6 +188,8 @@ gst_mss_demux_class_init (GstMssDemuxClass * klass)
|
||||||
gstelement_class->change_state =
|
gstelement_class->change_state =
|
||||||
GST_DEBUG_FUNCPTR (gst_mss_demux_change_state);
|
GST_DEBUG_FUNCPTR (gst_mss_demux_change_state);
|
||||||
|
|
||||||
|
gstbin_class->handle_message = gst_mss_demux_handle_message;
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (mssdemux_debug, "mssdemux", 0, "mssdemux plugin");
|
GST_DEBUG_CATEGORY_INIT (mssdemux_debug, "mssdemux", 0, "mssdemux plugin");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,6 +399,49 @@ gst_mss_demux_change_state (GstElement * element, GstStateChange transition)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_mss_demux_handle_message (GstBin * bin, GstMessage * msg)
|
||||||
|
{
|
||||||
|
GstMssDemux *demux = GST_MSS_DEMUX_CAST (bin);
|
||||||
|
|
||||||
|
switch (GST_MESSAGE_TYPE (msg)) {
|
||||||
|
case GST_MESSAGE_ERROR:{
|
||||||
|
GSList *iter;
|
||||||
|
GstMssDemuxStream *stream;
|
||||||
|
GError *err = NULL;
|
||||||
|
gchar *debug = NULL;
|
||||||
|
|
||||||
|
for (iter = demux->streams; iter; iter = g_slist_next (iter)) {
|
||||||
|
stream = iter->data;
|
||||||
|
if (GST_OBJECT_CAST (stream->src) == GST_MESSAGE_SRC (msg)) {
|
||||||
|
gst_message_parse_error (msg, &err, &debug);
|
||||||
|
|
||||||
|
GST_WARNING_OBJECT (stream->pad, "Source posted error: %d:%d %s (%s)",
|
||||||
|
err->domain, err->code, err->message, debug);
|
||||||
|
|
||||||
|
/* error, but ask to retry */
|
||||||
|
stream->last_ret = GST_FLOW_CUSTOM_ERROR;
|
||||||
|
g_cond_signal (&stream->fragment_download_cond);
|
||||||
|
|
||||||
|
g_error_free (err);
|
||||||
|
g_free (debug);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_message_unref (msg);
|
||||||
|
msg = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg)
|
||||||
|
GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_mss_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
gst_mss_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
@ -1305,7 +1353,6 @@ gst_mss_demux_stream_download_fragment (GstMssDemuxStream * stream)
|
||||||
break; /* all is good, let's go */
|
break; /* all is good, let's go */
|
||||||
case GST_FLOW_EOS:
|
case GST_FLOW_EOS:
|
||||||
g_free (path);
|
g_free (path);
|
||||||
g_free (url);
|
|
||||||
if (gst_mss_manifest_is_live (mssdemux->manifest)) {
|
if (gst_mss_manifest_is_live (mssdemux->manifest)) {
|
||||||
gst_mss_demux_reload_manifest (mssdemux);
|
gst_mss_demux_reload_manifest (mssdemux);
|
||||||
g_mutex_unlock (&stream->fragment_download_lock);
|
g_mutex_unlock (&stream->fragment_download_lock);
|
||||||
|
@ -1316,7 +1363,6 @@ gst_mss_demux_stream_download_fragment (GstMssDemuxStream * stream)
|
||||||
case GST_FLOW_ERROR:
|
case GST_FLOW_ERROR:
|
||||||
g_mutex_unlock (&stream->fragment_download_lock);
|
g_mutex_unlock (&stream->fragment_download_lock);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
g_free (url);
|
|
||||||
goto error;
|
goto error;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1347,7 +1393,6 @@ gst_mss_demux_stream_download_fragment (GstMssDemuxStream * stream)
|
||||||
* Have to assume we are falling behind and cause a manifest reload */
|
* Have to assume we are falling behind and cause a manifest reload */
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
return stream->last_ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return stream->last_ret;
|
return stream->last_ret;
|
||||||
|
@ -1428,12 +1473,7 @@ gst_mss_demux_download_loop (GstMssDemuxStream * stream)
|
||||||
GST_OBJECT_LOCK (mssdemux);
|
GST_OBJECT_LOCK (mssdemux);
|
||||||
if (stream->cancelled) {
|
if (stream->cancelled) {
|
||||||
GST_OBJECT_UNLOCK (mssdemux);
|
GST_OBJECT_UNLOCK (mssdemux);
|
||||||
goto cancelled;
|
stream->last_ret = GST_FLOW_FLUSHING;
|
||||||
}
|
|
||||||
stream->last_ret = ret;
|
|
||||||
|
|
||||||
if (stream->cancelled) {
|
|
||||||
GST_OBJECT_UNLOCK (mssdemux);
|
|
||||||
goto cancelled;
|
goto cancelled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue