Added media constructor from SDP

This commit is contained in:
Paul-Louis Ageneau
2020-09-09 21:37:05 +02:00
parent 66e05677e4
commit f720cbac0c
2 changed files with 34 additions and 13 deletions

View File

@ -75,7 +75,7 @@ public:
virtual string generateSdp(string_view eol) const; virtual string generateSdp(string_view eol) const;
protected: protected:
Entry(string mline, string mid = "", Direction dir = Direction::Unknown); Entry(const string &mline, string mid, Direction dir = Direction::Unknown);
std::vector<string> mAttributes; std::vector<string> mAttributes;
@ -113,7 +113,8 @@ public:
// Media (non-data) // Media (non-data)
class Media : public Entry { class Media : public Entry {
public: public:
Media(string mline, string mid = "media", Direction dir = Direction::SendOnly); Media(const string &sdp);
Media(const string &mline, string mid, Direction dir = Direction::SendOnly);
Media(const Media &other) = default; Media(const Media &other) = default;
Media(Media &&other) = default; Media(Media &&other) = default;
virtual ~Media() = default; virtual ~Media() = default;

View File

@ -365,13 +365,14 @@ Description::media(int index) const {
int Description::mediaCount() const { return int(mEntries.size()); } int Description::mediaCount() const { return int(mEntries.size()); }
Description::Entry::Entry(string mline, string mid, Direction dir) Description::Entry::Entry(const string &mline, string mid, Direction dir)
: mMid(std::move(mid)), mDirection(dir) { : mMid(std::move(mid)), mDirection(dir) {
size_t p = mline.find(' ');
mType = mline.substr(0, p); unsigned int port;
if (p != string::npos) std::istringstream ss(mline);
if (size_t q = mline.find(' ', p + 1); q != string::npos) ss >> mType;
mDescription = mline.substr(q + 1, mline.find(' ', q + 1) - (q + 1)); ss >> port; // ignored
ss >> mDescription;
} }
void Description::Entry::setDirection(Direction dir) { mDirection = dir; } void Description::Entry::setDirection(Direction dir) { mDirection = dir; }
@ -473,10 +474,29 @@ void Description::Application::parseSdpLine(string_view line) {
} }
} }
Description::Media::Media(string mline, string mid, Direction dir) Description::Media::Media(const string &sdp) : Entry(sdp, "", Direction::Unknown) {
: Entry(std::move(mline), std::move(mid), dir) { std::istringstream ss(sdp);
mAttributes.emplace_back("rtcp-mux"); string line;
mAttributes.emplace_back("rtcp-mux-only"); while (std::getline(ss, line) || !line.empty()) {
trim_end(line);
parseSdpLine(line);
}
if (mid().empty())
throw std::invalid_argument("Missing mid in media SDP");
const std::array<string, 2> attributes = {"rtcp-mux", "rtcp-mux-only"};
for (auto attr : attributes)
if (std::find(mAttributes.begin(), mAttributes.end(), attr) != mAttributes.end())
mAttributes.emplace_back(attr);
}
Description::Media::Media(const string &mline, string mid, Direction dir)
: Entry(mline, std::move(mid), dir) {
const std::array<string, 2> attributes = {"rtcp-mux", "rtcp-mux-only"};
for (auto attr : attributes)
mAttributes.emplace_back(attr);
} }
string Description::Media::description() const { string Description::Media::description() const {
@ -512,7 +532,7 @@ Description::Media::RTPMap &Description::Media::getFormat(int fmt) {
if (it != mRtpMap.end()) if (it != mRtpMap.end())
return it->second; return it->second;
throw std::invalid_argument("mLineIndex is out of bounds"); throw std::invalid_argument("m-line index is out of bounds");
} }
Description::Media::RTPMap &Description::Media::getFormat(const string &fmt) { Description::Media::RTPMap &Description::Media::getFormat(const string &fmt) {