| 2146 | } |
| 2147 | |
| 2148 | std::shared_ptr<session_t> alloc(config_t &config, rtsp_stream::launch_session_t &launch_session) { |
| 2149 | auto session = std::make_shared<session_t>(); |
| 2150 | |
| 2151 | auto mail = std::make_shared<safe::mail_raw_t>(); |
| 2152 | |
| 2153 | session->shutdown_event = mail->event<bool>(mail::shutdown); |
| 2154 | session->launch_session_id = launch_session.id; |
| 2155 | session->device_name = launch_session.device_name; |
| 2156 | session->device_uuid = launch_session.unique_id; |
| 2157 | session->permission = launch_session.perm; |
| 2158 | |
| 2159 | session->do_cmds = std::move(launch_session.client_do_cmds); |
| 2160 | session->undo_cmds = std::move(launch_session.client_undo_cmds); |
| 2161 | |
| 2162 | session->config = config; |
| 2163 | |
| 2164 | session->control.connect_data = launch_session.control_connect_data; |
| 2165 | session->control.feedback_queue = mail->queue<platf::gamepad_feedback_msg_t>(mail::gamepad_feedback); |
| 2166 | session->control.hdr_queue = mail->event<video::hdr_info_t>(mail::hdr); |
| 2167 | session->control.legacy_input_enc_iv = launch_session.iv; |
| 2168 | session->control.cipher = crypto::cipher::gcm_t { |
| 2169 | launch_session.gcm_key, |
| 2170 | false |
| 2171 | }; |
| 2172 | |
| 2173 | session->video.idr_events = mail->event<bool>(mail::idr); |
| 2174 | session->video.invalidate_ref_frames_events = mail->event<std::pair<int64_t, int64_t>>(mail::invalidate_ref_frames); |
| 2175 | session->video.lowseq = 0; |
| 2176 | session->video.ping_payload = launch_session.av_ping_payload; |
| 2177 | if (config.encryptionFlagsEnabled & SS_ENC_VIDEO) { |
| 2178 | BOOST_LOG(info) << "Video encryption enabled"sv; |
| 2179 | session->video.cipher = crypto::cipher::gcm_t { |
| 2180 | launch_session.gcm_key, |
| 2181 | false |
| 2182 | }; |
| 2183 | session->video.gcm_iv_counter = 0; |
| 2184 | } |
| 2185 | |
| 2186 | constexpr auto max_block_size = crypto::cipher::round_to_pkcs7_padded(2048); |
| 2187 | |
| 2188 | util::buffer_t<char> shards {RTPA_TOTAL_SHARDS * max_block_size}; |
| 2189 | util::buffer_t<uint8_t *> shards_p {RTPA_TOTAL_SHARDS}; |
| 2190 | |
| 2191 | for (auto x = 0; x < RTPA_TOTAL_SHARDS; ++x) { |
| 2192 | shards_p[x] = (uint8_t *) &shards[x * max_block_size]; |
| 2193 | } |
| 2194 | |
| 2195 | // Audio FEC spans multiple audio packets, |
| 2196 | // therefore its session specific |
| 2197 | session->audio.shards = std::move(shards); |
| 2198 | session->audio.shards_p = std::move(shards_p); |
| 2199 | |
| 2200 | session->audio.fec_packet.rtp.header = 0x80; |
| 2201 | session->audio.fec_packet.rtp.packetType = 127; |
| 2202 | session->audio.fec_packet.rtp.timestamp = 0; |
| 2203 | session->audio.fec_packet.rtp.ssrc = 0; |
| 2204 | |
| 2205 | session->audio.fec_packet.fecHeader.payloadType = 97; |
no test coverage detected