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