static gboolean gst_rtp_ssrc_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRtpSsrcDemux *demux; const GstStructure *s; demux = GST_RTP_SSRC_DEMUX (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: case GST_EVENT_CUSTOM_BOTH: case GST_EVENT_CUSTOM_BOTH_OOB: s = gst_event_get_structure (event); if (s && !gst_structure_has_field (s, "ssrc")) { GstRtpSsrcDemuxPad *dpad = find_demux_pad_for_pad (demux, pad); if (dpad) { GstStructure *ws; event = gst_event_make_writable (event); ws = gst_event_writable_structure (event); gst_structure_set (ws, "ssrc", G_TYPE_UINT, dpad->ssrc, NULL); } } break; default: break; } return gst_pad_event_default (pad, parent, event); }
static gboolean gst_ffmpegscale_src_event (GstBaseTransform * trans, GstEvent * event) { GstFFMpegScale *scale; GstStructure *structure; gdouble pointer; gboolean res; scale = GST_FFMPEGSCALE (trans); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: event = gst_event_make_writable (event); structure = gst_event_writable_structure (event); if (gst_structure_get_double (structure, "pointer_x", &pointer)) { gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, pointer * scale->in_info.width / scale->out_info.width, NULL); } if (gst_structure_get_double (structure, "pointer_y", &pointer)) { gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, pointer * scale->in_info.height / scale->out_info.height, NULL); } break; default: break; } res = GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, event); return res; }
static gboolean gst_rtp_pt_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRtpPtDemux *demux; const GstStructure *s; demux = GST_RTP_PT_DEMUX (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CUSTOM_UPSTREAM: case GST_EVENT_CUSTOM_BOTH: case GST_EVENT_CUSTOM_BOTH_OOB: s = gst_event_get_structure (event); if (s && !gst_structure_has_field (s, "payload")) { GSList *walk; GST_OBJECT_LOCK (demux); for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) { GstRtpPtDemuxPad *dpad = (GstRtpPtDemuxPad *) walk->data; if (dpad->pad == pad) { GstStructure *ws; event = GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (event))); ws = gst_event_writable_structure (event); gst_structure_set (ws, "payload", G_TYPE_UINT, dpad->pt, NULL); break; } } GST_OBJECT_UNLOCK (demux); } break; default: break; } return gst_pad_event_default (pad, parent, event); }
static gboolean gst_rtp_ulpfec_dec_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRtpUlpFecDec *self = GST_RTP_ULPFEC_DEC (parent); gboolean forward = TRUE; GST_LOG_OBJECT (self, "Received event %" GST_PTR_FORMAT, event); if (GST_FLOW_OK == self->chain_return_val && GST_EVENT_CUSTOM_DOWNSTREAM == GST_EVENT_TYPE (event) && gst_event_has_name (event, "GstRTPPacketLost")) { guint seqnum; GstClockTime timestamp, duration; GstStructure *s; event = gst_event_make_writable (event); s = gst_event_writable_structure (event); g_assert (self->have_caps_ssrc); g_assert (self->storage); if (!gst_structure_get (s, "seqnum", G_TYPE_UINT, &seqnum, "timestamp", G_TYPE_UINT64, ×tamp, "duration", G_TYPE_UINT64, &duration, NULL)) g_assert_not_reached (); forward = gst_rtp_ulpfec_dec_handle_packet_loss (self, seqnum, timestamp, duration); if (forward) { gst_structure_remove_field (s, "seqnum"); gst_structure_set (s, "might-have-been-fec", G_TYPE_BOOLEAN, TRUE, NULL); ++self->packets_unrecovered; } else { ++self->packets_recovered; } GST_DEBUG_OBJECT (self, "Unrecovered / Recovered: %lu / %lu", (gulong) self->packets_unrecovered, (gulong) self->packets_recovered); } else if (GST_EVENT_CAPS == GST_EVENT_TYPE (event)) { GstCaps *caps; gboolean have_caps_pt = FALSE; gboolean have_caps_ssrc = FALSE; guint caps_ssrc = 0; gint caps_pt = 0; gst_event_parse_caps (event, &caps); have_caps_ssrc = gst_structure_get_uint (gst_caps_get_structure (caps, 0), "ssrc", &caps_ssrc); have_caps_pt = gst_structure_get_int (gst_caps_get_structure (caps, 0), "payload", &caps_pt); if (self->have_caps_ssrc != have_caps_ssrc || self->caps_ssrc != caps_ssrc) GST_DEBUG_OBJECT (self, "SSRC changed %u, 0x%08x -> %u, 0x%08x", self->have_caps_ssrc, self->caps_ssrc, have_caps_ssrc, caps_ssrc); if (self->have_caps_pt != have_caps_pt || self->caps_pt != caps_pt) GST_DEBUG_OBJECT (self, "PT changed %u, %u -> %u, %u", self->have_caps_pt, self->caps_pt, have_caps_pt, caps_pt); self->have_caps_ssrc = have_caps_ssrc; self->have_caps_pt = have_caps_pt; self->caps_ssrc = caps_ssrc; self->caps_pt = caps_pt; } if (forward) return gst_pad_push_event (self->srcpad, event); gst_event_unref (event); return TRUE; }