aboutsummaryrefslogtreecommitdiff
path: root/gst/multipart/multipartdemux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/multipart/multipartdemux.c')
-rw-r--r--gst/multipart/multipartdemux.c66
1 files changed, 51 insertions, 15 deletions
diff --git a/gst/multipart/multipartdemux.c b/gst/multipart/multipartdemux.c
index 4889e45c..c247f1b5 100644
--- a/gst/multipart/multipartdemux.c
+++ b/gst/multipart/multipartdemux.c
@@ -116,7 +116,7 @@ static void gst_multipart_set_property (GObject * object, guint prop_id,
static void gst_multipart_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static void gst_multipart_demux_finalize (GObject * object);
+static void gst_multipart_demux_dispose (GObject * object);
#define gst_multipart_demux_parent_class parent_class
G_DEFINE_TYPE (GstMultipartDemux, gst_multipart_demux, GST_TYPE_ELEMENT);
@@ -129,7 +129,7 @@ gst_multipart_demux_class_init (GstMultipartDemuxClass * klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
- gobject_class->finalize = gst_multipart_demux_finalize;
+ gobject_class->dispose = gst_multipart_demux_dispose;
gobject_class->set_property = gst_multipart_set_property;
gobject_class->get_property = gst_multipart_get_property;
@@ -193,24 +193,35 @@ gst_multipart_demux_init (GstMultipartDemux * multipart)
}
static void
-gst_multipart_pad_free (GstMultipartPad * mppad)
+gst_multipart_demux_remove_src_pads (GstMultipartDemux * demux)
{
- g_free (mppad->mime);
- g_free (mppad);
+ while (demux->srcpads != NULL) {
+ GstMultipartPad *mppad = demux->srcpads->data;
+
+ gst_element_remove_pad (GST_ELEMENT (demux), mppad->pad);
+ g_free (mppad->mime);
+ g_free (mppad);
+ demux->srcpads = g_slist_delete_link (demux->srcpads, demux->srcpads);
+ }
+ demux->srcpads = NULL;
+ demux->numpads = 0;
}
static void
-gst_multipart_demux_finalize (GObject * object)
+gst_multipart_demux_dispose (GObject * object)
{
GstMultipartDemux *demux = GST_MULTIPART_DEMUX (object);
- g_object_unref (demux->adapter);
+ if (demux->adapter != NULL)
+ g_object_unref (demux->adapter);
+ demux->adapter = NULL;
g_free (demux->boundary);
+ demux->boundary = NULL;
g_free (demux->mime_type);
- g_slist_foreach (demux->srcpads, (GFunc) gst_multipart_pad_free, NULL);
- g_slist_free (demux->srcpads);
+ demux->mime_type = NULL;
+ gst_multipart_demux_remove_src_pads (demux);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (parent_class)->dispose (object);
}
static const gchar *
@@ -301,6 +312,8 @@ gst_multipart_find_pad_by_mime (GstMultipartDemux * demux, gchar * mime,
mppad->pad = pad;
mppad->mime = g_strdup (mime);
mppad->last_ret = GST_FLOW_OK;
+ mppad->last_ts = GST_CLOCK_TIME_NONE;
+ mppad->discont = TRUE;
demux->srcpads = g_slist_prepend (demux->srcpads, mppad);
demux->numpads++;
@@ -536,7 +549,6 @@ gst_multipart_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
{
GstMultipartDemux *multipart;
GstAdapter *adapter;
- GstClockTime timestamp;
gint size = 1;
GstFlowReturn res;
@@ -545,9 +557,14 @@ gst_multipart_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
res = GST_FLOW_OK;
- timestamp = GST_BUFFER_TIMESTAMP (buf);
-
if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) {
+ GSList *l;
+
+ for (l = multipart->srcpads; l != NULL; l = l->next) {
+ GstMultipartPad *srcpad = l->data;
+
+ srcpad->discont = TRUE;
+ }
gst_adapter_clear (adapter);
}
gst_adapter_push (adapter, buf);
@@ -578,9 +595,13 @@ gst_multipart_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GST_DEBUG_OBJECT (multipart, "skipping empty content.");
gst_adapter_flush (adapter, size - datalen);
} else {
+ GstClockTime ts;
+
srcpad =
gst_multipart_find_pad_by_mime (multipart,
multipart->mime_type, &created);
+
+ ts = gst_adapter_prev_pts (adapter, NULL);
outbuf = gst_adapter_take_buffer (adapter, datalen);
gst_adapter_flush (adapter, size - datalen);
@@ -596,11 +617,23 @@ gst_multipart_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
tags = gst_tag_list_new (GST_TAG_CONTAINER_FORMAT, "Multipart", NULL);
gst_tag_list_set_scope (tags, GST_TAG_SCOPE_GLOBAL);
gst_pad_push_event (srcpad->pad, gst_event_new_tag (tags));
+ }
- GST_BUFFER_TIMESTAMP (outbuf) = 0;
+ outbuf = gst_buffer_make_writable (outbuf);
+ if (srcpad->last_ts == GST_CLOCK_TIME_NONE || srcpad->last_ts != ts) {
+ GST_BUFFER_TIMESTAMP (outbuf) = ts;
+ srcpad->last_ts = ts;
} else {
- GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
}
+
+ if (srcpad->discont) {
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ srcpad->discont = FALSE;
+ } else {
+ GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ }
+
GST_DEBUG_OBJECT (multipart,
"pushing buffer with timestamp %" GST_TIME_FORMAT,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)));
@@ -643,6 +676,9 @@ gst_multipart_demux_change_state (GstElement * element,
g_free (multipart->mime_type);
multipart->mime_type = NULL;
gst_adapter_clear (multipart->adapter);
+ multipart->content_length = -1;
+ multipart->scanpos = 0;
+ gst_multipart_demux_remove_src_pads (multipart);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
break;