Index: content/renderer/media/rtc_video_encoder.cc |
diff --git a/content/renderer/media/rtc_video_encoder.cc b/content/renderer/media/rtc_video_encoder.cc |
index 890ff7be8c44a25a98d55ad72d58cafa1f902236..83e49d656136d8b5f0a71c28e6f816688c32eb83 100644 |
--- a/content/renderer/media/rtc_video_encoder.cc |
+++ b/content/renderer/media/rtc_video_encoder.cc |
@@ -11,6 +11,7 @@ |
#include "base/message_loop/message_loop_proxy.h" |
#include "base/metrics/histogram.h" |
#include "base/synchronization/waitable_event.h" |
+#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h" |
#include "media/base/bitstream_buffer.h" |
#include "media/base/video_frame.h" |
#include "media/base/video_util.h" |
@@ -41,8 +42,9 @@ |
: public media::VideoEncodeAccelerator::Client, |
public base::RefCountedThreadSafe<RTCVideoEncoder::Impl> { |
public: |
- Impl(const base::WeakPtr<RTCVideoEncoder>& weak_encoder, |
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories); |
+ Impl( |
+ const base::WeakPtr<RTCVideoEncoder>& weak_encoder, |
+ const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories); |
// Create the VEA and call Initialize() on it. Called once per instantiation, |
// and then the instance is bound forevermore to whichever thread made the |
@@ -117,7 +119,7 @@ |
const scoped_refptr<base::MessageLoopProxy> encoder_message_loop_proxy_; |
// Factory for creating VEAs, shared memory buffers, etc. |
- const scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories_; |
+ const scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories_; |
// webrtc::VideoEncoder expects InitEncode() and Encode() to be synchronous. |
// Do this by waiting on the |async_waiter_| and returning the return value in |
@@ -153,7 +155,7 @@ |
RTCVideoEncoder::Impl::Impl( |
const base::WeakPtr<RTCVideoEncoder>& weak_encoder, |
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories) |
+ const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories) |
: weak_encoder_(weak_encoder), |
encoder_message_loop_proxy_(base::MessageLoopProxy::current()), |
gpu_factories_(gpu_factories), |
@@ -469,7 +471,7 @@ |
RTCVideoEncoder::RTCVideoEncoder( |
webrtc::VideoCodecType type, |
media::VideoCodecProfile profile, |
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories) |
+ const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories) |
: video_codec_type_(type), |
video_codec_profile_(profile), |
gpu_factories_(gpu_factories), |
@@ -561,6 +563,9 @@ |
DVLOG(3) << "Release()"; |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ // Reset the gpu_factory_, in case we reuse this encoder. |
+ gpu_factories_->Abort(); |
+ gpu_factories_ = gpu_factories_->Clone(); |
if (impl_) { |
gpu_factories_->GetTaskRunner()->PostTask( |
FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_)); |