mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
gst/multipart/multipartmux.c: Emit NEWSEGMENT events before pushing the first buffer.
Original commit message from CVS: * gst/multipart/multipartmux.c: (gst_multipart_mux_request_new_pad), (gst_multipart_mux_collected), (gst_multipart_mux_change_state): Emit NEWSEGMENT events before pushing the first buffer.
This commit is contained in:
parent
17011e9a41
commit
5ba2fa6e3f
2 changed files with 59 additions and 55 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2007-05-03 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/multipart/multipartmux.c:
|
||||||
|
(gst_multipart_mux_request_new_pad), (gst_multipart_mux_collected),
|
||||||
|
(gst_multipart_mux_change_state):
|
||||||
|
Emit NEWSEGMENT events before pushing the first buffer.
|
||||||
|
|
||||||
2007-05-03 Wim Taymans <wim@fluendo.com>
|
2007-05-03 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize),
|
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize),
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct _GstMultipartMux
|
||||||
gchar *boundary;
|
gchar *boundary;
|
||||||
|
|
||||||
gboolean negotiated;
|
gboolean negotiated;
|
||||||
|
gboolean need_segment;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMultipartMuxClass
|
struct _GstMultipartMuxClass
|
||||||
|
@ -248,28 +249,6 @@ gst_multipart_mux_finalize (GObject * object)
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadLinkReturn
|
|
||||||
gst_multipart_mux_sinkconnect (GstPad * pad, GstPad * peer)
|
|
||||||
{
|
|
||||||
GstMultipartMux *multipart_mux;
|
|
||||||
GstMultipartPad *mppad;
|
|
||||||
gchar *pad_name = NULL;
|
|
||||||
|
|
||||||
multipart_mux = GST_MULTIPART_MUX (gst_pad_get_parent (pad));
|
|
||||||
|
|
||||||
mppad = (GstMultipartPad *) gst_pad_get_element_private (pad);
|
|
||||||
|
|
||||||
pad_name = gst_pad_get_name (pad);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (multipart_mux, "sinkconnect triggered on %s", pad_name);
|
|
||||||
|
|
||||||
g_free (pad_name);
|
|
||||||
|
|
||||||
gst_object_unref (multipart_mux);
|
|
||||||
|
|
||||||
return GST_PAD_LINK_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstPad *
|
static GstPad *
|
||||||
gst_multipart_mux_request_new_pad (GstElement * element,
|
gst_multipart_mux_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * templ, const gchar * req_name)
|
GstPadTemplate * templ, const gchar * req_name)
|
||||||
|
@ -277,51 +256,43 @@ gst_multipart_mux_request_new_pad (GstElement * element,
|
||||||
GstMultipartMux *multipart_mux;
|
GstMultipartMux *multipart_mux;
|
||||||
GstPad *newpad;
|
GstPad *newpad;
|
||||||
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
|
||||||
|
gchar *name;
|
||||||
|
|
||||||
g_return_val_if_fail (templ != NULL, NULL);
|
if (templ != gst_element_class_get_pad_template (klass, "sink_%d"))
|
||||||
|
goto wrong_template;
|
||||||
if (templ->direction != GST_PAD_SINK) {
|
|
||||||
g_warning ("multipart_mux: request pad that is not a SINK pad\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_MULTIPART_MUX (element), NULL);
|
|
||||||
|
|
||||||
multipart_mux = GST_MULTIPART_MUX (element);
|
multipart_mux = GST_MULTIPART_MUX (element);
|
||||||
|
|
||||||
if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) {
|
/* create new pad with the name */
|
||||||
gchar *name;
|
name = g_strdup_printf ("sink_%02d", multipart_mux->numpads);
|
||||||
|
newpad = gst_pad_new_from_template (templ, name);
|
||||||
|
g_free (name);
|
||||||
|
|
||||||
/* create new pad with the name */
|
/* construct our own wrapper data structure for the pad to
|
||||||
name = g_strdup_printf ("sink_%02d", multipart_mux->numpads);
|
* keep track of its status */
|
||||||
newpad = gst_pad_new_from_template (templ, name);
|
{
|
||||||
g_free (name);
|
GstMultipartPad *multipartpad;
|
||||||
|
|
||||||
/* construct our own wrapper data structure for the pad to
|
multipartpad = (GstMultipartPad *)
|
||||||
* keep track of its status */
|
gst_collect_pads_add_pad (multipart_mux->collect, newpad,
|
||||||
{
|
sizeof (GstMultipartPad));
|
||||||
GstMultipartPad *multipartpad;
|
|
||||||
|
|
||||||
multipartpad = (GstMultipartPad *)
|
/* save a pointer to our data in the pad */
|
||||||
gst_collect_pads_add_pad (multipart_mux->collect, newpad,
|
gst_pad_set_element_private (newpad, multipartpad);
|
||||||
sizeof (GstMultipartPad));
|
multipart_mux->numpads++;
|
||||||
|
|
||||||
/* save a pointer to our data in the pad */
|
|
||||||
gst_pad_set_element_private (newpad, multipartpad);
|
|
||||||
multipart_mux->numpads++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
g_warning ("multipart_mux: this is not our template!\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup some pad functions */
|
|
||||||
gst_pad_set_link_function (newpad, gst_multipart_mux_sinkconnect);
|
|
||||||
|
|
||||||
/* add the pad to the element */
|
/* add the pad to the element */
|
||||||
gst_element_add_pad (element, newpad);
|
gst_element_add_pad (element, newpad);
|
||||||
|
|
||||||
return newpad;
|
return newpad;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
wrong_template:
|
||||||
|
{
|
||||||
|
g_warning ("multipart_mux: this is not our template!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle events */
|
/* handle events */
|
||||||
|
@ -472,6 +443,26 @@ gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux)
|
||||||
mux->negotiated = TRUE;
|
mux->negotiated = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* see if we need to push a segment */
|
||||||
|
if (mux->need_segment) {
|
||||||
|
GstEvent *event;
|
||||||
|
GstClockTime time;
|
||||||
|
|
||||||
|
if (best->timestamp != -1)
|
||||||
|
time = best->timestamp;
|
||||||
|
else
|
||||||
|
time = 0;
|
||||||
|
|
||||||
|
/* for the segment, we take the first timestamp we see, we don't know the
|
||||||
|
* length and the position is 0 */
|
||||||
|
event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME,
|
||||||
|
time, -1, 0);
|
||||||
|
|
||||||
|
gst_pad_push_event (mux->srcpad, event);
|
||||||
|
|
||||||
|
mux->need_segment = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
structure = gst_caps_get_structure (GST_BUFFER_CAPS (best->buffer), 0);
|
structure = gst_caps_get_structure (GST_BUFFER_CAPS (best->buffer), 0);
|
||||||
if (!structure)
|
if (!structure)
|
||||||
goto no_caps;
|
goto no_caps;
|
||||||
|
@ -490,9 +481,13 @@ gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux)
|
||||||
memcpy (GST_BUFFER_DATA (headerbuf), header, headerlen);
|
memcpy (GST_BUFFER_DATA (headerbuf), header, headerlen);
|
||||||
g_free (header);
|
g_free (header);
|
||||||
|
|
||||||
gst_buffer_stamp (headerbuf, best->buffer);
|
/* the header has the same timestamp as the data buffer (which we will push
|
||||||
|
* below) and has a duration of 0 */
|
||||||
|
GST_BUFFER_TIMESTAMP (headerbuf) = best->timestamp;
|
||||||
|
GST_BUFFER_DURATION (headerbuf) = 0;
|
||||||
GST_BUFFER_OFFSET (headerbuf) = mux->offset;
|
GST_BUFFER_OFFSET (headerbuf) = mux->offset;
|
||||||
mux->offset += headerlen;
|
mux->offset += headerlen;
|
||||||
|
GST_BUFFER_OFFSET_END (headerbuf) = mux->offset;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (mux, "pushing %" G_GSIZE_FORMAT " bytes header buffer",
|
GST_DEBUG_OBJECT (mux, "pushing %" G_GSIZE_FORMAT " bytes header buffer",
|
||||||
headerlen);
|
headerlen);
|
||||||
|
@ -510,6 +505,7 @@ gst_multipart_mux_collected (GstCollectPads * pads, GstMultipartMux * mux)
|
||||||
gst_buffer_set_caps (databuf, GST_PAD_CAPS (mux->srcpad));
|
gst_buffer_set_caps (databuf, GST_PAD_CAPS (mux->srcpad));
|
||||||
GST_BUFFER_OFFSET (databuf) = mux->offset;
|
GST_BUFFER_OFFSET (databuf) = mux->offset;
|
||||||
mux->offset += GST_BUFFER_SIZE (databuf);
|
mux->offset += GST_BUFFER_SIZE (databuf);
|
||||||
|
GST_BUFFER_OFFSET_END (databuf) = mux->offset;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (mux, "pushing %u bytes data buffer",
|
GST_DEBUG_OBJECT (mux, "pushing %u bytes data buffer",
|
||||||
GST_BUFFER_SIZE (databuf));
|
GST_BUFFER_SIZE (databuf));
|
||||||
|
@ -609,6 +605,7 @@ gst_multipart_mux_change_state (GstElement * element, GstStateChange transition)
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
multipart_mux->offset = 0;
|
multipart_mux->offset = 0;
|
||||||
multipart_mux->negotiated = FALSE;
|
multipart_mux->negotiated = FALSE;
|
||||||
|
multipart_mux->need_segment = TRUE;
|
||||||
GST_DEBUG_OBJECT (multipart_mux, "starting collect pads");
|
GST_DEBUG_OBJECT (multipart_mux, "starting collect pads");
|
||||||
gst_collect_pads_start (multipart_mux->collect);
|
gst_collect_pads_start (multipart_mux->collect);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue