Freeswitch透传RTCP消息 bug 的修复.

来源:互联网 发布:4g网络不稳定怎么设置 编辑:程序博客网 时间:2024/05/17 06:22

在有些视频协议中,采用了payload specific 的feedback RTCP消息来请求关键帧.   

而Freeswitch 透传RTCP消息有问题. 首先文档中没有说明有passthru的透传设置. 其设置应该如下.

 <param name="rtcp-audio-interval-msec" value="passthru"/>
<param name="rtcp-video-interval-msec" value="passthru"/>


但是设置完以后, 还是发现很多问题, 首先音频的RTCP包被丢弃了. 其bug如下.

将switch_rtp.c 的 rtp_common_read 的

*other_rtp_session->rtcp_send_msg.body = *rtp_session->rtcp_recv_msg.body;

改成

memcpy(&(other_rtp_session->rtcp_send_msg) ,&(rtp_session->rtcp_recv_msg),sizeof(rtcp_msg_t));

再来看视频的rtcp包.  发出后会收到端口不可达的ICMP消息.   这里面有两个bug要处理.  

1.  在sofia_glue.c中 switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_flag_t myflags) 函数中  :video 标号后面处理 视频RTCP的时候,传递的rtp_session是音频的,应该是代码拷贝导致的错误:

  if (!strcasecmp(val, "passthru")) {

          switch_rtp_activate_rtcp(tech_pvt->rtp_session, -1, remote_port);  // 这里应该是传tech_pvt->video_rtcp_session.
 } else {
            int interval = atoi(val);
            if (interval < 100 || interval > 5000) {
                   switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR,
                             "Invalid rtcp interval spec [%d] must be between 100 and 5000\n", interval);
            } else {
                  switch_rtp_activate_rtcp(tech_pvt->rtp_session, interval, remote_port);  // 这里应该是传tech_pvt->video_rtcp_session.
            }    

}    

2. 如果防火墙上端口映射和内网映射不是简单线性对应的话, 需要根据收到的RTCP包调整对应的端口(地址rtp会自动调整). 需在函数read_rtcp_packet做如下修改:

 if(*bytes!=0 ) {

        if(rtp_session->rtcp_from_addr->port != rtp_session->remote_rtcp_port)  { 
            const char *err;
            rtp_session->remote_rtcp_port = rtp_session->rtcp_from_addr->port;
            enable_remote_rtcp_socket(rtp_session,&err);
        }    
    }    

将switch_rtp.c 的 rtp_common_read 的

*other_rtp_session->rtcp_send_msg.body = *rtp_session->rtcp_recv_msg.body;

改成

memcpy(&(other_rtp_session->rtcp_send_msg) ,&(rtp_session->rtcp_recv_msg),sizeof(rtcp_msg_t));

原创粉丝点击