示例#1
0
int RtspClientSession::handle_insession(RtspClientConnection * rcc,
									std::string & cmd, 
									std::string & urlPreSuffix, 
									std::string & urlSuffix, 
									std::string & fullRequestStr){

	if (!m_mediaSession){
		rcc->handleCmd_notSupported();
		return -1;
	}

	//Look up the media subsession whose track id is "urlSuffix":
	MediaSubSession *subsession = NULL;
	if (!urlSuffix.empty() && urlPreSuffix == m_mediaSession->StreamName()){
		//rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0 
		m_mediaSession->Lookup(urlSuffix);
	}
	else if(urlSuffix == m_mediaSession->StreamName() || 
		(urlSuffix.empty() && urlPreSuffix == m_mediaSession->StreamName())){
		//rtsp://192.168.20.136:5000/xxx666
		//rtsp://192.168.20.136:5000/xxx666/
		// Aggregated operation
		subsession = m_mediaSession->GetSubSession(0);
	}
	else if(!urlPreSuffix.empty() && !urlSuffix.empty()){
		//rtsp://192.168.20.136:5000/media/xxx666
		// Aggregated operation, if <urlPreSuffix>/<urlSuffix> is the session (stream) name:
		std::string streamName = urlPreSuffix + "/" + urlSuffix;
		if(streamName == m_mediaSession->StreamName()){
			subsession = m_mediaSession->GetSubSession(0);
		}
	}
	
	if (!subsession){
		return rcc->handleCmd_notFound();
	}

	if(cmd == "PLAY")
		handle_play(rcc, subsession, fullRequestStr);
	else if(cmd == "PAUSE")
		handle_pause(rcc, subsession);
	else if(cmd == "GET_PARAMETER")
		handle_getparameter(rcc, subsession, fullRequestStr);
	else if(cmd == "SET_PARAMETER")
		handle_setparameter(rcc, subsession, fullRequestStr);
	else if(cmd == "TEARDOWN")
		handle_teardown(rcc, subsession, fullRequestStr);

	return 0;
}
示例#2
0
void parse_rtsp(){
	int str_len, cnt = 0;
	char *p, *q;
	char cmd[BUF_SIZE] = {0, };
	if((str_len = read(rtsp_sock, cmd, BUF_SIZE)) > 0){
		printf("-------------C -> S-------------\n"
			"%s\n", cmd);

		p = strtok(cmd, "\r\n");
		if (strstr(p,"OPTIONS") != NULL){
			rtspCmdType = RTSP_OPTIONS;
			p += 7;
		}else if (strstr(p,"DESCRIBE") != NULL){
			rtspCmdType = RTSP_DESCRIBE;
			p += 9;
		}else if (strstr(p,"SETUP") != NULL) {
			rtspCmdType = RTSP_SETUP;
			p += 6;
	   	}else if (strstr(p,"PLAY") != NULL) {
			rtspCmdType = RTSP_PLAY;
			p += 5;
   		}else if (strstr(p,"TEARDOWN") != NULL) {
			rtspCmdType = RTSP_TEARDOWN;
			p += 9;
		}else if(strstr(p, "PAUSE") != NULL){
			rtspCmdType = RTSP_PAUSE;
			p += 6;
		}else{
			printf("Command error\n");
			close(rtsp_sock);
			exit(-1);
		}
/*
		if(strstr(p, "rtsp://") != NULL && rtspCmdType == RTSP_OPTIONS)
        {
			p += 7;
			int i = 0;
			while(*p != '/')
				hostaddr[i++] = *(p++);
			hostaddr[i] = 0;

			i = 0;
			p++;
			while(*p != ' ')
				filename[i++] = *(p++);
			filename[i] = 0;
		}
        else
        {
			printf("URL error\n");
			close(rtsp_sock);
			exit(-1);
		}
*/
        hostaddr[0] = '1';
        hostaddr[1] = '9';
        hostaddr[2] = '2';
        hostaddr[3] = '.';
        hostaddr[4] = '1';
        hostaddr[5] = '6';
        hostaddr[6] = '8';
        hostaddr[7] = '.';
        hostaddr[8] = '5';
        hostaddr[9] = '6';
        hostaddr[10] = '.';
        hostaddr[11] = '1';
        hostaddr[12] = '0';
        hostaddr[13] = '2';
        hostaddr[14] = ':';
        hostaddr[15] = '3';
        hostaddr[16] = '0';
        hostaddr[17] = '0';
        hostaddr[18] = '5';
        hostaddr[19] = '\0';

        if(rtspCmdType == RTSP_OPTIONS)
        {
            char directive[32];
            char host[256];
            char version[32];
            char file_name[32];
            int pcnt;

            pcnt = sscanf(cmd, "%31s %255s %31s", directive, host, version);
            char *str_temp;
            str_temp = (char *) strrchr((char *)host, '/'); 
       
            file_name[0] = '.';
            file_name[1] = '.';
            file_name[2] = '/';
            file_name[3] = '.';
            file_name[4] = '.';
            file_name[5] = '/';
            file_name[6] = 'm';
            file_name[7] = 'e';
            file_name[8] = 'd';
            file_name[9] = 'i';
            file_name[10] = 'a';
            
            int i = 11;
            while(*str_temp != '\0')
            {
                file_name[i] = *(str_temp);
                
                if(i!=0)
                    filename[i-12]= *(str_temp);
                i++;
                str_temp++;
            }
            file_name[i] = '\0';
            filename[i-12]='\0';
            inputStream = fopen(file_name, "rb");
        }
		    
        p = strtok(NULL, "\r\n");
		
		if ((p = strstr(p, "CSeq")) != NULL)
        {
            p += 5;
			int i = 0;
			while(*p != 0)
			    cseq[i++] = *(p++);
			cseq[i] = 0;
		} 
        else
        {
            printf("CSeq error\n");
        }
		    

		if (rtspCmdType == RTSP_SETUP)
    	{
			p = strtok(NULL, "\r\n");
			p = strtok(NULL, "\r\n");
        	if ( strstr(p,"RTP/AVP/TCP") != NULL)
				transportMode = TCP;
			else
				transportMode = UDP;
			if((p = strstr(p, "client_port=")) != NULL){
				p += 12;
				int i = 0;
				char port[25] = {0, };
				while(*p != '-')
					port[i++] = *(p++);
				
				port[i] = 0;
				clientRTPPort = atoi(port);
				
				i = 0;
				p++;
				while(*p != 0){
					if(*p != '\r' || *p != '\n')
						port[i++] = *(p++);
				}
				port[i] = 0;
				clientRTCPPort = atoi(port);
			}	
		}
	}

/*	이게 이제 진짜로 읽을려고 해서, 이 부분도 fork로 따로 들어줘야 할 거 같음, 아니면 무한루프돔여기서 
 	if(streamer != NULL && streamer->rtcp_sock != 0)
    {
		while((str_len = read(streamer->rtcp_sock, cmd, BUF_SIZE)) > 0){
			printf("rtcp : %s\n", cmd);		
		}
	}
*/
	switch(rtspCmdType){
		case RTSP_OPTIONS : printf("option\n"); handle_option(); break;
		case RTSP_DESCRIBE : printf("describe\n"); handle_describe(); break;
		case RTSP_SETUP : printf("setup\n"); handle_setup(); break;
		case RTSP_PLAY : printf("play\n"); handle_play(); break;
		case RTSP_TEARDOWN : printf("teardown\n"); handle_teardown(); break;
		case RTSP_PAUSE : printf("pause\n"); handle_pause();break; 
		default : printf("Not implemented\n"); return;
	}
}