//解析rtcp的命令到rtcps中。
int32_t yang_decode_rtcpCompound(YangRtcpCompound* rtcps,YangBuffer *buffer){
if(rtcps==NULL) return 1;
int32_t err = Yang_Ok;
rtcps->data = buffer->data;
rtcps->nb_data = buffer->size;
//如果buffer中不为空则循环遍历每条命令。
while (!yang_buffer_empty(buffer)) {
//创建YangRtcpCommon结构体用于保存单条rtcp的数据。
YangRtcpCommon* rtcp = (YangRtcpCommon*)calloc(1,sizeof(YangRtcpCommon));
YangRtcpHeader* header = (YangRtcpHeader*)(buffer->head);
//如果是sr则创建sr并解析sr,sr是指接收方不光作为rtp数据的接收者还是rtp数据的发送者,这时接收方发送给接收方的type就是sr。
//sr中包含接收方接收了多少包,丢失了多少包,还包含接收方的发送信息。
if (header->type == YangRtcpType_sr) {
yang_create_rtcpSR(rtcp);
err=yang_decode_rtcpSR(rtcp,buffer);
} else if (header->type == YangRtcpType_rr) {
//如果是rr则创建rr并解析rr,rr是指接收方仅作为rtp数据的接收者
//rr中包含接收方接收了多少包,丢失了多少包。
yang_create_rtcpRR(rtcp);
err=yang_decode_rtcpRR(rtcp,buffer);
} else if (header->type == YangRtcpType_rtpfb) {
//rtpfb表示接收方接收的rtp包的反馈信息,反馈给发送方。
if(1 == header->rc) {
//当rc为1时,表示nack命令,nack命令是接收方rtp丢包要求发送方重传
yang_create_rtcpNack(rtcp,0);
yang_decode_rtcpNack(rtcp,buffer);
} else if (15 == header->rc) {
//当rc为15时,表示twcc命令,接收方通过此命令告诉发送方,由发送方检测接收端的拥塞。
yang_create_rtcptwcc(rtcp);
yang_twcc_rtcp_decode(rtcp,buffer);
}
} else if(header->type == YangRtcpType_psfb) {//指定净荷重传
if(1 == header->rc) {
//Picture Loss Indication pli命令,接收方丢失关键帧,要求发送方重传关键帧
yang_create_rtcpPli(rtcp);
err=yang_decode_rtcpPli(rtcp,buffer);
} else if(2 == header->rc) {
//Slice Loss Indication sli命令,接收方丢失帧内分块,要求发送方重传此分块
yang_create_rtcpSli(rtcp,rtcp->ssrc);
err=yang_decode_rtcpSli(rtcp,buffer);
} else if(3 == header->rc) {
//Reference Picture Selection Indication rpsi命令,接收方丢失参考帧,要求发送方重传此参考帧
yang_create_rtcpRpsi(rtcp);
yang_decode_rtcpRpsi(rtcp,buffer);
} else {
// common psfb,以上三种都不是,则创建默认的psfb命令
yang_create_rtcpPsfb(rtcp);
err=yang_decode_rtcpPsfb(rtcp,buffer);
}
} else if(header->type == YangRtcpType_xr) {
//Extended Report 扩展报告,接收方通过此命令传输更多的控制信息,如网络抖动、丢包率等信息。
yang_create_rtcpXr(rtcp);
err=yang_decode_rtcpXr(rtcp,buffer);
} else {
//以上type都不是,则创建默认的rtcp命令。
yang_create_rtcpCommon(rtcp);
err=yang_decode_rtcpCommon(rtcp,buffer);
}
//进行错误处理。
if(err) {
uint32_t header_type=rtcp->header.type;
uint32_t header_rc=rtcp->header.rc;
yang_free(rtcp);
if(err==ERROR_RTC_RTCP_EMPTY_RR) {
err=Yang_Ok;
continue;
}
return yang_error_wrap(err, "decode rtcp type=%u rc=%u", header_type, header_rc);
}
//将解析的rtcp命令添加到rtcps的rtcpVector中
yang_rtcpCompound_add_rtcp(rtcps,rtcp);
yang_free(rtcp);
}
return err;
}
metartc5_jz源码阅读-yang_decode_rtcpCompound
最新推荐文章于 2024-05-24 09:34:11 发布