Chromium Code Reviews| Index: remoting/protocol/sdp_helper.cc |
| diff --git a/remoting/protocol/sdp_helper.cc b/remoting/protocol/sdp_helper.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e74acf180e181273e0002ac11742aae25f355c06 |
| --- /dev/null |
| +++ b/remoting/protocol/sdp_helper.cc |
| @@ -0,0 +1,66 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "remoting/protocol/sdp_helper.h" |
| + |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| + |
| +namespace remoting { |
| +namespace protocol { |
| + |
| +SdpHelper::SdpHelper(const std::string& sdp) { |
| + sdp_lines_ = |
| + SplitString(sdp, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
| + for (auto& line : sdp_lines_) { |
|
Jamie
2016/11/28 21:02:51
const auto?
Sergey Ulanov
2016/11/28 22:45:08
Done.
|
| + if (base::StartsWith(line, "m=audio", base::CompareCase::SENSITIVE)) |
| + has_audio_ = true; |
| + if (base::StartsWith(line, "m=video", base::CompareCase::SENSITIVE)) |
| + has_video_ = true; |
| + } |
| +} |
| + |
| +SdpHelper::~SdpHelper() {} |
| + |
| +std::string SdpHelper::ToString() const { |
| + return base::JoinString(sdp_lines_, "\n") + "\n"; |
| +} |
| + |
| +bool SdpHelper::AddCodecParameter(const std::string& codec, |
| + const std::string& parameters_to_add) { |
| + int line_num; |
| + std::string payload_type; |
| + bool codec_found = FindCodec(codec, &line_num, &payload_type); |
| + if (!codec_found) { |
| + return false; |
| + } |
| + sdp_lines_.insert(sdp_lines_.begin() + line_num + 1, |
| + "a=fmtp:" + payload_type + ' ' + parameters_to_add); |
| + return true; |
| +} |
| + |
| +bool SdpHelper::FindCodec(const std::string& codec, |
| + int* line_num, |
| + std::string* payload_type) const { |
| + const std::string kRtpMapPrefix = "a=rtpmap:"; |
| + for (size_t i = 0; i < sdp_lines_.size(); ++i) { |
| + auto& line = sdp_lines_[i]; |
|
Jamie
2016/11/28 21:02:51
const?
Sergey Ulanov
2016/11/28 22:45:08
Done.
|
| + if (!base::StartsWith(line, kRtpMapPrefix, base::CompareCase::SENSITIVE)) |
| + continue; |
| + size_t space_pos = line.find(' '); |
| + if (space_pos == std::string::npos) |
| + continue; |
| + if (line.substr(space_pos + 1, codec.size()) == codec && |
|
Jamie
2016/11/28 21:02:51
Can we assume there will be only one space between
Sergey Ulanov
2016/11/28 22:45:08
Yes, I think we can assume that. The standard defi
|
| + line[space_pos + 1 + codec.size()] == '/') { |
| + *line_num = i; |
| + *payload_type = |
| + line.substr(kRtpMapPrefix.size(), space_pos - kRtpMapPrefix.size()); |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| +} // namespace protocol |
| +} // namespace remoting |