mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
修复webrtc MediaTrack对象循环引用导致内存泄露的问题
This commit is contained in:
parent
209d47cf3b
commit
8352f119f2
@ -441,7 +441,7 @@ void WebRtcTransportImp::onStartWebRTC() {
|
|||||||
//ssrc --> MediaTrack
|
//ssrc --> MediaTrack
|
||||||
auto track = weak_track.lock();
|
auto track = weak_track.lock();
|
||||||
assert(track);
|
assert(track);
|
||||||
_ssrc_to_track[ssrc] = track;
|
_ssrc_to_track[ssrc] = std::move(track);
|
||||||
InfoL << "get rtp, pt:" << (int) pt << ", ssrc:" << ssrc << ", rid:" << rid;
|
InfoL << "get rtp, pt:" << (int) pt << ", ssrc:" << ssrc << ", rid:" << rid;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -750,20 +750,20 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void WebRtcTransportImp::createRtpChannel(const string &rid, uint32_t ssrc, const MediaTrack::Ptr &track) {
|
void WebRtcTransportImp::createRtpChannel(const string &rid, uint32_t ssrc, MediaTrack &track) {
|
||||||
//rid --> RtpReceiverImp
|
//rid --> RtpReceiverImp
|
||||||
auto &ref = track->rtp_channel[rid];
|
auto &ref = track.rtp_channel[rid];
|
||||||
weak_ptr<WebRtcTransportImp> weak_self = dynamic_pointer_cast<WebRtcTransportImp>(shared_from_this());
|
weak_ptr<WebRtcTransportImp> weak_self = dynamic_pointer_cast<WebRtcTransportImp>(shared_from_this());
|
||||||
ref = std::make_shared<RtpChannel>(getPoller(),[track, this, rid](RtpPacket::Ptr rtp) mutable {
|
ref = std::make_shared<RtpChannel>(getPoller(), [&track, this, rid](RtpPacket::Ptr rtp) mutable {
|
||||||
onSortedRtp(*track, rid, std::move(rtp));
|
onSortedRtp(track, rid, std::move(rtp));
|
||||||
}, [track, weak_self, ssrc](const FCI_NACK &nack) mutable {
|
}, [&track, weak_self, ssrc](const FCI_NACK &nack) mutable {
|
||||||
//nack发送可能由定时器异步触发
|
//nack发送可能由定时器异步触发
|
||||||
auto strong_self = weak_self.lock();
|
auto strong_self = weak_self.lock();
|
||||||
if (strong_self) {
|
if (strong_self) {
|
||||||
strong_self->onSendNack(*track, nack, ssrc);
|
strong_self->onSendNack(track, nack, ssrc);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
InfoL << "create rtp receiver of ssrc:" << ssrc << ", rid:" << rid << ", codec:" << track->plan_rtp->codec;
|
InfoL << "create rtp receiver of ssrc:" << ssrc << ", rid:" << rid << ", codec:" << track.plan_rtp->codec;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcTransportImp::onRtp(const char *buf, size_t len) {
|
void WebRtcTransportImp::onRtp(const char *buf, size_t len) {
|
||||||
@ -792,7 +792,7 @@ void WebRtcTransportImp::onRtp(const char *buf, size_t len) {
|
|||||||
WarnL << "unknown rtx rtp, rid:" << rid << ", ssrc:" << ssrc << ", codec:" << track->plan_rtp->codec << ", seq:" << ntohs(rtp->seq);
|
WarnL << "unknown rtx rtp, rid:" << rid << ", ssrc:" << ssrc << ", codec:" << track->plan_rtp->codec << ", seq:" << ntohs(rtp->seq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
createRtpChannel(rid, ssrc, track);
|
createRtpChannel(rid, ssrc, *track);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_rtx) {
|
if (!is_rtx) {
|
||||||
|
@ -216,7 +216,7 @@ private:
|
|||||||
|
|
||||||
void onSortedRtp(MediaTrack &track, const string &rid, RtpPacket::Ptr rtp);
|
void onSortedRtp(MediaTrack &track, const string &rid, RtpPacket::Ptr rtp);
|
||||||
void onSendNack(MediaTrack &track, const FCI_NACK &nack, uint32_t ssrc);
|
void onSendNack(MediaTrack &track, const FCI_NACK &nack, uint32_t ssrc);
|
||||||
void createRtpChannel(const string &rid, uint32_t ssrc, const MediaTrack::Ptr &track);
|
void createRtpChannel(const string &rid, uint32_t ssrc, MediaTrack &track);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _simulcast = false;
|
bool _simulcast = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user