From: Wim Taymans Date: Mon, 13 Jun 2011 15:51:40 +0000 (+0200) Subject: -good: port some more plugins X-Git-Tag: RELEASE-0.11.1~568 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=409f29700d3389804b9620fe140710a15d73ede5;p=platform%2Fupstream%2Fgst-plugins-good.git -good: port some more plugins --- diff --git a/gst/audiofx/audiopanorama.c b/gst/audiofx/audiopanorama.c index 7077db1..aa3bc84 100644 --- a/gst/audiofx/audiopanorama.c +++ b/gst/audiofx/audiopanorama.c @@ -127,7 +127,7 @@ static void gst_audio_panorama_get_property (GObject * object, guint prop_id, static gboolean gst_audio_panorama_get_unit_size (GstBaseTransform * base, GstCaps * caps, gsize * size); static GstCaps *gst_audio_panorama_transform_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps); + GstPadDirection direction, GstCaps * caps, GstCaps * filter); static gboolean gst_audio_panorama_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); @@ -331,7 +331,7 @@ gst_audio_panorama_get_unit_size (GstBaseTransform * base, GstCaps * caps, static GstCaps * gst_audio_panorama_transform_caps (GstBaseTransform * base, - GstPadDirection direction, GstCaps * caps) + GstPadDirection direction, GstCaps * caps, GstCaps * filter) { GstCaps *res; GstStructure *structure; diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index e8d659f..88e6f6b 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -1151,6 +1151,7 @@ gst_rtp_bin_handle_sync (GstElement * jitterbuffer, GstStructure * s, guint clock_rate; guint64 extrtptime; GstBuffer *buffer; + GstRTCPBuffer rtcp = { NULL }; bin = stream->bin; @@ -1170,7 +1171,10 @@ gst_rtp_bin_handle_sync (GstElement * jitterbuffer, GstStructure * s, have_sr = FALSE; have_sdes = FALSE; - GST_RTCP_BUFFER_FOR_PACKETS (more, buffer, &packet) { + + gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcp); + + GST_RTCP_BUFFER_FOR_PACKETS (more, &rtcp, &packet) { /* first packet must be SR or RR or else the validate would have failed */ switch (gst_rtcp_packet_get_type (&packet)) { case GST_RTCP_TYPE_SR: @@ -1229,6 +1233,7 @@ gst_rtp_bin_handle_sync (GstElement * jitterbuffer, GstStructure * s, break; } } + gst_rtcp_buffer_unmap (&rtcp); } /* create a new stream with @ssrc in @session. Must be called with @@ -1368,38 +1373,12 @@ static void gst_rtp_bin_get_property (GObject * object, guint prop_id, static GstStateChangeReturn gst_rtp_bin_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name); + GstPadTemplate * templ, const gchar * name, const GstCaps * caps); static void gst_rtp_bin_release_pad (GstElement * element, GstPad * pad); static void gst_rtp_bin_handle_message (GstBin * bin, GstMessage * message); -GST_BOILERPLATE (GstRtpBin, gst_rtp_bin, GstBin, GST_TYPE_BIN); - -static void -gst_rtp_bin_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - /* sink pads */ - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_recv_rtp_sink_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_recv_rtcp_sink_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_send_rtp_sink_template)); - - /* src pads */ - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_recv_rtp_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_send_rtcp_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&rtpbin_send_rtp_src_template)); - - gst_element_class_set_details_simple (element_class, "RTP Bin", - "Filter/Network/RTP", - "Real-Time Transport Protocol bin", - "Wim Taymans "); -} +#define gst_rtp_bin_parent_class parent_class +G_DEFINE_TYPE (GstRtpBin, gst_rtp_bin, GST_TYPE_BIN); static void gst_rtp_bin_class_init (GstRtpBinClass * klass) @@ -1682,6 +1661,27 @@ gst_rtp_bin_class_init (GstRtpBinClass * klass) GST_DEBUG_FUNCPTR (gst_rtp_bin_request_new_pad); gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_bin_release_pad); + /* sink pads */ + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_recv_rtp_sink_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_recv_rtcp_sink_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_send_rtp_sink_template)); + + /* src pads */ + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_recv_rtp_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_send_rtcp_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&rtpbin_send_rtp_src_template)); + + gst_element_class_set_details_simple (gstelement_class, "RTP Bin", + "Filter/Network/RTP", + "Real-Time Transport Protocol bin", + "Wim Taymans "); + gstbin_class->handle_message = GST_DEBUG_FUNCPTR (gst_rtp_bin_handle_message); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_bin_clear_pt_map); @@ -1693,7 +1693,7 @@ gst_rtp_bin_class_init (GstRtpBinClass * klass) } static void -gst_rtp_bin_init (GstRtpBin * rtpbin, GstRtpBinClass * klass) +gst_rtp_bin_init (GstRtpBin * rtpbin) { gchar *str; @@ -2166,7 +2166,6 @@ new_payload_found (GstElement * element, guint pt, GstPad * pad, g_free (padname); g_object_set_data (G_OBJECT (pad), "GstRTPBin.ghostpad", gpad); - gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); gst_pad_set_active (gpad, TRUE); GST_RTP_BIN_SHUTDOWN_UNLOCK (rtpbin); @@ -2349,7 +2348,6 @@ new_ssrc_pad_found (GstElement * element, guint ssrc, GstPad * pad, gpad = gst_ghost_pad_new_from_template (padname, pad, templ); g_free (padname); - gst_pad_set_caps (gpad, GST_PAD_CAPS (pad)); gst_pad_set_active (gpad, TRUE); gst_element_add_pad (GST_ELEMENT_CAST (rtpbin), gpad); @@ -2788,24 +2786,24 @@ gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) gint session = 0; GstIterator *pad_it = NULL; gchar *pad_name = NULL; + GValue data = { 0, }; GST_DEBUG_OBJECT (element, "find a free pad name for template"); while (!name_found) { gboolean done = FALSE; + g_free (pad_name); pad_name = g_strdup_printf (templ->name_template, session++); pad_it = gst_element_iterate_pads (GST_ELEMENT (element)); name_found = TRUE; while (!done) { - gpointer data; - switch (gst_iterator_next (pad_it, &data)) { case GST_ITERATOR_OK: { GstPad *pad; gchar *name; - pad = GST_PAD_CAST (data); + pad = g_value_get_object (&data); name = gst_pad_get_name (pad); if (strcmp (name, pad_name) == 0) { @@ -2813,7 +2811,7 @@ gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) name_found = FALSE; } g_free (name); - gst_object_unref (pad); + g_value_reset (&data); break; } case GST_ITERATOR_ERROR: @@ -2828,6 +2826,7 @@ gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) break; } } + g_value_unset (&data); gst_iterator_free (pad_it); } @@ -2839,7 +2838,7 @@ gst_rtp_bin_get_free_pad_name (GstElement * element, GstPadTemplate * templ) */ static GstPad * gst_rtp_bin_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name) + GstPadTemplate * templ, const gchar * name, const GstCaps * caps) { GstRtpBin *rtpbin; GstElementClass *klass; diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index e118699..3584d14 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -218,8 +218,8 @@ GST_STATIC_PAD_TEMPLATE ("src", static guint gst_rtp_jitter_buffer_signals[LAST_SIGNAL] = { 0 }; -GST_BOILERPLATE (GstRtpJitterBuffer, gst_rtp_jitter_buffer, GstElement, - GST_TYPE_ELEMENT); +#define gst_rtp_jitter_buffer_parent_class parent_class +G_DEFINE_TYPE (GstRtpJitterBuffer, gst_rtp_jitter_buffer, GST_TYPE_ELEMENT); /* object overrides */ static void gst_rtp_jitter_buffer_set_property (GObject * object, @@ -232,17 +232,16 @@ static void gst_rtp_jitter_buffer_finalize (GObject * object); static GstStateChangeReturn gst_rtp_jitter_buffer_change_state (GstElement * element, GstStateChange transition); static GstPad *gst_rtp_jitter_buffer_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name); + GstPadTemplate * templ, const gchar * name, const GstCaps * filter); static void gst_rtp_jitter_buffer_release_pad (GstElement * element, GstPad * pad); static GstClock *gst_rtp_jitter_buffer_provide_clock (GstElement * element); /* pad overrides */ -static GstCaps *gst_rtp_jitter_buffer_getcaps (GstPad * pad); +static GstCaps *gst_rtp_jitter_buffer_getcaps (GstPad * pad, GstCaps * filter); static GstIterator *gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad); /* sinkpad overrides */ -static gboolean gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps); static gboolean gst_rtp_jitter_buffer_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_rtp_jitter_buffer_chain (GstPad * pad, @@ -268,25 +267,6 @@ gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jitterbuffer, gboolean active, guint64 base_time); static void -gst_rtp_jitter_buffer_base_init (gpointer klass) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_rtp_jitter_buffer_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_rtp_jitter_buffer_sink_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_rtp_jitter_buffer_sink_rtcp_template)); - - gst_element_class_set_details_simple (element_class, - "RTP packet jitter-buffer", "Filter/Network/RTP", - "A buffer that deals with network jitter and other transmission faults", - "Philippe Kalaf , " - "Wim Taymans "); -} - -static void gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass) { GObjectClass *gobject_class; @@ -443,6 +423,19 @@ gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass) gstelement_class->provide_clock = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_provide_clock); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_rtp_jitter_buffer_src_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_rtp_jitter_buffer_sink_template)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&gst_rtp_jitter_buffer_sink_rtcp_template)); + + gst_element_class_set_details_simple (gstelement_class, + "RTP packet jitter-buffer", "Filter/Network/RTP", + "A buffer that deals with network jitter and other transmission faults", + "Philippe Kalaf , " + "Wim Taymans "); + klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_clear_pt_map); klass->set_active = GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_set_active); @@ -451,8 +444,7 @@ gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass) } static void -gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer, - GstRtpJitterBufferClass * klass) +gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer) { GstRtpJitterBufferPrivate *priv; @@ -495,8 +487,6 @@ gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_chain)); gst_pad_set_event_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_sink_event)); - gst_pad_set_setcaps_function (priv->sinkpad, - GST_DEBUG_FUNCPTR (gst_jitter_buffer_sink_setcaps)); gst_pad_set_getcaps_function (priv->sinkpad, GST_DEBUG_FUNCPTR (gst_rtp_jitter_buffer_getcaps)); @@ -525,6 +515,7 @@ gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad) GstRtpJitterBuffer *jitterbuffer; GstPad *otherpad = NULL; GstIterator *it; + GValue val = { 0, }; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); @@ -536,8 +527,10 @@ gst_rtp_jitter_buffer_iterate_internal_links (GstPad * pad) otherpad = NULL; } - it = gst_iterator_new_single (GST_TYPE_PAD, otherpad, - (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); + g_value_init (&val, GST_TYPE_PAD); + g_value_set_object (&val, otherpad); + it = gst_iterator_new_single (GST_TYPE_PAD, &val); + g_value_unset (&val); gst_object_unref (jitterbuffer); @@ -585,7 +578,7 @@ remove_rtcp_sink (GstRtpJitterBuffer * jitterbuffer) static GstPad * gst_rtp_jitter_buffer_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name) + GstPadTemplate * templ, const gchar * name, const GstCaps * filter) { GstRtpJitterBuffer *jitterbuffer; GstElementClass *klass; @@ -714,7 +707,7 @@ gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jbuf, gboolean active, } static GstCaps * -gst_rtp_jitter_buffer_getcaps (GstPad * pad) +gst_rtp_jitter_buffer_getcaps (GstPad * pad, GstCaps * filter) { GstRtpJitterBuffer *jitterbuffer; GstRtpJitterBufferPrivate *priv; @@ -727,7 +720,7 @@ gst_rtp_jitter_buffer_getcaps (GstPad * pad) other = (pad == priv->srcpad ? priv->sinkpad : priv->srcpad); - caps = gst_pad_peer_get_caps (other); + caps = gst_pad_peer_get_caps (other, filter); templ = gst_pad_get_pad_template_caps (pad); if (caps == NULL) { @@ -832,29 +825,6 @@ wrong_rate: } } -static gboolean -gst_jitter_buffer_sink_setcaps (GstPad * pad, GstCaps * caps) -{ - GstRtpJitterBuffer *jitterbuffer; - GstRtpJitterBufferPrivate *priv; - gboolean res; - - jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); - priv = jitterbuffer->priv; - - JBUF_LOCK (priv); - res = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); - JBUF_UNLOCK (priv); - - /* set same caps on srcpad on success */ - if (res) - gst_pad_set_caps (priv->srcpad, caps); - - gst_object_unref (jitterbuffer); - - return res; -} - static void gst_rtp_jitter_buffer_flush_start (GstRtpJitterBuffer * jitterbuffer) { @@ -1062,30 +1032,33 @@ gst_rtp_jitter_buffer_sink_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (jitterbuffer, "received %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_CAPS: { - GstFormat format; - gdouble rate, arate; - gint64 start, stop, time; - gboolean update; + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + + JBUF_LOCK (priv); + ret = gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); + JBUF_UNLOCK (priv); + + /* set same caps on srcpad on success */ + if (ret) + gst_pad_set_caps (priv->srcpad, caps); - gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format, - &start, &stop, &time); + gst_event_unref (event); + break; + } + case GST_EVENT_SEGMENT: + { + gst_event_copy_segment (event, &priv->segment); /* we need time for now */ - if (format != GST_FORMAT_TIME) + if (priv->segment.format != GST_FORMAT_TIME) goto newseg_wrong_format; GST_DEBUG_OBJECT (jitterbuffer, - "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT - ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT, - update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), - GST_TIME_ARGS (time)); - - /* now configure the values, we need these to time the release of the - * buffers on the srcpad. */ - gst_segment_set_newsegment_full (&priv->segment, update, - rate, arate, format, start, stop, time); + "newsegment: %" GST_SEGMENT_FORMAT, &priv->segment); /* FIXME, push SEGMENT in the queue. Sorting order might be difficult. */ ret = gst_pad_push_event (priv->srcpad, event); @@ -1264,6 +1237,7 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) gboolean tail; gint percent = -1; guint8 pt; + GstRTPBuffer rtp = { NULL }; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); @@ -1272,7 +1246,10 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) priv = jitterbuffer->priv; - pt = gst_rtp_buffer_get_payload_type (buffer); + gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtp); + pt = gst_rtp_buffer_get_payload_type (&rtp); + seqnum = gst_rtp_buffer_get_seq (&rtp); + gst_rtp_buffer_unmap (&rtp); /* take the timestamp of the buffer. This is the time when the packet was * received and is used to calculate jitter and clock skew. We will adjust @@ -1283,8 +1260,6 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) timestamp = gst_segment_to_running_time (&priv->segment, GST_FORMAT_TIME, timestamp); - seqnum = gst_rtp_buffer_get_seq (buffer); - GST_DEBUG_OBJECT (jitterbuffer, "Received packet #%d at time %" GST_TIME_FORMAT, seqnum, GST_TIME_ARGS (timestamp)); @@ -1292,19 +1267,20 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) JBUF_LOCK_CHECK (priv, out_flushing); if (G_UNLIKELY (priv->last_pt != pt)) { - GstCaps *caps; - GST_DEBUG_OBJECT (jitterbuffer, "pt changed from %u to %u", priv->last_pt, pt); priv->last_pt = pt; /* reset clock-rate so that we get a new one */ priv->clock_rate = -1; +#if 0 + GstCaps *caps; /* Try to get the clock-rate from the caps first if we can. If there are no * caps we must fire the signal to get the clock-rate. */ if ((caps = GST_BUFFER_CAPS (buffer))) { gst_jitter_buffer_sink_parse_caps (jitterbuffer, caps); } +#endif } if (G_UNLIKELY (priv->clock_rate == -1)) { @@ -1380,8 +1356,8 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) old_buf = rtp_jitter_buffer_pop (priv->jbuf, &percent); - GST_DEBUG_OBJECT (jitterbuffer, "Queue full, dropping old packet #%d", - gst_rtp_buffer_get_seq (old_buf)); + GST_DEBUG_OBJECT (jitterbuffer, "Queue full, dropping old packet %p", + old_buf); gst_buffer_unref (old_buf); } @@ -1389,7 +1365,7 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) /* we need to make the metadata writable before pushing it in the jitterbuffer * because the jitterbuffer will update the timestamp */ - buffer = gst_buffer_make_metadata_writable (buffer); + buffer = gst_buffer_make_writable (buffer); /* now insert the packet into the queue in sorted order. This function returns * FALSE if a packet with the same seqnum was already in the queue, meaning we @@ -1541,9 +1517,12 @@ compute_elapsed (GstRtpJitterBuffer * jitterbuffer, GstBuffer * outbuf) guint64 ext_time, elapsed; guint32 rtp_time; GstRtpJitterBufferPrivate *priv; + GstRTPBuffer rtp = { NULL }; priv = jitterbuffer->priv; - rtp_time = gst_rtp_buffer_get_timestamp (outbuf); + gst_rtp_buffer_map (outbuf, GST_MAP_READ, &rtp); + rtp_time = gst_rtp_buffer_get_timestamp (&rtp); + gst_rtp_buffer_unmap (&rtp); GST_LOG_OBJECT (jitterbuffer, "rtp %" G_GUINT32_FORMAT ", ext %" G_GUINT64_FORMAT, rtp_time, priv->ext_timestamp); @@ -1585,6 +1564,7 @@ gst_rtp_jitter_buffer_loop (GstRtpJitterBuffer * jitterbuffer) GstClockID id; GstClockTime sync_time; gint percent = -1; + GstRTPBuffer rtp = { NULL }; priv = jitterbuffer->priv; @@ -1679,7 +1659,9 @@ again: outbuf = rtp_jitter_buffer_peek (priv->jbuf); /* get the seqnum and the next expected seqnum */ - seqnum = gst_rtp_buffer_get_seq (outbuf); + gst_rtp_buffer_map (outbuf, GST_MAP_READ, &rtp); + seqnum = gst_rtp_buffer_get_seq (&rtp); + gst_rtp_buffer_unmap (&rtp); next_seqnum = priv->next_seqnum; /* get the timestamp, this is already corrected for clock skew by the @@ -1970,6 +1952,7 @@ gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer) guint64 ext_rtptime, diff; guint32 rtptime; gboolean drop = FALSE; + GstRTCPBuffer rtcp = { NULL }; jitterbuffer = GST_RTP_JITTER_BUFFER (gst_pad_get_parent (pad)); @@ -1978,8 +1961,10 @@ gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer) priv = jitterbuffer->priv; - if (!gst_rtcp_buffer_get_first_packet (buffer, &packet)) - goto invalid_buffer; + gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcp); + + if (!gst_rtcp_buffer_get_first_packet (&rtcp, &packet)) + goto empty_buffer; /* first packet must be SR or RR or else the validate would have failed */ switch (gst_rtcp_packet_get_type (&packet)) { @@ -1990,6 +1975,7 @@ gst_rtp_jitter_buffer_chain_rtcp (GstPad * pad, GstBuffer * buffer) default: goto ignore_buffer; } + gst_rtcp_buffer_unmap (&rtcp); GST_DEBUG_OBJECT (jitterbuffer, "received RTCP of SSRC %08x", ssrc); @@ -2066,9 +2052,19 @@ invalid_buffer: ret = GST_FLOW_OK; goto done; } +empty_buffer: + { + /* this is not fatal but should be filtered earlier */ + GST_ELEMENT_WARNING (jitterbuffer, STREAM, DECODE, (NULL), + ("Received empty RTCP payload, dropping")); + gst_rtcp_buffer_unmap (&rtcp); + ret = GST_FLOW_OK; + goto done; + } ignore_buffer: { GST_DEBUG_OBJECT (jitterbuffer, "ignoring RTCP packet"); + gst_rtcp_buffer_unmap (&rtcp); ret = GST_FLOW_OK; goto done; }