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); } }
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); }
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); }