Index: remoting/protocol/content_description.cc |
diff --git a/remoting/protocol/content_description.cc b/remoting/protocol/content_description.cc |
index c88a36262df02dd7cc7d81d1657216b14bd7bd46..d55163f14c01a841c6b7344f87d2ddc863da80e0 100644 |
--- a/remoting/protocol/content_description.cc |
+++ b/remoting/protocol/content_description.cc |
@@ -27,6 +27,7 @@ const char kDescriptionTag[] = "description"; |
const char kControlTag[] = "control"; |
const char kEventTag[] = "event"; |
const char kVideoTag[] = "video"; |
+const char kAudioTag[] = "audio"; |
const char kDeprecatedResolutionTag[] = "initial-resolution"; |
const char kTransportAttr[] = "transport"; |
@@ -37,10 +38,12 @@ const char kDeprecatedHeightAttr[] = "height"; |
const char kStreamTransport[] = "stream"; |
const char kDatagramTransport[] = "datagram"; |
+const char kNoneTransport[] = "none"; |
const char kVerbatimCodec[] = "verbatim"; |
const char kVp8Codec[] = "vp8"; |
const char kZipCodec[] = "zip"; |
+const char kVorbisCodec[] = "vorbis"; |
const char* GetTransportName(ChannelConfig::TransportType type) { |
switch (type) { |
@@ -48,6 +51,8 @@ const char* GetTransportName(ChannelConfig::TransportType type) { |
return kStreamTransport; |
case ChannelConfig::TRANSPORT_DATAGRAM: |
return kDatagramTransport; |
+ case ChannelConfig::TRANSPORT_NONE: |
+ return kNoneTransport; |
} |
NOTREACHED(); |
return NULL; |
@@ -61,6 +66,8 @@ const char* GetCodecName(ChannelConfig::Codec type) { |
return kVp8Codec; |
case ChannelConfig::CODEC_ZIP: |
return kZipCodec; |
+ case ChannelConfig::CODEC_VORBIS: |
+ return kVorbisCodec; |
default: |
break; |
} |
@@ -97,6 +104,8 @@ bool ParseTransportName(const std::string& value, |
*transport = ChannelConfig::TRANSPORT_STREAM; |
} else if (value == kDatagramTransport) { |
*transport = ChannelConfig::TRANSPORT_DATAGRAM; |
+ } else if (value == kNoneTransport) { |
+ *transport = ChannelConfig::TRANSPORT_NONE; |
} else { |
return false; |
} |
@@ -110,6 +119,8 @@ bool ParseCodecName(const std::string& value, ChannelConfig::Codec* codec) { |
*codec = ChannelConfig::CODEC_VP8; |
} else if (value == kZipCodec) { |
*codec = ChannelConfig::CODEC_ZIP; |
+ } else if (value == kVorbisCodec) { |
+ *codec = ChannelConfig::CODEC_VORBIS; |
} else { |
return false; |
} |
@@ -163,6 +174,7 @@ ContentDescription* ContentDescription::Copy() const { |
// <control transport="stream" version="1" /> |
// <event transport="datagram" version="1" /> |
// <video transport="stream" codec="vp8" version="1" /> |
+// <audio transport="stream" codec="vorbis" version="1" /> |
// <authentication> |
// Message created by Authenticator implementation. |
// </authentication> |
@@ -189,6 +201,11 @@ XmlElement* ContentDescription::ToXml() const { |
root->AddElement(FormatChannelConfig(*it, kVideoTag)); |
} |
+ for (it = config()->audio_configs().begin(); |
+ it != config()->audio_configs().end(); ++it) { |
+ root->AddElement(FormatChannelConfig(*it, kAudioTag)); |
+ } |
+ |
// Older endpoints require an initial-resolution tag, but otherwise ignore it. |
XmlElement* resolution_tag = new XmlElement( |
QName(kChromotingXmlNamespace, kDeprecatedResolutionTag)); |
@@ -245,6 +262,25 @@ ContentDescription* ContentDescription::ParseXml( |
child = child->NextNamed(video_tag); |
} |
+ // <audio> tags. |
+ QName audio_tag(kChromotingXmlNamespace, kAudioTag); |
+ child = element->FirstNamed(audio_tag); |
+ if (!child) { |
+ // If there's no mention of audio, implicitly assume |
+ // TRANSPORT_NONE for the audio_channel. |
+ ChannelConfig no_audio(ChannelConfig::TRANSPORT_NONE, |
+ kDefaultStreamVersion, |
+ ChannelConfig::CODEC_VERBATIM); |
+ config->mutable_audio_configs()->push_back(no_audio); |
+ } |
+ while (child) { |
+ ChannelConfig channel_config; |
+ if (!ParseChannelConfig(child, true, &channel_config)) |
+ return NULL; |
+ config->mutable_audio_configs()->push_back(channel_config); |
+ child = child->NextNamed(audio_tag); |
+ } |
+ |
scoped_ptr<XmlElement> authenticator_message; |
child = Authenticator::FindAuthenticatorMessage(element); |
if (child) |