int32_t yang_rtcconn_on_rtcp(YangRtcSession *session, char *data,int32_t nb_data) {
int32_t err = Yang_Ok;
int32_t nb_unprotected_buf = nb_data;
//根据context.srtp解密data,解密成功后data指向解密后的rtcp数据,nb_unprotected_buf表示要解密的字节数,解密后此字段将保存解密后的字节数。
if ((err = yang_dec_rtcp(&session->context.srtp, data, &nb_unprotected_buf))!= Yang_Ok) {
if (err == srtp_err_status_replay_fail) return Yang_Ok;
return yang_error_wrap(err, "rtcp unprotect");
}
//将解密后的数据放到buffer中。
char *unprotected_buf = data;
YangBuffer buffer;
yang_init_buffer(&buffer, unprotected_buf, nb_unprotected_buf);
//解析buffer到rtcp_compound的rtcpVector数组中,这里看出buffer中单次可以存放很多YangRtcpCommon。
if (Yang_Ok != (err = yang_decode_rtcpCompound(&session->rtcp_compound, &buffer))) {
return yang_error_wrap(err, "decode rtcp plaintext=%u", nb_unprotected_buf);
}
//遍历rtcpVector中的所有YangRtcpCommon对象
YangRtcpCommon *rtcp = NULL;
for (int i = 0; i < session->rtcp_compound.rtcpVector.vsize; i++) {
rtcp = &session->rtcp_compound.rtcpVector.payload[i];
//执行rtcp相应指令。
err = yang_rtcconn_dispatch_rtcp(session, rtcp);
if (Yang_Ok != err) {
//一旦出错,把rtcpVector中所有rtcp命令清空。
yang_rtcpCompound_clear(&session->rtcp_compound);
return yang_error_wrap(err,
"cipher=%u, plaintext=%u, rtcp=(%u,%u,%u,%u)", nb_data,
nb_unprotected_buf, rtcp->nb_data, rtcp->header.rc,
rtcp->header.type, rtcp->ssrc);
}
}
//所有命令执行完毕后把rtcpVector中所有rtcp命令清空。
yang_rtcpCompound_clear(&session->rtcp_compound);
return err;
}
metartc5_jz源码阅读-yang_rtcconn_on_rtcp
最新推荐文章于 2024-08-08 07:58:00 发布
该代码片段展示了如何在YangRtcSession中处理接收到的加密RTCP数据,包括解密、解析和执行rtcp指令,确保了实时通信的安全性。
摘要由CSDN通过智能技术生成