//定义metartc的rtp扩展,标准的webrtc不定义任何头扩展,这个由开发者自定义。
int32_t yang_encode_rtpExtensions(YangRtpExtensions* ext,YangBuffer* buf){
int32_t err = Yang_Ok;
//写两个字节0xBEDE,扩展头标识,开发者自己定义。
yang_write_2bytes(buf,0xBEDE);
// Write length.
int32_t len = 0;
//如果有twcc则加上它的length
if (ext->twcc.has_twcc) {
len += yang_rtpExtensionTwcc_nb(&ext->twcc);
}
//如果音频level有扩展,则添加其length
if (ext->audio_level.has_ext) {
len += yang_rtpExtensionOneByte_nb(&ext->audio_level);
}
//将len进行4字节对齐,不足时补足最后的4个字节。
int32_t padding_count = (len % 4 == 0) ? 0 : (4 - len % 4);
len += padding_count;
//如果buf的长度不足以存放扩展头,则输出error。
if (!yang_buffer_require(buf,len)) {
return yang_error_wrap(ERROR_RTC_RTP_MUXER, "requires %d bytes", len);
}
//写len到buf中,len / 4我理解是为了减少len的长度,接收端在乘以4后获得实际长度。
yang_write_2bytes(buf,len / 4);
// Write extensions.
//使用 TWCC,接收方让发送方知道每个数据包的到达时间。让发送者测量数据包之间到达延迟的变化,以及识别哪些数据包丢失或到达太晚而不能提供音频 / 视频源。随着这些数据的频繁交换,发送方能够快速调整以适应不断变化的网络条件,并使用诸如 GCC 的算法改变其输出带宽。
if (ext->twcc.has_twcc) {
if ((err = yang_encode_rtpExtensionsTwcc(&ext->twcc,buf)) != Yang_Ok) {
return yang_error_wrap(err, "encode twcc extension");
}
}
//写入audio_level的头扩展
if (ext->audio_level.has_ext) {
if (Yang_Ok != (err = yang_encode_rtpExtensionsOneByte(&ext->audio_level,buf))) {
return yang_error_wrap(err, "encode audio level extension");
}
}
// add padding
if (padding_count) {
memset(buf->head, 0, padding_count);
yang_buffer_skip(buf,padding_count);
}
return err;
}
metartc5_jz源码阅读-yang_encode_rtpExtensions
最新推荐文章于 2024-08-08 07:58:00 发布