【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理

RTSP Announce命令是数据源向Darwin服务端主动发起的上报本地媒体sdp信息的命令,在Darwin中处理该命令的函数为QTSSReflectorModule模块的DoAnnounce()函数,下面对该函数的进行剖析:

【转载请注明出处】:http://blog.csdn.NET/longlong530

1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <PREF NAME="enable_broadcast_announce" TYPE="Bool16" >true</PREF>  

2. 通过键值qtssRTSPReqLocalPath获取完整的转发路径,比如D:\MSU\Movies\34020000001320000008.sdp

3. 验证上面路径的结尾是否为.kill,如果是设置killBroadcast为true,那么下面就会进入KillSession流程
[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. if (killBroadcast)  
  2. {    
  3.     theFullPath.Len -= sSDPKillSuffix.Len;  
  4.     if (KillSession(&theFullPath, killBroadcast))  
  5.         return QTSSModuleUtils::SendErrorResponse(inParams->inRTSPRequest, qtssServerInternal,0);  
  6.     else  
  7.         return QTSSModuleUtils::SendErrorResponseWithMessage(inParams->inRTSPRequest, qtssClientNotFound, &sKILLNotValidMessage);    
  8. }  

4. 验证上面路径的结尾是否为.sdp

5. 获取SDP字符串的长度,并检验sdp字符串是否超长,默认 4* 1024

6. 检测sRequestBodyAttr、sBufferOffsetAttr这两个KEY值是否存在hash表中。如果没有就构造键值对增加到hash标准。

7. 通过QTSS_Read从RTSP请求消息inParams->inRTSPRequest中解析出SDP信息。

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. //theBufferOffset直接被设置为0,这里好像没有用到该偏移值;  
  2. //这里通过该方法将RTSP请求消息中的sdp字符串解析出来了。  
  3. theErr = QTSS_Read(inParams->inRTSPRequest, theRequestBody + theBufferOffset, *theContentLenP - theBufferOffset, &theLen);  
  4.     

8. 通过IsSDPBufferValid()方法来校验SDP是否合法,通过InfoPortsOK()判断Announce请求的端口是否合法,其中端口范围由sMinimumStaticSDPPort、sMaximumStaticSDPPort决定,默认分别为20000、65535

9. 分别将SDP字符串中的会话相关字段、媒体相关字段写入sdp文件中.

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. SDPLineSorter sortedSDP(&checkedSDPContainer );  
  2.   
  3. // ------------ Write the SDP   
  4.     //SDP字符串中的会话相关字段  
  5.     /* 
  6.     v=0 
  7.     o=- 0 0 IN IP4 192.168.10.177 
  8.     s=PLAY 
  9.     c=IN IP4 192.168.10.177 
  10.     t=0 0 
  11.     a=x-qt-text-nam:PLAY 
  12.     a=x-qt-text-inf:LIVE555 Streaming Media 
  13.     a=x-qt-text-cmt:source application:PLAY 
  14.     a=x-qt-text-aut: 
  15.     a=x-qt-text-cpy: 
  16.     */  
  17.     char* sessionHeaders = sortedSDP.GetSessionHeaders()->GetAsCString();  
  18.     OSCharArrayDeleter sessionHeadersDeleter(sessionHeaders);  
  19.   
  20.     //SDP字符串中的媒体相关字段  
  21.     /* 
  22.     m=video 20020 RTP/AVP 96 
  23.     a=rtpmap:96 PS/90000 
  24.     a=fmtp:96 packetization-mode=1;profile-level-id=4D4033;sprop-parameter-sets=Z01AM5p0FCNCAAEEugA9CQEeMGVA,aO48gA== 
  25.     a=control:trackID=1 
  26.     */  
  27.     char* mediaHeaders = sortedSDP.GetMediaHeaders()->GetAsCString();  
  28.     OSCharArrayDeleter mediaHeadersDeleter(mediaHeaders);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值