diff --git a/moonlight-common-c b/moonlight-common-c index 801aaf43..f5ae5df5 160000 --- a/moonlight-common-c +++ b/moonlight-common-c @@ -1 +1 @@ -Subproject commit 801aaf43d6124da294a8c97e5b67e966f1b4edbf +Subproject commit f5ae5df5d0689084293dbce3c20a6ff2322c9c2c diff --git a/stream.cpp b/stream.cpp index 81ef0e42..b46f7042 100644 --- a/stream.cpp +++ b/stream.cpp @@ -349,7 +349,7 @@ video::packet_t next_packet(uint16_t &frame, std::shared_ptr replace(const std::string_view &original, const std::string_view &old, const std::string_view &_new) { std::vector replaced; @@ -369,6 +369,19 @@ std::vector replace(const std::string_view &original, const std::string return replaced; } +*/ +std::vector replace(const std::string_view &original, const std::string_view &old, const std::string_view &_new) { + std::vector replaced; + + auto begin = std::begin(original); + auto next = std::search(begin, std::end(original), std::begin(old), std::end(old)); + + std::copy(begin, next, std::back_inserter(replaced)); + std::copy(std::begin(_new), std::end(_new), std::back_inserter(replaced)); + std::copy(next + old.size(), std::end(original), std::back_inserter(replaced)); + + return replaced; +} void server_t::map(uint16_t type, std::function cb) { _map_type_cb.emplace(type, std::move(cb)); @@ -636,7 +649,7 @@ void videoThread() { sock.send_to(asio::buffer(shards[x]), *peer); } - // std::cout << "Frame ["sv << packet->pts << "] :: send ["sv << shards.size() << "] shards..."sv << std::endl; + std::cout << "Frame ["sv << packet->pts << "] :: send ["sv << shards.size() << "] shards..."sv << std::endl; lowseq += shards.size(); } @@ -746,6 +759,7 @@ void cmd_announce(tcp::socket &&sock, msg_t &&req) { } std::string_view payload { req->payload, (size_t)req->payloadLength }; + std::vector lines; auto whitespace = [](char ch) { @@ -854,16 +868,32 @@ void rtpThread() { tcp::socket sock { io }; acceptor.accept(sock); - sock.set_option(tcp::no_delay(true)); - std::array buf; + std::array rtsp_raw; - auto len = sock.read_some(asio::buffer(buf)); - buf[std::min(buf.size(), len)] = '\0'; + // As defined in moonlight-common-c/src/PlatformSockets.c + constexpr auto TCPv4_MSS = 536; + constexpr auto TCPv6_MSS = 1220; + + std::size_t len = 0; + + auto pos = std::begin(rtsp_raw); + do { + std::array buf; + auto bytes_read = sock.receive(asio::buffer(buf)); + + if(bytes_read + len > rtsp_raw.size()) { + continue; + } + + std::copy(std::begin(buf), std::end(buf), pos + len); + len += bytes_read; + } while((len % TCPv4_MSS) == 0); + + rtsp_raw[std::min(rtsp_raw.size() -1, len)] = '\0'; msg_t req { new RTSP_MESSAGE {} }; - - parseRtspMessage(req.get(), buf.data(), len); + parseRtspMessage(req.get(), rtsp_raw.data(), len); print_msg(req.get());