static GstFlowReturn
kms_rtcp_demux_chain (GstPad * chain, GstObject * parent, GstBuffer * buffer)
{
  KmsRtcpDemux *self = KMS_RTCP_DEMUX (parent);
  GstMapInfo map;
  guint8 pt;

  if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) {
    gst_buffer_unref (buffer);
    GST_ERROR_OBJECT (parent, "Buffer cannot be mapped");
    return GST_FLOW_ERROR;
  }

  pt = map.data[1];
  gst_buffer_unmap (buffer, &map);

  /* 200-204 is the range of valid values for a rtcp pt according to rfc3550 */
  if (pt >= 200 && pt <= 204) {
    GST_TRACE ("Buffer is rtcp: %d", pt);
    gst_pad_push (self->priv->rtcp_src, buffer);
  } else {
    gst_pad_push (self->priv->rtp_src, buffer);
  }

  return GST_FLOW_OK;
}
Beispiel #2
0
static void
kms_rtcp_demux_finalize (GObject * object)
{
  KmsRtcpDemux *self = KMS_RTCP_DEMUX (object);

  g_hash_table_unref (self->priv->rr_ssrcs);

  /* chain up */
  G_OBJECT_CLASS (kms_rtcp_demux_parent_class)->finalize (object);
}
Beispiel #3
0
static GstFlowReturn
kms_rtcp_demux_chain (GstPad * chain, GstObject * parent, GstBuffer * buffer)
{
  KmsRtcpDemux *self = KMS_RTCP_DEMUX (parent);

  if (!buffer_is_rtcp (buffer)) {
    gst_pad_push (self->priv->rtp_src, buffer);
    return GST_FLOW_OK;
  }

  if (refresh_rtcp_rr_ssrcs_map (self, buffer)) {
    gst_pad_push (self->priv->rtcp_src, buffer);
  } else {
    gst_buffer_unref (buffer);
  }

  return GST_FLOW_OK;
}