Ctrl K
ComunidadGuías…

server/src/webrtc_stream.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/webrtc_stream.h
 * @brief Declarations for WebRTC session tracking and frame handoff.
 */
#pragma once

// standard includes
#include <chrono>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include <vector>

// 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<std::string> client_name;
    std::optional<std::string> client_uuid;

    std::optional<int> width;
    std::optional<int> height;
    std::optional<int> fps;
    std::optional<int> bitrate_kbps;
    std::optional<std::string> codec;
    std::optional<bool> hdr;
    std::optional<bool> yuv444;
    std::optional<int> audio_channels;
    std::optional<std::string> audio_codec;
      std::optional<std::string> profile;
      std::optional<int> app_id;
      std::optional<bool> resume;

      std::optional<std::string> video_pacing_mode;
      std::optional<int> video_pacing_slack_ms;
      std::optional<int> video_max_frame_age_ms;
  };

  struct SessionState {
    std::string id;
    bool audio = true;
    bool video = true;
    bool encoded = true;

    std::optional<std::string> client_name;
    std::optional<std::string> 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<int> width;
    std::optional<int> height;
    std::optional<int> fps;
    std::optional<int> bitrate_kbps;
    std::optional<std::string> codec;
    std::optional<bool> hdr;
    std::optional<bool> yuv444;
    std::optional<int> audio_channels;
    std::optional<std::string> audio_codec;
    std::optional<std::string> profile;
    std::optional<std::string> stream_gpu_model;
    std::optional<std::string> video_pacing_mode;
    std::optional<int> video_pacing_slack_ms;
    std::optional<int> video_max_frame_age_ms;
 
    std::optional<std::chrono::steady_clock::time_point> last_audio_time;
    std::optional<std::chrono::steady_clock::time_point> 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<SessionState> create_session(const SessionOptions &options);
  std::optional<std::string> ensure_capture_started(const SessionOptions &options);
  bool close_session(std::string_view id);
  std::optional<SessionState> get_session(std::string_view id);
  std::vector<SessionState> 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<platf::img_t> &frame);
  void submit_audio_frame(const std::vector<float> &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<IceCandidateInfo> 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