MCPcopy Create free account
hub / github.com/Barracuda09/SATPI / processStreamingRequest

Method processStreamingRequest

src/Stream.cpp:358–444  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

356}
357
358bool 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;

Callers

nothing calls this directly

Calls 12

setCSeqMethod · 0.80
setUserAgentMethod · 0.80
setIPAddressOfStreamMethod · 0.80
getIPAddressOfSocketMethod · 0.80
findMethod · 0.80
setupSocketStructureMethod · 0.80
getIPAddressOfStreamMethod · 0.80
restartWatchDogMethod · 0.80
parseStreamStringMethod · 0.45
hasDeviceDataChangedMethod · 0.45
pauseStreamingMethod · 0.45

Tested by

no test coverage detected