//编码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源码阅读-yang_push_h264_encodeVideo
最新推荐文章于 2024-09-16 17:44:00 发布
该代码片段详细描述了如何在YangRtcSession上下文中,使用H264编码对视频数据进行RTP封装,并根据不同payload_type处理,最后发送到P2P对端。涉及到的步骤包括填充RTP头、处理不同格式的数据、添加padding以及更新发送统计。
摘要由CSDN通过智能技术生成