|
|
|
|
@ -1562,17 +1562,19 @@ void rtcp_receiver_reports(GQueue *out, struct ssrc_hash *hash, struct call_mono
|
|
|
|
|
void rtcp_send_report(struct call_media *media, struct ssrc_ctx *ssrc_out) {
|
|
|
|
|
// figure out where to send it
|
|
|
|
|
struct packet_stream *ps = media->streams.head->data;
|
|
|
|
|
// crypto context is held separately
|
|
|
|
|
struct packet_stream *rtcp_ps = media->streams.head->next ? media->streams.head->next->data : ps;
|
|
|
|
|
|
|
|
|
|
if (MEDIA_ISSET(media, RTCP_MUX))
|
|
|
|
|
;
|
|
|
|
|
else if (!media->streams.head->next)
|
|
|
|
|
;
|
|
|
|
|
else {
|
|
|
|
|
struct packet_stream *next_ps = media->streams.head->next->data;
|
|
|
|
|
if (PS_ISSET(next_ps, RTCP))
|
|
|
|
|
ps = next_ps;
|
|
|
|
|
if (PS_ISSET(rtcp_ps, RTCP))
|
|
|
|
|
ps = rtcp_ps;
|
|
|
|
|
else
|
|
|
|
|
rtcp_ps = ps;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ps->selected_sfd)
|
|
|
|
|
if (!ps->selected_sfd || !rtcp_ps->selected_sfd)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
media_update_stats(media);
|
|
|
|
|
@ -1595,7 +1597,20 @@ void rtcp_send_report(struct call_media *media, struct ssrc_ctx *ssrc_out) {
|
|
|
|
|
atomic64_get(&ssrc_out->octets),
|
|
|
|
|
&rrs, &srrs);
|
|
|
|
|
|
|
|
|
|
socket_sendto(&ps->selected_sfd->socket, sr->str, sr->len, &ps->endpoint);
|
|
|
|
|
// handle crypto
|
|
|
|
|
|
|
|
|
|
str rtcp_packet = STR_CONST_INIT_LEN(sr->str, sr->len);
|
|
|
|
|
|
|
|
|
|
const struct streamhandler *crypt_handler = determine_handler(&transport_protocols[PROTO_RTP_AVP],
|
|
|
|
|
media, true);
|
|
|
|
|
|
|
|
|
|
if (crypt_handler && crypt_handler->out->rtcp_crypt) {
|
|
|
|
|
g_string_set_size(sr, sr->len + RTP_BUFFER_TAIL_ROOM);
|
|
|
|
|
rtcp_packet = STR_CONST_INIT_LEN(sr->str, sr->len - RTP_BUFFER_TAIL_ROOM);
|
|
|
|
|
crypt_handler->out->rtcp_crypt(&rtcp_packet, ps, NULL, NULL, NULL, ssrc_out);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
socket_sendto(&ps->selected_sfd->socket, rtcp_packet.s, rtcp_packet.len, &ps->endpoint);
|
|
|
|
|
g_string_free(sr, TRUE);
|
|
|
|
|
|
|
|
|
|
GQueue *sinks = ps->rtp_sinks.length ? &ps->rtp_sinks : &ps->rtcp_sinks;
|
|
|
|
|
|