From a3209a2b27b7bf2059f8119a126a1b1be9f0377f Mon Sep 17 00:00:00 2001 From: "pbos@webrtc.org" Date: Fri, 20 Mar 2015 13:35:56 +0000 Subject: [PATCH] Release buffer pool in Vp8DecoderImpl::Release(). Permits reusing an external VP8DecoderImpl instance from another VideoReceiveStream without a thread-checker DCHECK blowing up. Also releases buffers that would've been kept in memory even though the decoder isn't configured. BUG= R=magjed@webrtc.org, stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/50449004 Cr-Commit-Position: refs/heads/master@{#8807} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8807 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/common_video/i420_buffer_pool.cc | 5 +++++ webrtc/common_video/interface/i420_buffer_pool.h | 3 +++ webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc | 1 + 3 files changed, 9 insertions(+) diff --git a/webrtc/common_video/i420_buffer_pool.cc b/webrtc/common_video/i420_buffer_pool.cc index b6ad2ba2e..04a0ab9b7 100644 --- a/webrtc/common_video/i420_buffer_pool.cc +++ b/webrtc/common_video/i420_buffer_pool.cc @@ -51,7 +51,12 @@ class PooledI420Buffer : public webrtc::VideoFrameBuffer { namespace webrtc { I420BufferPool::I420BufferPool() { + Release(); +} + +void I420BufferPool::Release() { thread_checker_.DetachFromThread(); + buffers_.clear(); } rtc::scoped_refptr I420BufferPool::CreateBuffer(int width, diff --git a/webrtc/common_video/interface/i420_buffer_pool.h b/webrtc/common_video/interface/i420_buffer_pool.h index e9dff8ca5..df862cdba 100644 --- a/webrtc/common_video/interface/i420_buffer_pool.h +++ b/webrtc/common_video/interface/i420_buffer_pool.h @@ -29,6 +29,9 @@ class I420BufferPool { // Returns a buffer from the pool, or creates a new buffer if no suitable // buffer exists in the pool. rtc::scoped_refptr CreateBuffer(int width, int height); + // Clears buffers_ and detaches the thread checker so that it can be reused + // later from another thread. + void Release(); private: rtc::ThreadChecker thread_checker_; diff --git a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc index 34862a46f..4f3678f11 100644 --- a/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc +++ b/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc @@ -1385,6 +1385,7 @@ int VP8DecoderImpl::Release() { delete ref_frame_; ref_frame_ = NULL; } + buffer_pool_.Release(); inited_ = false; return WEBRTC_VIDEO_CODEC_OK; }