| 356 | } |
| 357 | |
| 358 | bool Stream::processStreamingRequest(const std::string &msg, const int clientID, const std::string &method) { |
| 359 | base::MutexLock lock(_mutex); |
| 360 | |
| 361 | // Save clients seq number |
| 362 | const std::string cseq = StringConverter::getHeaderFieldParameter(msg, "CSeq:"); |
| 363 | if (!cseq.empty()) { |
| 364 | _client[clientID].setCSeq(std::stoi(cseq)); |
| 365 | } |
| 366 | |
| 367 | // Save clients User-Agent |
| 368 | const std::string userAgent = StringConverter::getHeaderFieldParameter(msg, "User-Agent:"); |
| 369 | if (!userAgent.empty()) { |
| 370 | _client[clientID].setUserAgent(userAgent); |
| 371 | } |
| 372 | |
| 373 | if ((method == "SETUP" || method == "PLAY" || method == "GET") && |
| 374 | StringConverter::hasTransportParameters(msg)) { |
| 375 | _device->parseStreamString(msg, method); |
| 376 | } |
| 377 | |
| 378 | // Channel changed?.. stop/pause Stream |
| 379 | if (_device->hasDeviceDataChanged()) { |
| 380 | if (_streaming) { |
| 381 | _streaming->pauseStreaming(clientID); |
| 382 | } |
| 383 | } |
| 384 | |
| 385 | // Get transport type from request, and maybe ports |
| 386 | if (_streamingType == StreamingType::NONE) { |
| 387 | if (method == "GET") { |
| 388 | _streamingType = StreamingType::HTTP; |
| 389 | _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::FILE_DESCRIPTOR); |
| 390 | _client[clientID].setIPAddressOfStream(_client[clientID].getIPAddressOfSocket()); |
| 391 | } else { |
| 392 | const std::string transport = StringConverter::getHeaderFieldParameter(msg, "Transport:"); |
| 393 | if (transport.find("unicast") != std::string::npos) { |
| 394 | // First check 'RTP/AVP/TCP' then 'RTP/AVP' |
| 395 | if (transport.find("RTP/AVP/TCP") != std::string::npos) { |
| 396 | _streamingType = StreamingType::RTP_TCP; |
| 397 | } else if (transport.find("RTP/AVP") != std::string::npos) { |
| 398 | _streamingType = StreamingType::RTSP_UNICAST; |
| 399 | } |
| 400 | _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::WATCHDOG); |
| 401 | } else if (transport.find("multicast") != std::string::npos) { |
| 402 | _streamingType = StreamingType::RTSP_MULTICAST; |
| 403 | _client[clientID].setSessionTimeoutCheck(StreamClient::SessionTimeoutCheck::TEARDOWN); |
| 404 | } |
| 405 | } |
| 406 | } |
| 407 | |
| 408 | switch (_streamingType) { |
| 409 | case StreamingType::RTP_TCP: { |
| 410 | const int interleaved = StringConverter::getIntParameter(msg, "Transport:", "interleaved="); |
| 411 | if (interleaved != -1) { |
| 412 | _client[clientID].setIPAddressOfStream(_client[clientID].getIPAddressOfSocket()); |
| 413 | } |
| 414 | } |
| 415 | break; |
nothing calls this directly
no test coverage detected