summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2016-02-19 17:45:26 +0100
committerEdward Hervey <bilboed@bilboed.com>2016-02-19 18:04:23 +0100
commit00a1879d65df12ee5db70fd45dd9af996c97674d (patch)
treeabea9619ab2bc6f356ba036640d45deb50845142 /gst
parentacdbbb92d839108f8a1fbbcb4b90fa1f7499e27d (diff)
downloadgstreamer-plugins-bad-00a1879d65df12ee5db70fd45dd9af996c97674d.tar.gz
tsparse: Use GstFlowCombiner
In addition to the fact that it's a sane thing to do for multi-source pad elements, it also avoids the situation where just using a request pad (and not the main static pad) would result in the processing stopping.
Diffstat (limited to 'gst')
-rw-r--r--gst/mpegtsdemux/mpegtsparse.c27
-rw-r--r--gst/mpegtsdemux/mpegtsparse.h4
2 files changed, 28 insertions, 3 deletions
diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c
index 6e4faf508..8e932d311 100644
--- a/gst/mpegtsdemux/mpegtsparse.c
+++ b/gst/mpegtsdemux/mpegtsparse.c
@@ -125,6 +125,16 @@ static GstFlowReturn
drain_pending_buffers (MpegTSParse2 * parse, gboolean drain_all);
static void
+mpegts_parse_dispose (GObject * object)
+{
+ MpegTSParse2 *parse = (MpegTSParse2 *) object;
+
+ gst_flow_combiner_free (parse->flowcombiner);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
mpegts_parse_class_init (MpegTSParse2Class * klass)
{
GObjectClass *gobject_class = (GObjectClass *) (klass);
@@ -133,6 +143,7 @@ mpegts_parse_class_init (MpegTSParse2Class * klass)
gobject_class->set_property = mpegts_parse_set_property;
gobject_class->get_property = mpegts_parse_get_property;
+ gobject_class->dispose = mpegts_parse_dispose;
g_object_class_install_property (gobject_class, PROP_SET_TIMESTAMPS,
g_param_spec_boolean ("set-timestamps",
@@ -187,7 +198,10 @@ mpegts_parse_init (MpegTSParse2 * parse)
parse->user_pcr_pid = parse->pcr_pid = -1;
+ parse->flowcombiner = gst_flow_combiner_new ();
+
parse->srcpad = gst_pad_new_from_static_template (&src_template, "src");
+ gst_flow_combiner_add_pad (parse->flowcombiner, parse->srcpad);
parse->first = TRUE;
gst_pad_set_query_function (parse->srcpad,
GST_DEBUG_FUNCPTR (mpegts_parse_src_pad_query));
@@ -396,6 +410,7 @@ mpegts_parse_create_tspad (MpegTSParse2 * parse, const gchar * pad_name)
tspad->pushed = FALSE;
tspad->flow_return = GST_FLOW_NOT_LINKED;
gst_pad_set_element_private (pad, tspad);
+ gst_flow_combiner_add_pad (parse->flowcombiner, pad);
return tspad;
}
@@ -504,8 +519,11 @@ mpegts_parse_request_new_pad (GstElement * element, GstPadTemplate * template,
static void
mpegts_parse_release_pad (GstElement * element, GstPad * pad)
{
+ MpegTSParse2 *parse = (MpegTSParse2 *) element;
+
gst_pad_set_active (pad, FALSE);
/* we do the cleanup in GstElement::pad-removed */
+ gst_flow_combiner_remove_pad (parse->flowcombiner, pad);
gst_element_remove_pad (element, pad);
}
@@ -818,9 +836,10 @@ drain_pending_buffers (MpegTSParse2 * parse, gboolean drain_all)
GST_BUFFER_PTS (buffer) = out_ts + parse->ts_offset;
GST_BUFFER_DTS (buffer) = out_ts + parse->ts_offset;
- if (ret == GST_FLOW_OK)
+ if (ret == GST_FLOW_OK) {
ret = gst_pad_push (parse->srcpad, buffer);
- else
+ ret = gst_flow_combiner_update_flow (parse->flowcombiner, ret);
+ } else
gst_buffer_unref (buffer);
/* Free this list node and move to the next */
@@ -871,8 +890,10 @@ mpegts_parse_input_done (MpegTSBase * base, GstBuffer * buffer)
}
}
- if (buffer != NULL)
+ if (buffer != NULL) {
ret = gst_pad_push (parse->srcpad, buffer);
+ ret = gst_flow_combiner_update_flow (parse->flowcombiner, ret);
+ }
return ret;
}
diff --git a/gst/mpegtsdemux/mpegtsparse.h b/gst/mpegtsdemux/mpegtsparse.h
index d3bc6a2d2..f89bd4c3a 100644
--- a/gst/mpegtsdemux/mpegtsparse.h
+++ b/gst/mpegtsdemux/mpegtsparse.h
@@ -26,6 +26,7 @@
#define GST_MPEG_TS_PARSE_H
#include <gst/gst.h>
+#include <gst/base/gstflowcombiner.h>
#include "mpegtsbase.h"
#include "mpegtspacketizer.h"
@@ -61,8 +62,11 @@ struct _MpegTSParse2 {
/* Always present source pad */
GstPad *srcpad;
+ /* Request source (single program) pads */
GList *srcpads;
+ GstFlowCombiner *flowcombiner;
+
/* state */
gboolean first;
gboolean set_timestamps;