From b5f1460dd1be3ee23468daf8b46724e1f1dc0126 Mon Sep 17 00:00:00 2001 From: pengyanhai Date: Mon, 9 Nov 2015 11:52:11 -0800 Subject: [PATCH] Tear down the OpenH264 encoder and decoder properly to avoid potential crash and memory leak --- module/gmp-openh264.cpp | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/module/gmp-openh264.cpp b/module/gmp-openh264.cpp index af54d4d9..cde59c43 100644 --- a/module/gmp-openh264.cpp +++ b/module/gmp-openh264.cpp @@ -368,9 +368,24 @@ class OpenH264VideoEncoder : public GMPVideoEncoder, public RefCounted { private: virtual ~OpenH264VideoEncoder() { - worker_thread_->Join(); + // Tear down the internal encoder + TearDownEncoder(); } + void TearDownEncoder() { + // Stop the worker thread first + if (worker_thread_) { + worker_thread_->Join(); + worker_thread_ = nullptr; + } + + // Destroy OpenH264 encoder + if (encoder_) { + WelsDestroySVCEncoder(encoder_); + encoder_ = nullptr; + } + } + void Error (GMPErr error) { if (callback_) { callback_->Error (error); @@ -727,8 +742,23 @@ class OpenH264VideoDecoder : public GMPVideoDecoder, public RefCounted { private: virtual ~OpenH264VideoDecoder() { + // Tear down the internal decoder + TearDownDecoder(); } + void TearDownDecoder() { + // Stop the worker thread first + if (worker_thread_) { + worker_thread_->Join(); + worker_thread_ = nullptr; + } + + // Destroy OpenH264 decoder + if (decoder_) { + WelsDestroyDecoder(decoder_); + decoder_ = nullptr; + } + } void Error (GMPErr error) { if (callback_) { callback_->Error (error);