Example #1
0
static void
kms_remb_remote_update_target_ssrcs_stats (KmsRembRemote * rm,
    KmsRTCPPSFBAFBREMBPacket * remb_packet)
{
  guint i;

  for (i = 0; i < remb_packet->n_ssrcs; i++) {
    kms_remb_base_update_stats (KMS_REMB_BASE (rm), remb_packet->ssrcs[i],
        remb_packet->bitrate);
  }
}
Example #2
0
static void
process_psfb_afb (GObject * sess, guint ssrc, GstBuffer * fci_buffer)
{
  KmsRembRemote *rm;
  KmsRTCPPSFBAFBBuffer afb_buffer = { NULL, };
  KmsRTCPPSFBAFBPacket afb_packet;
  KmsRTCPPSFBAFBREMBPacket remb_packet;
  KmsRTCPPSFBAFBType type;

  if (!G_IS_OBJECT (sess)) {
    GST_WARNING ("Invalid session object");
    return;
  }

  rm = g_object_get_data (sess, KMS_REMB_REMOTE);

  if (!rm) {
    GST_WARNING ("Invalid RembRemote");
    return;
  }

  if (!kms_rtcp_psfb_afb_buffer_map (fci_buffer, GST_MAP_READ, &afb_buffer)) {
    GST_WARNING_OBJECT (fci_buffer, "Buffer cannot be mapped");
    return;
  }

  if (!kms_rtcp_psfb_afb_get_packet (&afb_buffer, &afb_packet)) {
    GST_WARNING_OBJECT (fci_buffer, "Cannot get RTCP PSFB AFB packet");
    goto end;
  }

  type = kms_rtcp_psfb_afb_packet_get_type (&afb_packet);
  switch (type) {
    case KMS_RTCP_PSFB_AFB_TYPE_REMB:
      kms_rtcp_psfb_afb_remb_get_packet (&afb_packet, &remb_packet);
      kms_remb_remote_update (rm, &remb_packet);
      kms_remb_base_update_stats (KMS_REMB_BASE (rm), ssrc,
          remb_packet.bitrate);
      break;
    default:
      break;
  }

end:
  kms_rtcp_psfb_afb_buffer_unmap (&afb_buffer);
}
Example #3
0
static void
on_sending_rtcp (GObject * sess, GstBuffer * buffer, gboolean is_early,
    gboolean * do_not_supress)
{
  KmsRembLocal *rl;
  KmsRTCPPSFBAFBREMBPacket remb_packet;
  GstRTCPBuffer rtcp = { NULL, };
  GstRTCPPacket packet;
  guint packet_ssrc;

  rl = g_object_get_data (sess, KMS_REMB_LOCAL);

  if (!rl) {
    GST_WARNING ("Invalid RembLocal");
    return;
  }

  if (is_early) {
    return;
  }

  if (!gst_rtcp_buffer_map (buffer, GST_MAP_READWRITE, &rtcp)) {
    GST_WARNING_OBJECT (sess, "Cannot map buffer to RTCP");
    return;
  }

  if (!gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_PSFB, &packet)) {
    GST_WARNING_OBJECT (sess, "Cannot add RTCP packet");
    goto end;
  }

  if (!kms_remb_local_update (rl)) {
    goto end;
  }

  remb_packet.bitrate = rl->remb;
  if (rl->event_manager != NULL) {
    guint remb_local_max;

    remb_local_max = kms_utils_remb_event_manager_get_min (rl->event_manager);
    if (remb_local_max > 0) {
      GST_TRACE_OBJECT (sess, "REMB local max: %" G_GUINT32_FORMAT,
          remb_local_max);
      remb_packet.bitrate = MIN (remb_local_max, rl->remb);
    }
  }

  if (rl->min_bw > 0) {
    remb_packet.bitrate = MAX (remb_packet.bitrate, rl->min_bw * 1000);
  } else {
    remb_packet.bitrate = MAX (remb_packet.bitrate, REMB_MIN);
  }

  remb_packet.n_ssrcs = 1;
  remb_packet.ssrcs[0] = rl->remote_ssrc;
  g_object_get (sess, "internal-ssrc", &packet_ssrc, NULL);
  if (!kms_rtcp_psfb_afb_remb_marshall_packet (&packet, &remb_packet,
          packet_ssrc)) {
    gst_rtcp_packet_remove (&packet);
  }

  GST_TRACE_OBJECT (sess, "Sending REMB (bitrate: %" G_GUINT32_FORMAT
      ", ssrc: %" G_GUINT32_FORMAT ")", remb_packet.bitrate, rl->remote_ssrc);

  kms_remb_base_update_stats (KMS_REMB_BASE (rl), rl->remote_ssrc,
      remb_packet.bitrate);

end:
  gst_rtcp_buffer_unmap (&rtcp);
}