Setup消息进入到DoSetup函数单独处理,处理流程如下:
【转载请注明出处】:http://blog.youkuaiyun.com/longlong530
1. 根据关键字qtssRTSPReqTransportMode判断是否为推模式,具体isPush值由Setup请求中的mode值有关,mode="receive" || mode="record"表示isPush为true。对应的解析函数为:void RTSPRequest::ParseModeSubHeader(StrPtrLen* inModeSubHeader)
- StrPtrLen theMode;
- theSubHeaderParser.ConsumeWord(&theMode);
-
- if ( theMode.EqualIgnoreCase(sReceiveMode) || theMode.EqualIgnoreCase(sRecordMode) )
- {
- fTransportMode = qtssRTPTransportModeRecord;
- break;
- }
2. 查询是否已经建立RTPSessionOutput。
1.1) 如果没有,且是从UI发来的标准RTSP客户端请求,那么
-
- RTPSessionOutput* theNewOutput = NEW RTPSessionOutput(inParams->inClientSession, theSession, sServerPrefs, sStreamCookieAttr );
- theSession->AddOutput(theNewOutput,true);
-
- (void)QTSS_SetValue(inParams->inClientSession, sOutputAttr, 0, &theNewOutput, sizeof(theNewOutput));
1.2) 如果isPush = true,代表为Announce推流中的SETUP消息,那么
-
-
-
- theSession = DoSessionSetup(inParams, qtssRTSPReqFilePathTrunc,isPush,&foundSession);
2) 如果已经存在输出会话,即直接调用。
3. 解析track ID,后面会根据这个track id来获取流信息
- char* theDigitStr = NULL;
- void)QTSS_GetValueAsString(inParams->inRTSPRequest, qtssRTSPReqFileDigit, 0, &theDigitStr);
- QTSSCharArrayDeleter theDigitStrDeleter(theDigitStr);
4. 如果是推流模式:
-
- theStreamInfo->fSetupToReceive = true;
-
-
- theErr = QTSS_SetValue(inParams->inClientSession, sClientBroadcastSessionAttr, 0, &theSession, sizeof(theSession));
- Assert(theErr == QTSS_NoErr);
-
- if (theSession != NULL)
- theSession->AddBroadcasterClientSession(inParams);