From e3a0712f04735ebd840cdd5941dc86ab924d967e Mon Sep 17 00:00:00 2001 From: "mflodman@webrtc.org" Date: Mon, 18 Jun 2012 12:43:41 +0000 Subject: [PATCH] Deregister RTP module before deleting it. BUG=617 TEST= Review URL: https://webrtc-codereview.appspot.com/661004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2413 4adac7df-926f-26a2-2b94-8c16560cd09d --- src/video_engine/vie_channel.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/video_engine/vie_channel.cc b/src/video_engine/vie_channel.cc index 3bd3b273a2..0a8735a1c0 100644 --- a/src/video_engine/vie_channel.cc +++ b/src/video_engine/vie_channel.cc @@ -249,13 +249,15 @@ WebRtc_Word32 ViEChannel::SetSendCodec(const VideoCodec& video_codec, simulcast_rtp_rtcp_.push_back(rtp_rtcp); } // Remove last in list if we have too many. + std::list modules_to_delete; for (int j = simulcast_rtp_rtcp_.size(); j > (video_codec.numberOfSimulcastStreams - 1); j--) { RtpRtcp* rtp_rtcp = simulcast_rtp_rtcp_.back(); module_process_thread_.DeRegisterModule(rtp_rtcp); - delete rtp_rtcp; simulcast_rtp_rtcp_.pop_back(); + // We need to deregister the module before deleting. + modules_to_delete.push_back(rtp_rtcp); } WebRtc_UWord8 idx = 0; // Configure all simulcast modules. @@ -277,7 +279,14 @@ WebRtc_Word32 ViEChannel::SetSendCodec(const VideoCodec& video_codec, rtp_rtcp->SetSendingStatus(true); } } + // |RegisterSimulcastRtpRtcpModules| resets all old weak pointers and old + // modules can be deleted after this step. vie_receiver_.RegisterSimulcastRtpRtcpModules(simulcast_rtp_rtcp_); + for (std::list::iterator it = modules_to_delete.begin(); + it != modules_to_delete.end(); ++it) { + delete *it; + } + modules_to_delete.clear(); } else { if (!simulcast_rtp_rtcp_.empty()) { // Delete all simulcast rtp modules.