[위 에] [Darwin 학습 노트] 의 QTS SReflector Module 의 Setup 메시지 처리

Setup 메 시 지 는 DoSetup 함수 에 들 어가 서 단독으로 처리 합 니 다. 처리 절 차 는 다음 과 같 습 니 다.
[전재 출처 밝 혀 주세요]:http://blog.csdn.net/longlong530
1. 키워드 qtssRTSPReq TransportMode 에 따라 푸 시 모드 인지 여 부 를 판단 합 니 다. 구체 적 인 isPush 값 은 Setup 요청 중의 mode 값 과 관련 이 있 습 니 다. mode = "receive" | mode = "record" 는 isPush 를 true 로 표시 합 니 다.대응 하 는 해석 함 수 는: void RTSPRequest:: ParseModeSubHeader (StrPtrLen * inModeSubHeader)
StrPtrLen theMode;
theSubHeaderParser.ConsumeWord(&theMode);
//mode="receive" || mode="record"  isPush true,     。
if ( theMode.EqualIgnoreCase(sReceiveMode) || theMode.EqualIgnoreCase(sRecordMode) )
{	
    fTransportMode = qtssRTPTransportModeRecord;
    break;
}

2. RTPSession Output 을 만 들 었 는 지 확인 합 니 다.
1.1)    없 으 며 UI 에서 보 내 온 표준 RTSP 클 라 이언 트 요청 이 라면
//         (    );
 RTPSessionOutput* theNewOutput = NEW RTPSessionOutput(inParams->inClientSession, theSession, sServerPrefs, sStreamCookieAttr );
 theSession->AddOutput(theNewOutput,true);
 //    RTPSessionOutput    ,key = sOutputAttr;
 (void)QTSS_SetValue(inParams->inClientSession, sOutputAttr, 0, &theNewOutput, sizeof(theNewOutput));
1.2)   만약 isPush = true, Announce 가 흐 르 는 SETUP 소식 을 대표 한다 면,
/*
    Announce    qtssRTSPReqLocalPath     sdp  ,  DoSessionSetup         ReflectorSession<span style="font-family: Arial, Helvetica, sans-serif;">    </span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
*/
 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;
        // This is an incoming data session. Set the Reflector Session in the ClientSession
		//       RTPSession   sClientBroadcastSessionAttr  
        theErr = QTSS_SetValue(inParams->inClientSession, sClientBroadcastSessionAttr, 0, &theSession, sizeof(theSession));
        Assert(theErr == QTSS_NoErr);
        //  ReflectorSession fBroadcasterSession   inParams->inClientSession
        if (theSession != NULL)
            theSession->AddBroadcasterClientSession(inParams);

[전재 출처 밝 혀 주세요]:http://blog.csdn.net/longlong530

좋은 웹페이지 즐겨찾기