Compare commits

...

3 Commits

Author SHA1 Message Date
Lidaofu
94be50e50a
c sdk unix编译增加额外调试信息 (#4364)
Some checks failed
Android / build (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Docker / build (push) Has been cancelled
Linux / build (push) Has been cancelled
macOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-07-26 15:45:00 +08:00
sbkyy
6ccbd3aafb
rtp级联网络慢时默认不限制源端接收网速 (#4359) 2025-07-26 15:44:29 +08:00
baigao-X
9d18015e32
fix: SrtCaller and SrtSession crash (#4328)
1.修改SrtCaller 多线程发送造成的crash
2.修改SrtCaller 接收的期望外的控制包可能造成的空指针引用
3.修改异常的streamid ext可能造成的crash
2025-07-26 15:43:36 +08:00
7 changed files with 73 additions and 7 deletions

View File

@ -83,6 +83,24 @@ if(MSVC)
target_sources(mk_api PRIVATE ${RESOURCE_FILE})
endif()
#relase debug
if(UNIX)
if("${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "release")
find_program(OBJCOPY_FOUND objcopy)
if (OBJCOPY_FOUND)
add_custom_command(TARGET mk_api
POST_BUILD
COMMAND objcopy --only-keep-debug ${EXECUTABLE_OUTPUT_PATH}/libmk_api.so ${EXECUTABLE_OUTPUT_PATH}/libmk_api.so.debug
COMMAND objcopy --strip-all ${EXECUTABLE_OUTPUT_PATH}/libmk_api.so
COMMAND objcopy --add-gnu-debuglink=${EXECUTABLE_OUTPUT_PATH}/libmk_api.so.debug ${EXECUTABLE_OUTPUT_PATH}/libmk_api.so
)
install(FILES ${EXECUTABLE_OUTPUT_PATH}/libmk_api.so.debug DESTINATION ${INSTALL_PATH_RUNTIME})
else()
message(STATUS "not found objcopy, generate libmk_api.so.debug skip")
endif()
endif()
endif()
# IOS
if(IOS)
return()

View File

@ -175,6 +175,9 @@ public:
std::string recv_stream_app;
std::string recv_stream_vhost;
// rtp tcp模式发送时busy时, origin 接收限流, 默认不启用
bool enable_origin_recv_limit = false;
};
// 开始发送ps-rtp [AUTO-TRANSLATED:a51796fa]

View File

@ -451,7 +451,7 @@ void RtpSender::onFlushRtpList(shared_ptr<List<Buffer::Ptr>> rtp_list) {
}
default: CHECK(0);
}
if (_socket_rtp->sockType() == toolkit::SockNum::Sock_TCP && _socket_rtp->isSocketBusy() && _origin_socket) {
if (_args.enable_origin_recv_limit && _socket_rtp->sockType() == toolkit::SockNum::Sock_TCP && _socket_rtp->isSocketBusy() && _origin_socket) {
_origin_socket->enableRecv(false);
}
});

View File

@ -218,8 +218,8 @@ void SrtCaller::inputSockData(uint8_t *buf, int len, struct sockaddr *addr) {
// 处理srt数据
if (DataPacket::isDataPacket(buf, len)) {
uint32_t socketId = DataPacket::getSocketID(buf, len);
if (isPlayer()) {
if (_is_handleshake_finished && isPlayer()) {
uint32_t socketId = DataPacket::getSocketID(buf, len);
if (socketId == _socket_id) {
_pkt_recv_rate_context->inputPacket(_now, len + UDP_HDR_SIZE);
handleDataPacket(buf, len, addr);
@ -702,6 +702,11 @@ void SrtCaller::handleHandshakeConclusion(SRT::HandshakePacket &pkt, struct sock
void SrtCaller::handleACK(uint8_t *buf, int len, struct sockaddr *addr) {
// TraceL;
//Acknowledgement of Acknowledgement (ACKACK) control packets are sent to acknowledge the reception of a Full ACK
if (!_is_handleshake_finished) {
return;
}
ACKPacket ack;
if (!ack.loadFromData(buf, len)) {
return;
@ -722,6 +727,10 @@ void SrtCaller::handleACK(uint8_t *buf, int len, struct sockaddr *addr) {
void SrtCaller::handleACKACK(uint8_t *buf, int len, struct sockaddr *addr) {
// TraceL;
if (!_is_handleshake_finished) {
return;
}
ACKACKPacket::Ptr pkt = std::make_shared<ACKACKPacket>();
pkt->loadFromData(buf, len);
@ -757,6 +766,15 @@ void SrtCaller::handleACKACK(uint8_t *buf, int len, struct sockaddr *addr) {
}
void SrtCaller::handleNAK(uint8_t *buf, int len, struct sockaddr *addr) {
if (!_is_handleshake_finished) {
return;
}
if (isPlayer()) {
//player should not handle nak
return;
}
//TraceL;
NAKPacket pkt;
pkt.loadFromData(buf, len);
@ -783,6 +801,15 @@ void SrtCaller::handleNAK(uint8_t *buf, int len, struct sockaddr *addr) {
}
void SrtCaller::handleDropReq(uint8_t *buf, int len, struct sockaddr *addr) {
if (!_is_handleshake_finished) {
return;
}
if (!isPlayer()) {
//pusher should not handle drop req
return;
}
MsgDropReqPacket pkt;
pkt.loadFromData(buf, len);
std::list<DataPacket::Ptr> list;

View File

@ -36,7 +36,15 @@ void SrtPlayer::play(const string &strUrl) {
onResult(SockException(Err_other, StrPrinter << "illegal srt url:" << ex.what()));
return;
}
onConnect();
weak_ptr<SrtPlayer> weak_self = static_pointer_cast<SrtPlayer>(shared_from_this());
getPoller()->async([weak_self]() {
auto strong_self = weak_self.lock();
if (!strong_self) {
return;
}
strong_self->onConnect();
});
return;
}

View File

@ -32,7 +32,15 @@ void SrtPusher::publish(const string &strUrl) {
onResult(SockException(Err_other, StrPrinter << "illegal srt url:" << ex.what()));
return;
}
onConnect();
weak_ptr<SrtPusher> weak_self = static_pointer_cast<SrtPusher>(shared_from_this());
getPoller()->async([weak_self]() {
auto strong_self = weak_self.lock();
if (!strong_self) {
return;
}
strong_self->onConnect();
});
return;
}

View File

@ -83,8 +83,10 @@ bool HSExtStreamID::loadFromData(uint8_t *buf, size_t len) {
ptr += 4;
}
char zero = 0x00;
if (streamid.back() == zero) {
streamid.erase(streamid.find_first_of(zero), streamid.size());
if (!streamid.empty()) {
if (streamid.back() == zero) {
streamid.erase(streamid.find_first_of(zero), streamid.size());
}
}
return true;
}