您的位置:首页 > 编程语言 > Qt开发

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

2017-01-23 20:14 591 查看
          对于QTSSReflectorModule里面的Describe消息只处理sdp类型的资源请求,其他类型的比如mov、mp4等资源会跳转到QTSSFileModule里面,其中mp4文件在Darwin源码中点播需要先hint下。如果想在增加多种视频格式那就要对FileModule进行扩展,在我们的项目中就优化了FileModule,实现了对mp4、avi等各种格式的文件的点播支持。后面的章节我们详细讨论。

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

1. 根据路径获取或者创建ReflectorSession,并获取对应请求的sdp文件绝对路径;

[cpp] view
plain copy

 print?





//eg theFilepath = "D:\MSU\Movies\141212100702059760.sdp"  

char *theFilepath = NULL;  

ReflectorSession* theSession = DoSessionSetup(inParams, qtssRTSPReqFilePath, false, NULL, &theFilepath );  

OSCharArrayDeleter tempFilePath(theFilepath);  

DoSessionSetup方法主要是调用FindOrCreateSession来对哈希表sSessionMap进行查询。

a) 没有根据inPath路径在哈希表sSessionMap中找到对应的ReflectorSession,那么就new一个.

b) 如果找到了就直接获取theSession = (ReflectorSession*)theSessionRef->GetObject(); 

最后调用SetupReflectorSession()方法

2. 如果已经有一个输出会话附属到这个客户端会话,那么就删除之;

[cpp] view
plain copy

 print?





if (theErr == QTSS_NoErr && theOutput != NULL)  

    {     

        RemoveOutput(*theOutput, (*theOutput)->GetReflectorSession(), false);  

        RTPSessionOutput* theOutput = NULL;  

        (void)QTSS_SetValue(inParams->inClientSession, sOutputAttr, 0, &theOutput, sizeof(theOutput));          

    }  

3. 读取请求对应的sdp文件,将文件内容解析到StrPtrLen theFileData中;

4. 将连接信息清空,包括ip地址、端口号,如下面示例,同时增加一个字段a=control:*
 
操作前:c=IN IP4 192.168.10.177 
操作后:c=IN IP4 0.0.0.0

操作前:m=video 20094 RTP/AVP 96 
操作后:m=video 0 RTP/AVP

5. 检测sdp是否包含v、s、t、o这些字段,如果没有就构造补充进去;

6. SetSDPBuffer会调用SDP的解析方法paser(),在该方法内对SDP解析的同时,分析出该SDP是否合法,赋予属性fValid;

7. 将sdp的会话信息、媒体信息附在RTSP消息中响应给客户端.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: