天天看点

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

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

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

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

//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. 如果已经有一个输出会话附属到这个客户端会话,那么就删除之;

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消息中响应给客户端.

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

声明:http://94it.net/  这个网站的赵红霞一直在剽窃我的博客,行为及其恶劣!