15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/session_config.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDefaultStreamVersion = 2;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The control channel version that supports the "capabilities" message.
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kControlStreamVersion = 3;
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kControlStreamVersionNoCapabilities = kDefaultStreamVersion;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChannelConfig ChannelConfig::None() {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ChannelConfig();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChannelConfig::ChannelConfig()
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport(TRANSPORT_NONE),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version(0),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codec(CODEC_UNDEFINED) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChannelConfig::ChannelConfig(TransportType transport, int version, Codec codec)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : transport(transport),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version(version),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codec(codec) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChannelConfig::operator==(const ChannelConfig& b) const {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the transport field is set to NONE then all other fields are irrelevant.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (transport == ChannelConfig::TRANSPORT_NONE)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport == b.transport;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transport == b.transport && version == b.version && codec == b.codec;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionConfig::SessionConfig() {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SessionConfig::SupportsCapabilities() const {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return control_config_.version >= kControlStreamVersion;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionConfig SessionConfig::ForTest() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionConfig result;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result.set_control_config(ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                          kControlStreamVersion,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ChannelConfig::CODEC_UNDEFINED));
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result.set_event_config(ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kDefaultStreamVersion,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ChannelConfig::CODEC_UNDEFINED));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.set_video_config(ChannelConfig(ChannelConfig::TRANSPORT_STREAM,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kDefaultStreamVersion,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ChannelConfig::CODEC_VP8));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.set_audio_config(ChannelConfig(ChannelConfig::TRANSPORT_NONE,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        kDefaultStreamVersion,
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        ChannelConfig::CODEC_UNDEFINED));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CandidateSessionConfig::CandidateSessionConfig() { }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CandidateSessionConfig::CandidateSessionConfig(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CandidateSessionConfig& config)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : control_configs_(config.control_configs_),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event_configs_(config.event_configs_),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      video_configs_(config.video_configs_),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      audio_configs_(config.audio_configs_) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CandidateSessionConfig::~CandidateSessionConfig() { }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CandidateSessionConfig::Select(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CandidateSessionConfig* client_config,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionConfig* result) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelConfig control_config;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelConfig event_config;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelConfig video_config;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChannelConfig audio_config;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SelectCommonChannelConfig(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          control_configs_, client_config->control_configs_, &control_config) ||
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !SelectCommonChannelConfig(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          event_configs_, client_config->event_configs_, &event_config) ||
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !SelectCommonChannelConfig(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          video_configs_, client_config->video_configs_, &video_config) ||
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !SelectCommonChannelConfig(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          audio_configs_, client_config->audio_configs_, &audio_config)) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_control_config(control_config);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_event_config(event_config);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_video_config(video_config);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_audio_config(audio_config);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CandidateSessionConfig::IsSupported(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionConfig& config) const {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IsChannelConfigSupported(control_configs_, config.control_config()) &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IsChannelConfigSupported(event_configs_, config.event_config()) &&
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IsChannelConfigSupported(video_configs_, config.video_config()) &&
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IsChannelConfigSupported(audio_configs_, config.audio_config());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CandidateSessionConfig::GetFinalConfig(SessionConfig* result) const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (control_configs_.size() != 1 ||
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event_configs_.size() != 1 ||
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      video_configs_.size() != 1 ||
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      audio_configs_.size() != 1) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_control_config(control_configs_.front());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_event_config(event_configs_.front());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_video_config(video_configs_.front());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->set_audio_config(audio_configs_.front());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CandidateSessionConfig::SelectCommonChannelConfig(
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::list<ChannelConfig>& host_configs,
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::list<ChannelConfig>& client_configs,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChannelConfig* config) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Usually each of these vectors will contain just several elements,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so iterating over all of them is not a problem.
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::list<ChannelConfig>::const_iterator it;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it = client_configs.begin(); it != client_configs.end(); ++it) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsChannelConfigSupported(host_configs, *it)) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *config = *it;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CandidateSessionConfig::IsChannelConfigSupported(
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::list<ChannelConfig>& vector,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ChannelConfig& value) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::find(vector.begin(), vector.end(), value) != vector.end();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CandidateSessionConfig> CandidateSessionConfig::Clone() const {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<CandidateSessionConfig>(new CandidateSessionConfig(*this));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CandidateSessionConfig> CandidateSessionConfig::CreateEmpty() {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<CandidateSessionConfig>(new CandidateSessionConfig());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CandidateSessionConfig> CandidateSessionConfig::CreateFrom(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SessionConfig& config) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CandidateSessionConfig> result = CreateEmpty();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_control_configs()->push_back(config.control_config());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_event_configs()->push_back(config.event_config());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_video_configs()->push_back(config.video_config());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_audio_configs()->push_back(config.audio_config());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.Pass();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CandidateSessionConfig> CandidateSessionConfig::CreateDefault() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CandidateSessionConfig> result = CreateEmpty();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control channel.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_control_configs()->push_back(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    kControlStreamVersion,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    ChannelConfig::CODEC_UNDEFINED));
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  result->mutable_control_configs()->push_back(
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    kControlStreamVersionNoCapabilities,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ChannelConfig::CODEC_UNDEFINED));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Event channel.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_event_configs()->push_back(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    kDefaultStreamVersion,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ChannelConfig::CODEC_UNDEFINED));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Video channel.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_video_configs()->push_back(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_STREAM,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    kDefaultStreamVersion,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ChannelConfig::CODEC_VP8));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Audio channel.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_audio_configs()->push_back(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_MUX_STREAM,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    kDefaultStreamVersion,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ChannelConfig::CODEC_OPUS));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->mutable_audio_configs()->push_back(ChannelConfig::None());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.Pass();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CandidateSessionConfig::DisableAudioChannel() {
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mutable_audio_configs()->clear();
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mutable_audio_configs()->push_back(ChannelConfig());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CandidateSessionConfig::EnableVideoCodec(ChannelConfig::Codec codec) {
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mutable_video_configs()->push_front(
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ChannelConfig(ChannelConfig::TRANSPORT_STREAM,
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    kDefaultStreamVersion,
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    codec));
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
224