mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
添加辅助方法
This commit is contained in:
parent
2643269581
commit
b714dfddda
122
webrtc/Sdp.cpp
122
webrtc/Sdp.cpp
@ -161,9 +161,99 @@ const char* getRtpDirectionString(RtpDirection val){
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
string RtcSdpBase::toString() const {
|
||||||
|
_StrPrinter printer;
|
||||||
|
for (auto &item : items) {
|
||||||
|
printer << item->getKey() << "=" << item->toString() << "\r\n";
|
||||||
|
}
|
||||||
|
return std::move(printer);
|
||||||
|
}
|
||||||
|
|
||||||
|
RtpDirection RtcSdpBase::getDirection() const{
|
||||||
|
for (auto &item : items) {
|
||||||
|
auto attr = dynamic_pointer_cast<SdpAttr>(item);
|
||||||
|
if (attr) {
|
||||||
|
auto dir = dynamic_pointer_cast<DirectionInterface>(attr->detail);
|
||||||
|
if (dir) {
|
||||||
|
return dir->getDirection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RtpDirection::invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
SdpItem::Ptr RtcSdpBase::getItem(char key, const char *attr_key) const {
|
||||||
|
for (auto item : items) {
|
||||||
|
if (item->getKey()[0] == key) {
|
||||||
|
if (!attr_key) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
auto attr = dynamic_pointer_cast<SdpAttr>(item);
|
||||||
|
if (attr && attr->detail->getKey() == attr_key) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SdpItem::Ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RtcSdpBase::getVersion() const {
|
||||||
|
return atoi(getStringItem('v').data());
|
||||||
|
}
|
||||||
|
|
||||||
|
SdpOrigin RtcSdpBase::getOrigin() const {
|
||||||
|
return getItemClass<SdpOrigin>('o');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getSessionName() const {
|
||||||
|
return getStringItem('s');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getSessionInfo() const {
|
||||||
|
return getStringItem('i');
|
||||||
|
}
|
||||||
|
|
||||||
|
SdpTime RtcSdpBase::getSessionTime() const{
|
||||||
|
return getItemClass<SdpTime>('t');
|
||||||
|
}
|
||||||
|
|
||||||
|
SdpConnection RtcSdpBase::getConnection() const {
|
||||||
|
return getItemClass<SdpConnection>('c');
|
||||||
|
}
|
||||||
|
|
||||||
|
SdpBandwidth RtcSdpBase::getBandwidth() const {
|
||||||
|
return getItemClass<SdpBandwidth>('b');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getUri() const {
|
||||||
|
return getStringItem('u');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getEmail() const {
|
||||||
|
return getStringItem('e');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getPhone() const {
|
||||||
|
return getStringItem('p');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getTimeZone() const {
|
||||||
|
return getStringItem('z');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getEncryptKey() const {
|
||||||
|
return getStringItem('k');
|
||||||
|
}
|
||||||
|
|
||||||
|
string RtcSdpBase::getRepeatTimes() const {
|
||||||
|
return getStringItem('r');
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void RtcSessionSdp::parse(const string &str) {
|
void RtcSessionSdp::parse(const string &str) {
|
||||||
static auto flag = registerAllItem();
|
static auto flag = registerAllItem();
|
||||||
RtcMediaSdp *media = nullptr;
|
RtcSdpBase *media = nullptr;
|
||||||
auto lines = split(str, "\n");
|
auto lines = split(str, "\n");
|
||||||
for(auto &line : lines){
|
for(auto &line : lines){
|
||||||
trim(line);
|
trim(line);
|
||||||
@ -173,7 +263,7 @@ void RtcSessionSdp::parse(const string &str) {
|
|||||||
auto key = line.substr(0, 1);
|
auto key = line.substr(0, 1);
|
||||||
auto value = line.substr(2);
|
auto value = line.substr(2);
|
||||||
if (key == "m") {
|
if (key == "m") {
|
||||||
medias.emplace_back(RtcMediaSdp());
|
medias.emplace_back(RtcSdpBase());
|
||||||
media = &medias.back();
|
media = &medias.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,9 +285,7 @@ void RtcSessionSdp::parse(const string &str) {
|
|||||||
|
|
||||||
string RtcSessionSdp::toString() const {
|
string RtcSessionSdp::toString() const {
|
||||||
_StrPrinter printer;
|
_StrPrinter printer;
|
||||||
for (auto &item : items) {
|
printer << RtcSdpBase::toString();
|
||||||
printer << item->getKey() << "=" << item->toString() << "\r\n";
|
|
||||||
}
|
|
||||||
for (auto &media : medias) {
|
for (auto &media : medias) {
|
||||||
printer << media.toString();
|
printer << media.toString();
|
||||||
}
|
}
|
||||||
@ -205,30 +293,6 @@ string RtcSessionSdp::toString() const {
|
|||||||
return std::move(printer);
|
return std::move(printer);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
string RtcMediaSdp::toString() const {
|
|
||||||
_StrPrinter printer;
|
|
||||||
for (auto &item : items) {
|
|
||||||
printer << item->getKey() << "=" << item->toString() << "\r\n";
|
|
||||||
}
|
|
||||||
return std::move(printer);
|
|
||||||
}
|
|
||||||
|
|
||||||
RtpDirection RtcMediaSdp::getDirection() const{
|
|
||||||
for (auto &item : items) {
|
|
||||||
auto attr = dynamic_pointer_cast<SdpAttr>(item);
|
|
||||||
if (attr) {
|
|
||||||
auto dir = dynamic_pointer_cast<DirectionInterface>(attr->detail);
|
|
||||||
if (dir) {
|
|
||||||
return dir->getDirection();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return RtpDirection::invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#define SDP_THROW() throw std::invalid_argument(StrPrinter << "解析sdp " << getKey() << " 字段失败:" << str)
|
#define SDP_THROW() throw std::invalid_argument(StrPrinter << "解析sdp " << getKey() << " 字段失败:" << str)
|
||||||
|
66
webrtc/Sdp.h
66
webrtc/Sdp.h
@ -421,22 +421,55 @@ public:
|
|||||||
const char* getKey() const override { return "candidate";}
|
const char* getKey() const override { return "candidate";}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RtcMediaSdp {
|
class RtcSdpBase {
|
||||||
public:
|
public:
|
||||||
vector<SdpItem::Ptr> items;
|
vector<SdpItem::Ptr> items;
|
||||||
string toString() const;
|
|
||||||
bool haveAttr(const char *attr) const;
|
public:
|
||||||
string getAttrValue(const char *attr) const;
|
virtual string toString() const;
|
||||||
|
|
||||||
|
int getVersion() const;
|
||||||
|
SdpOrigin getOrigin() const;
|
||||||
|
string getSessionName() const;
|
||||||
|
string getSessionInfo() const;
|
||||||
|
SdpTime getSessionTime() const;
|
||||||
|
SdpConnection getConnection() const;
|
||||||
|
SdpBandwidth getBandwidth() const;
|
||||||
|
|
||||||
|
string getUri() const;
|
||||||
|
string getEmail() const;
|
||||||
|
string getPhone() const;
|
||||||
|
string getTimeZone() const;
|
||||||
|
string getEncryptKey() const;
|
||||||
|
string getRepeatTimes() const;
|
||||||
RtpDirection getDirection() const;
|
RtpDirection getDirection() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SdpItem::Ptr getItem(char key, const char *attr_key = nullptr) const;
|
||||||
|
|
||||||
|
template<typename cls>
|
||||||
|
cls getItemClass(char key, const char *attr_key = nullptr) const{
|
||||||
|
auto item = dynamic_pointer_cast<cls>(getItem(key, attr_key));
|
||||||
|
if (!item) {
|
||||||
|
return cls();
|
||||||
|
}
|
||||||
|
return *item;
|
||||||
|
}
|
||||||
|
|
||||||
|
string getStringItem(char key, const char *attr_key = nullptr) const{
|
||||||
|
auto item = getItem(key, attr_key);
|
||||||
|
if (!item) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return item->toString();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RtcSessionSdp {
|
class RtcSessionSdp : public RtcSdpBase{
|
||||||
public:
|
public:
|
||||||
vector<SdpItem::Ptr> items;
|
vector<RtcSdpBase> medias;
|
||||||
vector<RtcMediaSdp> medias;
|
|
||||||
|
|
||||||
void parse(const string &str);
|
void parse(const string &str);
|
||||||
string toString() const;
|
string toString() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
@ -468,12 +501,12 @@ public:
|
|||||||
uint32_t sample_rate;
|
uint32_t sample_rate;
|
||||||
//音频时有效
|
//音频时有效
|
||||||
uint32_t channel = 0;
|
uint32_t channel = 0;
|
||||||
vector<std::pair<string/*key*/, string/*value*/> > fmtp;
|
|
||||||
vector<string> rtcp_fb;
|
vector<string> rtcp_fb;
|
||||||
|
vector<std::pair<string/*key*/, string/*value*/> > fmtp;
|
||||||
};
|
};
|
||||||
|
|
||||||
//rtc 媒体描述
|
//rtc 媒体描述
|
||||||
class RtcCodec{
|
class RtcMedia{
|
||||||
public:
|
public:
|
||||||
TrackType type;
|
TrackType type;
|
||||||
string mid;
|
string mid;
|
||||||
@ -508,6 +541,17 @@ public:
|
|||||||
vector<SdpAttrExtmap> extmap;
|
vector<SdpAttrExtmap> extmap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class RtcSession{
|
||||||
|
public:
|
||||||
|
int version;
|
||||||
|
SdpOrigin origin;
|
||||||
|
string session_name;
|
||||||
|
string session_info;
|
||||||
|
SdpConnection connection;
|
||||||
|
SdpBandwidth bandwidth;
|
||||||
|
set<TrackType> group_bundle;
|
||||||
|
vector<RtcMedia> media;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif //ZLMEDIAKIT_SDP_H
|
#endif //ZLMEDIAKIT_SDP_H
|
||||||
|
Loading…
Reference in New Issue
Block a user