直接上代码:源码
void doRtspParse(char *b) {
std::vector<std::string> res;
char *ptr = b, *ptr1 = nullptr;
while ((ptr1 = strstr(ptr, "\r\n"))) {
res.push_back(std::string(ptr, ptr1 - ptr));
ptr = ptr1 + 2;
}
int len = ptr - b;
b[len - 1] = '\0';
Debug("%d read --> \n%s", len, b);
switch (cmd_) {
case OPTIONS: {
auto it = std::find_if(res.begin(), res.end(), [&](std::string &s) {
return s.find("WWW-Authenticate") != std::string::npos;
});
if (it == res.end()) {
doWriteCmd(DESCRIBE, seq_++, url_.GetAuth("DESCRIBE").c_str());
} else {
url_.SetAuth(it->c_str());
doWriteCmd(OPTIONS, seq_++, url_.GetAuth("OPTIONS").c_str());
}
break;
};
case DESCRIBE: {
sdp_.Parse(res);
this->decode_ = Unmarshal264;
if (sdp_.medias[0].rtpmap.find("H265") != std::string::npos) {
this->decode_ = Unmarshal265;
}
doWriteCmd(SETUP, sdp_.medias[0].id.c_str(), seq_++, sdp_.session.c_str(),
url_.GetAuth("SETUP").c_str());
if (atype_ == 0xff) {
cmd_ = SETAUDIO;
}
break;
};
case SETUP:
doWriteCmd(PLAY, seq_++, sdp_.session.c_str(),
url_.GetAuth("PLAY").c_str());
break;
case SETAUDIO: {
auto it = std::find_if(sdp_.medias.begin(), sdp_.medias.end(),
[](sdp::media &m) {
return m.id.find("audio") != std::string::npos;
});
if (it == sdp_.medias.end()) {
doWriteCmd(PLAY, seq_++, sdp_.session.c_str(),
url_.GetAuth("PLAY").c_str());
} else {
atype_ = it->format;
doWriteCmd(SETUP, it->id.c_str(), seq_++, sdp_.session.c_str(),
url_.GetAuth("SETUP").c_str());
}
} break;
default:
rbuf_.Remove(len);
return;
}
rbuf_.Reset(0);
}