Commit a573d730 by xiongziliang

提高rtsp客户端兼容性

parent 2b511a05
...@@ -85,74 +85,84 @@ string SdpTrack::toString() const { ...@@ -85,74 +85,84 @@ string SdpTrack::toString() const {
} }
return _printer; return _printer;
} }
static TrackType toTrackType(const string &str) {
if (str == "") {
return TrackTitle;
}
if (str == "video") {
return TrackVideo;
}
if (str == "audio") {
return TrackAudio;
}
return TrackInvalid;
}
void SdpParser::load(const string &sdp) { void SdpParser::load(const string &sdp) {
_track_map.clear(); {
string key; _track_vec.clear();
SdpTrack::Ptr track = std::make_shared<SdpTrack>(); string key;
SdpTrack::Ptr track = std::make_shared<SdpTrack>();
auto lines = split(sdp,"\n"); auto lines = split(sdp, "\n");
for (auto &line : lines){ for (auto &line : lines) {
trim(line); trim(line);
if(line.size() < 2 || line[1] != '='){ if (line.size() < 2 || line[1] != '=') {
continue; continue;
}
char opt = line[0];
string opt_val = line.substr(2);
switch (opt){
case 'o':
track->_o = opt_val;
break;
case 's':
track->_s = opt_val;
break;
case 'i':
track->_i = opt_val;
break;
case 'c':
track->_c = opt_val;
break;
case 't':
track->_t = opt_val;
break;
case 'b':
track->_b = opt_val;
break;
case 'm':{
_track_map[key] = track;
track = std::make_shared<SdpTrack>();
key = FindField(opt_val.data(), nullptr," ");
track->_m = opt_val;
} }
break; char opt = line[0];
case 'a':{ string opt_val = line.substr(2);
string attr = FindField(opt_val.data(), nullptr,":"); switch (opt) {
if(attr.empty()){ case 'o':
track->_attr[opt_val] = ""; track->_o = opt_val;
}else{ break;
track->_attr[attr] = FindField(opt_val.data(),":", nullptr); case 's':
track->_s = opt_val;
break;
case 'i':
track->_i = opt_val;
break;
case 'c':
track->_c = opt_val;
break;
case 't':
track->_t = opt_val;
break;
case 'b':
track->_b = opt_val;
break;
case 'm': {
track->_type = toTrackType(key);
_track_vec.emplace_back(track);
track = std::make_shared<SdpTrack>();
key = FindField(opt_val.data(), nullptr, " ");
track->_m = opt_val;
}
break;
case 'a': {
string attr = FindField(opt_val.data(), nullptr, ":");
if (attr.empty()) {
track->_attr[opt_val] = "";
} else {
track->_attr[attr] = FindField(opt_val.data(), ":", nullptr);
}
} }
break;
default:
track->_other[opt] = opt_val;
break;
} }
break;
default:
track->_other[opt] = opt_val;
break;
} }
track->_type = toTrackType(key);
_track_vec.emplace_back(track);
} }
_track_map[key] = track;
for (auto &pr : _track_map) {
auto &track = *pr.second;
if (pr.first == "") {
track._type = TrackTitle;
} else if (pr.first == "video") {
track._type = TrackVideo;
} else if (pr.first == "audio") {
track._type = TrackAudio;
} else {
track._type = TrackInvalid;
}
for (auto &track_ptr : _track_vec) {
auto &track = *track_ptr;
auto it = track._attr.find("range"); auto it = track._attr.find("range");
if (it != track._attr.end()) { if (it != track._attr.end()) {
char name[16] = {0}, start[16] = {0}, end[16] = {0}; char name[16] = {0}, start[16] = {0}, end[16] = {0};
...@@ -198,9 +208,9 @@ bool SdpParser::available() const { ...@@ -198,9 +208,9 @@ bool SdpParser::available() const {
} }
SdpTrack::Ptr SdpParser::getTrack(TrackType type) const { SdpTrack::Ptr SdpParser::getTrack(TrackType type) const {
for (auto &pr : _track_map){ for (auto &track : _track_vec){
if(pr.second->_type == type){ if(track->_type == type){
return pr.second; return track;
} }
} }
return nullptr; return nullptr;
...@@ -208,31 +218,42 @@ SdpTrack::Ptr SdpParser::getTrack(TrackType type) const { ...@@ -208,31 +218,42 @@ SdpTrack::Ptr SdpParser::getTrack(TrackType type) const {
vector<SdpTrack::Ptr> SdpParser::getAvailableTrack() const { vector<SdpTrack::Ptr> SdpParser::getAvailableTrack() const {
vector<SdpTrack::Ptr> ret; vector<SdpTrack::Ptr> ret;
auto video = getTrack(TrackVideo); bool audio_added = false;
if(video){ bool video_added = false;
ret.emplace_back(video); for (auto &track : _track_vec){
} if(track->_type == TrackAudio ){
auto audio = getTrack(TrackAudio); if(!audio_added){
if(audio){ ret.emplace_back(track);
ret.emplace_back(audio); audio_added = true;
}
continue;
}
if(track->_type == TrackVideo ){
if(!video_added){
ret.emplace_back(track);
video_added = true;
}
continue;
}
} }
return ret; return std::move(ret);
} }
string SdpParser::toString() const { string SdpParser::toString() const {
string title,audio,video; string title,audio,video;
for(auto &pr : _track_map){ for(auto &track : _track_vec){
switch (pr.second->_type){ switch (track->_type){
case TrackTitle:{ case TrackTitle:{
title = pr.second->toString(); title = track->toString();
} }
break; break;
case TrackVideo:{ case TrackVideo:{
video = pr.second->toString(); video = track->toString();
} }
break; break;
case TrackAudio:{ case TrackAudio:{
audio = pr.second->toString(); audio = track->toString();
} }
break; break;
default: default:
......
...@@ -122,7 +122,7 @@ public: ...@@ -122,7 +122,7 @@ public:
vector<SdpTrack::Ptr> getAvailableTrack() const; vector<SdpTrack::Ptr> getAvailableTrack() const;
string toString() const ; string toString() const ;
private: private:
map<string, SdpTrack::Ptr> _track_map; vector<SdpTrack::Ptr> _track_vec;
}; };
/** /**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论