mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
[MOVED FROM GST-P-FARSIGHT] Drop buffers instead of blocking the sinkpads
20070316131444-65035-9c1345ad96108881f455d4b55a7f623cd302d0ed.gz
This commit is contained in:
parent
df902798c3
commit
46b4fb228b
1 changed files with 41 additions and 19 deletions
|
@ -243,12 +243,14 @@ gst_rtp_mux_request_new_pad (GstElement * element,
|
||||||
if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) {
|
if (templ == gst_element_class_get_pad_template (klass, "sink_%d")) {
|
||||||
gchar *name;
|
gchar *name;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (rtp_mux);
|
||||||
/* create new pad with the name */
|
/* create new pad with the name */
|
||||||
name = g_strdup_printf ("sink_%02d", rtp_mux->numpads);
|
name = g_strdup_printf ("sink_%02d", rtp_mux->numpads);
|
||||||
newpad = gst_pad_new_from_template (templ, name);
|
newpad = gst_pad_new_from_template (templ, name);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
|
||||||
rtp_mux->numpads++;
|
rtp_mux->numpads++;
|
||||||
|
GST_OBJECT_UNLOCK (rtp_mux);
|
||||||
} else {
|
} else {
|
||||||
GST_WARNING_OBJECT (rtp_mux, "this is not our template!\n");
|
GST_WARNING_OBJECT (rtp_mux, "this is not our template!\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -269,19 +271,36 @@ static GstFlowReturn
|
||||||
gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer)
|
gst_rtp_mux_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstRTPMux *rtp_mux;
|
GstRTPMux *rtp_mux;
|
||||||
|
gboolean drop = FALSE;
|
||||||
|
GstFlowReturn ret;
|
||||||
|
|
||||||
rtp_mux = GST_RTP_MUX (gst_pad_get_parent (pad));
|
rtp_mux = GST_RTP_MUX (gst_pad_get_parent (pad));
|
||||||
|
GST_OBJECT_LOCK (rtp_mux);
|
||||||
|
|
||||||
|
if (rtp_mux->special_pad != NULL &&
|
||||||
|
rtp_mux->special_pad != pad) {
|
||||||
|
drop = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drop) {
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
ret = GST_FLOW_OK;
|
||||||
|
GST_OBJECT_UNLOCK (rtp_mux);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
rtp_mux->seqnum++;
|
rtp_mux->seqnum++;
|
||||||
GST_LOG_OBJECT (rtp_mux, "setting RTP seqnum %d", rtp_mux->seqnum);
|
GST_LOG_OBJECT (rtp_mux, "setting RTP seqnum %d", rtp_mux->seqnum);
|
||||||
gst_rtp_buffer_set_seq (buffer, rtp_mux->seqnum);
|
gst_rtp_buffer_set_seq (buffer, rtp_mux->seqnum);
|
||||||
|
|
||||||
gst_object_unref (rtp_mux);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (rtp_mux, "Pushing packet size %d, seq=%d, ts=%u",
|
GST_DEBUG_OBJECT (rtp_mux, "Pushing packet size %d, seq=%d, ts=%u",
|
||||||
GST_BUFFER_SIZE (buffer), rtp_mux->seqnum - 1);
|
GST_BUFFER_SIZE (buffer), rtp_mux->seqnum - 1);
|
||||||
|
|
||||||
return gst_pad_push (rtp_mux->srcpad, buffer);
|
GST_OBJECT_UNLOCK (rtp_mux);
|
||||||
|
ret = gst_pad_push (rtp_mux->srcpad, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_object_unref (rtp_mux);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -319,7 +338,7 @@ gst_rtp_mux_setcaps (GstPad *pad, GstCaps *caps)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
/*static void
|
||||||
gst_rtp_mux_set_sinkpads_blocked (GstRTPMux *rtp_mux, gboolean blocked, GstPad *exception)
|
gst_rtp_mux_set_sinkpads_blocked (GstRTPMux *rtp_mux, gboolean blocked, GstPad *exception)
|
||||||
{
|
{
|
||||||
GstIterator *iter;
|
GstIterator *iter;
|
||||||
|
@ -343,7 +362,7 @@ gst_rtp_mux_set_sinkpads_blocked (GstRTPMux *rtp_mux, gboolean blocked, GstPad *
|
||||||
}
|
}
|
||||||
gst_object_unref (GST_OBJECT (pad));
|
gst_object_unref (GST_OBJECT (pad));
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_rtp_mux_handle_sink_event (GstPad * pad, GstEvent * event)
|
gst_rtp_mux_handle_sink_event (GstPad * pad, GstEvent * event)
|
||||||
|
@ -368,14 +387,15 @@ gst_rtp_mux_handle_sink_event (GstPad * pad, GstEvent * event)
|
||||||
if (!gst_structure_get_boolean (structure, "lock", &lock))
|
if (!gst_structure_get_boolean (structure, "lock", &lock))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (rtp_mux);
|
||||||
if (lock) {
|
if (lock) {
|
||||||
if (rtp_mux->special_pad != NULL) {
|
if (rtp_mux->special_pad != NULL) {
|
||||||
GST_WARNING_OBJECT (rtp_mux,
|
GST_WARNING_OBJECT (rtp_mux,
|
||||||
"Stream lock already acquired by pad %s",
|
"Stream lock already acquired by pad %s",
|
||||||
GST_ELEMENT_NAME (rtp_mux->special_pad));
|
GST_ELEMENT_NAME (rtp_mux->special_pad));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
rtp_mux->special_pad = gst_object_ref (pad);
|
rtp_mux->special_pad = gst_object_ref (pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,7 +403,6 @@ gst_rtp_mux_handle_sink_event (GstPad * pad, GstEvent * event)
|
||||||
if (rtp_mux->special_pad == NULL) {
|
if (rtp_mux->special_pad == NULL) {
|
||||||
GST_WARNING_OBJECT (rtp_mux,
|
GST_WARNING_OBJECT (rtp_mux,
|
||||||
"Stream lock not acquired, can't release it");
|
"Stream lock not acquired, can't release it");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (pad != rtp_mux->special_pad) {
|
else if (pad != rtp_mux->special_pad) {
|
||||||
|
@ -391,15 +410,18 @@ gst_rtp_mux_handle_sink_event (GstPad * pad, GstEvent * event)
|
||||||
"pad %s attempted to release Stream lock"
|
"pad %s attempted to release Stream lock"
|
||||||
" which was acquired by pad %s", GST_ELEMENT_NAME (pad),
|
" which was acquired by pad %s", GST_ELEMENT_NAME (pad),
|
||||||
GST_ELEMENT_NAME (rtp_mux->special_pad));
|
GST_ELEMENT_NAME (rtp_mux->special_pad));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
gst_object_unref (rtp_mux->special_pad);
|
gst_object_unref (rtp_mux->special_pad);
|
||||||
rtp_mux->special_pad = NULL;
|
rtp_mux->special_pad = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_rtp_mux_set_sinkpads_blocked (rtp_mux, lock, pad);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GST_OBJECT_UNLOCK (rtp_mux);
|
||||||
|
/*gst_rtp_mux_set_sinkpads_blocked (rtp_mux, lock, pad);*/
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue