#ifndef REMOTING_PROTOCOL_SESSION_CONFIG_H_
#define REMOTING_PROTOCOL_SESSION_CONFIG_H_
#include <list>
#include <memory>
#include <string>
namespace remoting::protocol {
extern const int kDefaultStreamVersion;
struct ChannelConfig {
enum TransportType {
TRANSPORT_STREAM,
TRANSPORT_MUX_STREAM,
TRANSPORT_DATAGRAM,
TRANSPORT_NONE,
};
enum Codec {
CODEC_UNDEFINED,
CODEC_VERBATIM,
CODEC_ZIP,
CODEC_VP8,
CODEC_VP9,
CODEC_H264,
CODEC_OPUS,
CODEC_SPEEX,
CODEC_AV1,
};
static ChannelConfig None();
ChannelConfig() = default;
ChannelConfig(TransportType transport, int version, Codec codec);
bool operator==(const ChannelConfig& b) const;
TransportType transport = TRANSPORT_NONE;
int version = 0;
Codec codec = CODEC_UNDEFINED;
};
class CandidateSessionConfig;
class SessionConfig {
public:
enum class Protocol {
ICE,
WEBRTC,
};
static std::unique_ptr<SessionConfig> SelectCommon(
const CandidateSessionConfig* client_config,
const CandidateSessionConfig* host_config);
static std::unique_ptr<SessionConfig> GetFinalConfig(
const CandidateSessionConfig* candidate_config);
static std::unique_ptr<SessionConfig> ForTest();
static std::unique_ptr<SessionConfig> ForTestWithAudio();
static std::unique_ptr<SessionConfig> ForTestWithVerbatimVideo();
static std::unique_ptr<SessionConfig> ForTestWithWebrtc();
Protocol protocol() const { return protocol_; }
const ChannelConfig& control_config() const;
const ChannelConfig& event_config() const;
const ChannelConfig& video_config() const;
const ChannelConfig& audio_config() const;
bool is_audio_enabled() const {
return audio_config_.transport != ChannelConfig::TRANSPORT_NONE;
}
private:
SessionConfig(Protocol protocol);
const Protocol protocol_;
ChannelConfig control_config_;
ChannelConfig event_config_;
ChannelConfig video_config_;
ChannelConfig audio_config_;
};
class CandidateSessionConfig {
public:
static std::unique_ptr<CandidateSessionConfig> CreateEmpty();
static std::unique_ptr<CandidateSessionConfig> CreateFrom(
const SessionConfig& config);
static std::unique_ptr<CandidateSessionConfig> CreateDefault();
~CandidateSessionConfig();
bool webrtc_supported() const { return webrtc_supported_; }
void set_webrtc_supported(bool webrtc_supported) {
webrtc_supported_ = webrtc_supported;
}
bool ice_supported() const { return ice_supported_; }
void set_ice_supported(bool ice_supported) { ice_supported_ = ice_supported; }
const std::list<ChannelConfig>& control_configs() const {
return control_configs_;
}
std::list<ChannelConfig>* mutable_control_configs() {
return &control_configs_;
}
const std::list<ChannelConfig>& event_configs() const {
return event_configs_;
}
std::list<ChannelConfig>* mutable_event_configs() { return &event_configs_; }
const std::list<ChannelConfig>& video_configs() const {
return video_configs_;
}
std::list<ChannelConfig>* mutable_video_configs() { return &video_configs_; }
const std::list<ChannelConfig>& audio_configs() const {
return audio_configs_;
}
std::list<ChannelConfig>* mutable_audio_configs() { return &audio_configs_; }
bool IsSupported(const SessionConfig& config) const;
std::unique_ptr<CandidateSessionConfig> Clone() const;
void DisableAudioChannel();
void PreferTransport(ChannelConfig::TransportType transport);
private:
CandidateSessionConfig();
explicit CandidateSessionConfig(const CandidateSessionConfig& config);
CandidateSessionConfig& operator=(const CandidateSessionConfig& b);
bool webrtc_supported_ = false;
bool ice_supported_ = false;
std::list<ChannelConfig> control_configs_;
std::list<ChannelConfig> event_configs_;
std::list<ChannelConfig> video_configs_;
std::list<ChannelConfig> audio_configs_;
};
}
#endif