Stop decoders in VideoReceiveStream destructor.
Prevents use-after-free from decoder threads since the VCM outlives ViEChannel. BUG=webrtc:5494 R=danilchap@webrtc.org Review URL: https://codereview.webrtc.org/1699893002 . Cr-Commit-Position: refs/heads/master@{#11628}
This commit is contained in:
@ -278,8 +278,7 @@ VideoReceiveStream::VideoReceiveStream(
|
||||
|
||||
RTC_DCHECK(!config_.decoders.empty());
|
||||
std::set<int> decoder_payload_types;
|
||||
for (size_t i = 0; i < config_.decoders.size(); ++i) {
|
||||
const Decoder& decoder = config_.decoders[i];
|
||||
for (const Decoder& decoder : config_.decoders) {
|
||||
RTC_CHECK(decoder.decoder);
|
||||
RTC_CHECK(decoder_payload_types.find(decoder.payload_type) ==
|
||||
decoder_payload_types.end())
|
||||
@ -310,6 +309,14 @@ VideoReceiveStream::~VideoReceiveStream() {
|
||||
Stop();
|
||||
|
||||
process_thread_->DeRegisterModule(vcm_.get());
|
||||
|
||||
// Deregister external decoders so that they are no longer running during
|
||||
// destruction. This effectively stops the VCM since the decoder thread is
|
||||
// stopped, the VCM is deregistered and no asynchronous decoder threads are
|
||||
// running.
|
||||
for (const Decoder& decoder : config_.decoders)
|
||||
vcm_->RegisterExternalDecoder(nullptr, decoder.payload_type);
|
||||
|
||||
vie_channel_.RegisterPreRenderCallback(nullptr);
|
||||
vcm_->RegisterPreDecodeImageCallback(nullptr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user