[gst-cvs] gst-plugins-good: rtpptdemux: only forward the lost-event to the last seen pt-number
Wim Taymans
wtay at kemper.freedesktop.org
Wed Oct 14 03:30:20 PDT 2009
Module: gst-plugins-good
Branch: master
Commit: 58b9de4cca8b0f9da0742202e190457801118d33
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=58b9de4cca8b0f9da0742202e190457801118d33
Author: HÃ¥vard Graff <havard.graff at tandberg.com>
Date: Wed Oct 14 12:28:55 2009 +0200
rtpptdemux: only forward the lost-event to the last seen pt-number
forward all events on all pads except for the PacketLost event, which we want to
forward to the last seen pt pad.
Fixes #598377
---
gst/rtpmanager/gstrtpptdemux.c | 36 ++++++++++++++++++++++++++++++++++++
1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/gst/rtpmanager/gstrtpptdemux.c b/gst/rtpmanager/gstrtpptdemux.c
index 8510776..3e231c8 100644
--- a/gst/rtpmanager/gstrtpptdemux.c
+++ b/gst/rtpmanager/gstrtpptdemux.c
@@ -124,6 +124,7 @@ static void gst_rtp_pt_demux_finalize (GObject * object);
static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux);
static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux);
+static gboolean gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event);
static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf);
static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element,
GstStateChange transition);
@@ -237,6 +238,7 @@ gst_rtp_pt_demux_init (GstRtpPtDemux * ptdemux, GstRtpPtDemuxClass * g_class)
g_assert (ptdemux->sink != NULL);
gst_pad_set_chain_function (ptdemux->sink, gst_rtp_pt_demux_chain);
+ gst_pad_set_event_function (ptdemux->sink, gst_rtp_pt_demux_sink_event);
gst_element_add_pad (GST_ELEMENT (ptdemux), ptdemux->sink);
}
@@ -425,6 +427,40 @@ find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt)
return respad;
}
+static gboolean
+gst_rtp_pt_demux_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstRtpPtDemux *rtpdemux;
+ gboolean res = FALSE;
+
+ rtpdemux = GST_RTP_PT_DEMUX (GST_PAD_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ {
+ const GstStructure *s;
+
+ s = gst_event_get_structure (event);
+
+ if (gst_structure_has_name (s, "GstRTPPacketLost")) {
+ GstRtpPtDemuxPad *rtpdemuxpad =
+ find_pad_for_pt (rtpdemux, rtpdemux->last_pt);
+
+ if (rtpdemuxpad)
+ res = gst_pad_push_event (rtpdemuxpad->pad, event);
+
+ } else {
+ res = gst_pad_event_default (pad, event);
+ }
+ }
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+ return res;
+}
+
+
/*
* Reserves resources for the object.
*/
More information about the Gstreamer-commits
mailing list