Fix SrtCaller Crash problem (#4171)

1.Fix the crash problem when SrtPlayer reveives an Ack packet 
2.Remove SrtCaller's Check on streamid format to make it compatible with
other SRT streaming service。
3.Modify the coding format: replace tab to space
This commit is contained in:
baigao-X 2025-02-28 12:46:43 +08:00 committed by GitHub
parent 52ca731392
commit c0a93f3c8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 793 additions and 819 deletions

View File

@ -21,8 +21,12 @@ using namespace SRT;
namespace mediakit { namespace mediakit {
//zlm play format
//srt://127.0.0.1:9000?streamid=#!::r=live/test //srt://127.0.0.1:9000?streamid=#!::r=live/test
//srt://127.0.0.1:9000?streamid=#!::r=live/test,h=__defaultVhost__ //srt://127.0.0.1:9000?streamid=#!::r=live/test,h=__defaultVhost__
//zlm push format
//srt://127.0.0.1:9000?streamid=#!::r=live/test,m=publish
//srt://127.0.0.1:9000?streamid=#!::r=live/test,h=__defaultVhost__,m=publish
void SrtUrl::parse(const string &strUrl) { void SrtUrl::parse(const string &strUrl) {
//DebugL << "url: " << strUrl; //DebugL << "url: " << strUrl;
_full_url = strUrl; _full_url = strUrl;
@ -40,37 +44,14 @@ void SrtUrl::parse(const string &strUrl) {
if (!toolkit::start_with(streamid, "#!::")) { if (!toolkit::start_with(streamid, "#!::")) {
return; return;
} }
std::string real_streamid = streamid.substr(4); _streamid = streamid;
auto params = Parser::parseArgs(real_streamid, ",", "=");
for (auto iit : params) {
if (iit.first == "h") {
_vhost = iit.second;
} else if (iit.first == "r") {
auto tmps = toolkit::split(iit.second, "/");
if (tmps.size() < 2) {
continue;
}
_app = tmps[0];
_stream = tmps[1];
} else {
//nop
}
}
if (_vhost.empty()) {
_vhost = DEFAULT_VHOST;
}
} }
//TraceL << "ip: " << ip; //TraceL << "ip: " << ip;
//TraceL << "_host: " << _host; //TraceL << "_host: " << _host;
//TraceL << "_port: " << _port; //TraceL << "_port: " << _port;
//TraceL << "_params: " << _params; //TraceL << "_params: " << _params;
//TraceL << "_vhost: " << _vhost; //TraceL << "_streamid: " << _streamid;
//TraceL << "_app: " << _app;
//TraceL << "_stream: " << _stream;
return; return;
} }
@ -730,7 +711,9 @@ void SrtCaller::handleACK(uint8_t *buf, int len, struct sockaddr *addr) {
pkt->timestamp = DurationCountMicroseconds(_now - _start_timestamp); pkt->timestamp = DurationCountMicroseconds(_now - _start_timestamp);
pkt->ack_number = ack.ack_number; pkt->ack_number = ack.ack_number;
pkt->storeToData(); pkt->storeToData();
if (_send_buf) {
_send_buf->drop(ack.last_ack_pkt_seq_number); _send_buf->drop(ack.last_ack_pkt_seq_number);
}
sendControlPacket(pkt, true); sendControlPacket(pkt, true);
// TraceL<<"ack number "<<ack.ack_number; // TraceL<<"ack number "<<ack.ack_number;
return; return;
@ -1008,14 +991,7 @@ float SrtCaller::getTimeOutSec() {
}; };
std::string SrtCaller::generateStreamId() { std::string SrtCaller::generateStreamId() {
auto streamId = "#!::r=" + _url._app + "/" + _url._stream; return _url._streamid;
if (_url._vhost != DEFAULT_VHOST) {
streamId += ",h=" +_url._vhost;
}
if (!isPlayer()) {
streamId += ",m=publish";
}
return streamId;
}; };
uint32_t SrtCaller::generateSocketId() { uint32_t SrtCaller::generateSocketId() {

View File

@ -38,9 +38,7 @@ public:
std::string _params; std::string _params;
std::string _host; std::string _host;
uint16_t _port; uint16_t _port;
std::string _vhost; std::string _streamid;
std::string _app;
std::string _stream;
public: public:
void parse(const std::string &url); void parse(const std::string &url);