mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-22 23:25:33 +00:00
Added media constructor from SDP
This commit is contained in:
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
Reference in New Issue
Block a user