/** * @file src/webrtc_stream.h * @brief Declarations for WebRTC session tracking and frame handoff. */ #pragma once // standard includes #include #include #include #include #include #include #include // local includes #include "audio.h" #include "video.h" namespace webrtc_stream { struct SessionOptions { bool audio = true; bool video = true; bool encoded = true; bool host_audio = false; std::optional client_name; std::optional client_uuid; std::optional width; std::optional height; std::optional fps; std::optional bitrate_kbps; std::optional codec; std::optional hdr; std::optional yuv444; std::optional audio_channels; std::optional audio_codec; std::optional profile; std::optional app_id; std::optional resume; std::optional video_pacing_mode; std::optional video_pacing_slack_ms; std::optional video_max_frame_age_ms; }; struct SessionState { std::string id; bool audio = true; bool video = true; bool encoded = true; std::optional client_name; std::optional client_uuid; std::uint64_t audio_packets = 0; std::uint64_t video_packets = 0; std::uint64_t audio_dropped = 0; std::uint64_t video_dropped = 0; std::size_t audio_queue_frames = 0; std::size_t video_queue_frames = 0; std::uint32_t video_inflight_frames = 0; bool has_remote_offer = false; bool has_local_answer = false; std::size_t ice_candidates = 0; std::optional width; std::optional height; std::optional fps; std::optional bitrate_kbps; std::optional codec; std::optional hdr; std::optional yuv444; std::optional audio_channels; std::optional audio_codec; std::optional profile; std::optional stream_gpu_model; std::optional video_pacing_mode; std::optional video_pacing_slack_ms; std::optional video_max_frame_age_ms; std::optional last_audio_time; std::optional last_video_time; std::size_t last_audio_bytes = 0; std::size_t last_video_bytes = 0; std::uint64_t video_bytes_total = 0; std::uint64_t audio_bytes_total = 0; bool last_video_idr = false; std::int64_t last_video_frame_index = 0; }; bool has_active_sessions(); unsigned int active_session_count(); bool has_active_or_pending_sessions(); bool has_capture_active(); // True while a WebRTC close is completing peer, media, capture, display, // platform, or configuration cleanup after its active count drops. bool has_teardown_in_progress(); unsigned int teardown_session_count(); std::optional create_session(const SessionOptions &options); std::optional ensure_capture_started(const SessionOptions &options); bool close_session(std::string_view id); std::optional get_session(std::string_view id); std::vector list_sessions(); void shutdown_all_sessions(); void submit_video_packet(video::packet_raw_t &packet); void submit_audio_packet(const audio::buffer_t &packet); void submit_video_frame(const std::shared_ptr &frame); void submit_audio_frame(const std::vector &samples, int sample_rate, int channels, int frames); void set_rtsp_sessions_active(bool active); void set_rtsp_capture_config(const video::config_t &video_config, const audio::config_t &audio_config); bool set_remote_offer(std::string_view id, const std::string &sdp, const std::string &type); bool add_ice_candidate(std::string_view id, std::string mid, int mline_index, std::string candidate); bool set_local_answer(std::string_view id, const std::string &sdp, const std::string &type); bool get_local_answer(std::string_view id, std::string &sdp_out, std::string &type_out); bool wait_for_local_answer( std::string_view id, std::string &sdp_out, std::string &type_out, std::chrono::milliseconds timeout ); std::string get_negotiation_error(std::string_view id); bool add_local_candidate(std::string_view id, std::string mid, int mline_index, std::string candidate); struct IceCandidateInfo { std::string mid; int mline_index = -1; std::string candidate; std::size_t index = 0; }; std::vector get_local_candidates(std::string_view id, std::size_t since); std::string get_server_cert_fingerprint(); std::string get_server_cert_pem(); } // namespace webrtc_stream