metartc5_jz源码阅读-yang_push_h264_encodeVideo

//编码rtp的视频buffer,发送给p2p对端。
int32_t yang_push_h264_encodeVideo(YangRtcSession *session, YangPushH264Rtp *rtp,
		YangRtpPacket *pkt) {
	int err = 0;
	//用videoRtpBuffer中的数据填充rtp->buf.
	yang_init_buffer(&rtp->buf, yang_get_rtpBuffer(rtp->videoRtpBuffer),	kRtpPacketSize);

	//用pkt->header中的数据填充rtp->buf
	if ((err = yang_encode_rtpHeader(&rtp->buf, &pkt->header)) != Yang_Ok) {
		return yang_error_wrap(err, "rtp header(%d) encode packet fail",
				pkt->payload_type);
	}

	//如果payloadType为raw,则从rtp->videoRawData中读取数据填充rtp->buf
	if (pkt->payload_type == YangRtspPacketPayloadTypeRaw) {
		err = yang_encode_h264_raw(&rtp->buf, &rtp->videoRawData);
	} else if (pkt->payload_type == YangRtspPacketPayloadTypeFUA2) {
		//如果payloadType为FUA2,则从rtp->videoFua2Data中读取数据填充rtp->buf
		err = yang_encode_h264_fua2(&rtp->buf, &rtp->videoFua2Data);
	} else if (pkt->payload_type == YangRtspPacketPayloadTypeSTAP) {
		//如果payloadType为STAP,则从rtp->stapData中读取数据填充rtp->buf
		err = yang_encode_h264_stap(&rtp->buf, &rtp->stapData);
		yang_reset_h2645_stap(&rtp->stapData);
	}

	if (err != Yang_Ok) {
		return yang_error_wrap(err, "rtp payload(%d) encode packet fail",
				pkt->payload_type);
	}
	//如果padding_length大于0时,则增加header的size.
	if (pkt->header.padding_length > 0) {
		uint8_t padding = pkt->header.padding_length;
		if (!yang_buffer_require(&rtp->buf, padding)) {
			return yang_error_wrap(ERROR_RTC_RTP_MUXER,
					"padding requires %d bytes", padding);
		}
		memset(rtp->buf.head, padding, padding);
		yang_buffer_skip(&rtp->buf, padding);
	}
	//设置video的sendStats,包括rtp包数量、字节数、发送时间戳等。
	session->context.stats.on_pub_videoRtp(&session->context.stats.sendStats,pkt,&rtp->buf);
	
	//调用yang_send_avpacket将rtp包发送给p2p对端。
	return yang_send_avpacket(session, pkt, &rtp->buf);
}

你可能感兴趣的:(metartc5_jz源码阅读,音视频,c语言,p2p,实时音视频)