fangorn/sunshine-qemu
public
ref:main
/**
* @file src/rtsp.h
* @brief Declarations for RTSP streaming.
*/
#pragma once
// standard includes
#include <atomic>
// local includes
#include "crypto.h"
#include "thread_safe.h"
namespace rtsp_stream {
constexpr auto RTSP_SETUP_PORT = 21; ///< GameStream base-port offset used for the RTSP setup listener.
/**
* @brief RTSP launch session state shared with stream setup.
*/
struct launch_session_t {
uint32_t id; ///< RTSP launch-session identifier assigned before stream startup.
crypto::aes_t gcm_key; ///< AES-GCM key negotiated for encrypted RTSP messages.
crypto::aes_t iv; ///< Initial RTSP AES-GCM IV supplied by the client.
std::string av_ping_payload; ///< AV ping payload.
uint32_t control_connect_data; ///< Client-provided token used when connecting the control channel.
bool host_audio; ///< Whether host audio should be played locally.
std::string unique_id; ///< Moonlight client unique identifier for this launch request.
int width; ///< Frame or display width in pixels.
int height; ///< Frame or display height in pixels.
int fps; ///< Requested video frame rate.
int gcmap; ///< Game controller mapping requested by the client.
int appid; ///< Application ID requested for launch or resume.
int surround_info; ///< Encoded GameStream surround-sound capability flags.
std::string surround_params; ///< Client-provided surround-sound layout parameters.
bool continuous_audio; ///< Whether audio packets continue during silence.
bool enable_hdr; ///< Whether HDR streaming is requested.
bool enable_sops; ///< Whether sequence output protection is requested.
std::string client_name; ///< Friendly client name from initial pairing.
std::optional<crypto::cipher::gcm_t> rtsp_cipher; ///< AES-GCM cipher used once encrypted RTSP is negotiated.
std::string rtsp_url_scheme; ///< URL scheme selected by the RTSP SETUP flow.
uint32_t rtsp_iv_counter; ///< Counter value mixed into encrypted RTSP IVs.
std::string client_cert; ///< PEM certificate for the paired Moonlight client.
};
/**
* @brief Queue a launch session until the RTSP client connects.
*
* @param launch_session Session state prepared by the GameStream launch handler.
*/
void launch_session_raise(std::shared_ptr<launch_session_t> launch_session);
/**
* @brief Clear state for the specified launch session.
* @param launch_session_id The ID of the session to clear.
*/
void launch_session_clear(uint32_t launch_session_id);
/**
* @brief Get the number of active sessions.
* @return Count of active sessions.
*/
int session_count();
/**
* @brief Terminates all running streaming sessions.
*/
void terminate_sessions();
/**
* @brief Terminate active sessions associated with a client certificate.
*
* @param cert Certificate data or object used by the operation.
*/
void terminate_sessions_by_cert(std::string_view cert);
/**
* @brief Runs the RTSP server loop.
*/
void start();
} // namespace rtsp_stream