metartc5_jz源码阅读-yang_decode_rtcpCompound

//解析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源码阅读,实时音视频,音视频,p2p,c语言)