diff options
-rw-r--r-- | content/common/gpu/media/gpu_video_decode_accelerator.cc | 3 | ||||
-rw-r--r-- | content/common/gpu/media/gpu_video_encode_accelerator.cc | 3 | ||||
-rw-r--r-- | content/common/gpu/media/video_decode_accelerator_impl.cc | 4 | ||||
-rw-r--r-- | content/common/gpu/media/video_decode_accelerator_impl.h | 22 | ||||
-rw-r--r-- | content/common/gpu/media/video_decode_accelerator_unittest.cc | 2 | ||||
-rw-r--r-- | content/common/gpu/media/video_encode_accelerator_unittest.cc | 2 | ||||
-rw-r--r-- | content/renderer/media/rtc_video_encoder.cc | 6 | ||||
-rw-r--r-- | content/renderer/pepper/ppb_video_decoder_impl.cc | 3 | ||||
-rw-r--r-- | media/cast/video_sender/external_video_encoder.cc | 8 | ||||
-rw-r--r-- | media/filters/gpu_video_decoder.cc | 3 | ||||
-rw-r--r-- | media/video/video_decode_accelerator.cc | 12 | ||||
-rw-r--r-- | media/video/video_decode_accelerator.h | 22 | ||||
-rw-r--r-- | media/video/video_encode_accelerator.cc | 11 | ||||
-rw-r--r-- | media/video/video_encode_accelerator.h | 22 |
14 files changed, 94 insertions, 29 deletions
diff --git a/content/common/gpu/media/gpu_video_decode_accelerator.cc b/content/common/gpu/media/gpu_video_decode_accelerator.cc index 1e1b15c9..0d94eaa 100644 --- a/content/common/gpu/media/gpu_video_decode_accelerator.cc +++ b/content/common/gpu/media/gpu_video_decode_accelerator.cc @@ -459,9 +459,6 @@ void GpuVideoDecodeAccelerator::OnWillDestroyStub() { stub_->channel()->RemoveRoute(host_route_id_); stub_->RemoveDestructionObserver(this); - if (video_decode_accelerator_) - video_decode_accelerator_.release()->Destroy(); - delete this; } diff --git a/content/common/gpu/media/gpu_video_encode_accelerator.cc b/content/common/gpu/media/gpu_video_encode_accelerator.cc index 3a6deec..c29a015 100644 --- a/content/common/gpu/media/gpu_video_encode_accelerator.cc +++ b/content/common/gpu/media/gpu_video_encode_accelerator.cc @@ -150,9 +150,6 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() { stub_->channel()->RemoveRoute(host_route_id_); stub_->RemoveDestructionObserver(this); - if (encoder_) - encoder_.release()->Destroy(); - delete this; } diff --git a/content/common/gpu/media/video_decode_accelerator_impl.cc b/content/common/gpu/media/video_decode_accelerator_impl.cc index 34f40ef..a3ae3936 100644 --- a/content/common/gpu/media/video_decode_accelerator_impl.cc +++ b/content/common/gpu/media/video_decode_accelerator_impl.cc @@ -8,8 +8,8 @@ namespace content { VideoDecodeAcceleratorImpl::VideoDecodeAcceleratorImpl() {} -VideoDecodeAcceleratorImpl::~VideoDecodeAcceleratorImpl() {} - bool VideoDecodeAcceleratorImpl::CanDecodeOnIOThread() { return false; } +VideoDecodeAcceleratorImpl::~VideoDecodeAcceleratorImpl() {} + } // namespace content diff --git a/content/common/gpu/media/video_decode_accelerator_impl.h b/content/common/gpu/media/video_decode_accelerator_impl.h index 30abfa6..c0762a0 100644 --- a/content/common/gpu/media/video_decode_accelerator_impl.h +++ b/content/common/gpu/media/video_decode_accelerator_impl.h @@ -14,7 +14,6 @@ class CONTENT_EXPORT VideoDecodeAcceleratorImpl : public media::VideoDecodeAccelerator { public: VideoDecodeAcceleratorImpl(); - virtual ~VideoDecodeAcceleratorImpl(); // Returns true if VDA::Decode and VDA::Client callbacks can run on the IO // thread. Otherwise they will run on the GPU child thread. The purpose of @@ -23,8 +22,29 @@ class CONTENT_EXPORT VideoDecodeAcceleratorImpl // PictureReady should be run on the child thread if a picture is delivered // the first time so it can be cleared. virtual bool CanDecodeOnIOThread(); + + protected: + virtual ~VideoDecodeAcceleratorImpl(); }; } // namespace content +namespace base { + +template <class T> +struct DefaultDeleter; + +// Specialize DefaultDeleter so that scoped_ptr<VideoDecodeAcceleratorImpl> +// always uses "Destroy()" instead of trying to use the destructor. +template <> +struct DefaultDeleter<content::VideoDecodeAcceleratorImpl> { + public: + inline void operator()(void* video_decode_accelerator) const { + static_cast<content::VideoDecodeAcceleratorImpl*>(video_decode_accelerator) + ->Destroy(); + } +}; + +} // namespace base + #endif // CONTENT_COMMON_GPU_MEDIA_VIDEO_DECODE_ACCELERATOR_IMPL_H_ diff --git a/content/common/gpu/media/video_decode_accelerator_unittest.cc b/content/common/gpu/media/video_decode_accelerator_unittest.cc index f758373..b733a46 100644 --- a/content/common/gpu/media/video_decode_accelerator_unittest.cc +++ b/content/common/gpu/media/video_decode_accelerator_unittest.cc @@ -773,7 +773,7 @@ void GLRenderingVDAClient::DeleteDecoder() { if (decoder_deleted()) return; weak_decoder_factory_.reset(); - decoder_.release()->Destroy(); + decoder_.reset(); STLClearObject(&encoded_data_); for (std::set<int>::iterator it = outstanding_texture_ids_.begin(); it != outstanding_texture_ids_.end(); ++it) { diff --git a/content/common/gpu/media/video_encode_accelerator_unittest.cc b/content/common/gpu/media/video_encode_accelerator_unittest.cc index 2ef00b8..b50e902 100644 --- a/content/common/gpu/media/video_encode_accelerator_unittest.cc +++ b/content/common/gpu/media/video_encode_accelerator_unittest.cc @@ -584,7 +584,7 @@ void VEAClient::DestroyEncoder() { DCHECK(thread_checker_.CalledOnValidThread()); if (!has_encoder()) return; - encoder_.release()->Destroy(); + encoder_.reset(); } double VEAClient::frames_per_second() { diff --git a/content/renderer/media/rtc_video_encoder.cc b/content/renderer/media/rtc_video_encoder.cc index e078b7e..22f17a1 100644 --- a/content/renderer/media/rtc_video_encoder.cc +++ b/content/renderer/media/rtc_video_encoder.cc @@ -279,8 +279,7 @@ void RTCVideoEncoder::Impl::RequestEncodingParametersChange(uint32 bitrate, void RTCVideoEncoder::Impl::Destroy() { DVLOG(3) << "Impl::Destroy()"; DCHECK(thread_checker_.CalledOnValidThread()); - if (video_encoder_) - video_encoder_.release()->Destroy(); + video_encoder_.reset(); } void RTCVideoEncoder::Impl::RequireBitstreamBuffers( @@ -400,8 +399,7 @@ void RTCVideoEncoder::Impl::NotifyError( retval = WEBRTC_VIDEO_CODEC_ERROR; } - if (video_encoder_) - video_encoder_.release()->Destroy(); + video_encoder_.reset(); if (async_waiter_) { SignalAsyncWaiter(retval); diff --git a/content/renderer/pepper/ppb_video_decoder_impl.cc b/content/renderer/pepper/ppb_video_decoder_impl.cc index 9844c36..4a3cde4 100644 --- a/content/renderer/pepper/ppb_video_decoder_impl.cc +++ b/content/renderer/pepper/ppb_video_decoder_impl.cc @@ -224,8 +224,7 @@ int32_t PPB_VideoDecoder_Impl::Reset(scoped_refptr<TrackedCallback> callback) { void PPB_VideoDecoder_Impl::Destroy() { FlushCommandBuffer(); - if (decoder_) - decoder_.release()->Destroy(); + decoder_.reset(); ppp_videodecoder_ = NULL; ::ppapi::PPB_VideoDecoder_Shared::Destroy(); diff --git a/media/cast/video_sender/external_video_encoder.cc b/media/cast/video_sender/external_video_encoder.cc index 4a4b556..1b31850 100644 --- a/media/cast/video_sender/external_video_encoder.cc +++ b/media/cast/video_sender/external_video_encoder.cc @@ -134,9 +134,7 @@ class LocalVideoEncodeAcceleratorClient DCHECK(encoder_task_runner_); DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); - if (video_encode_accelerator_) { - video_encode_accelerator_.release()->Destroy(); - } + video_encode_accelerator_.reset(); } void SetBitRate(uint32 bit_rate) { @@ -168,9 +166,7 @@ class LocalVideoEncodeAcceleratorClient DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); VLOG(1) << "ExternalVideoEncoder NotifyError: " << error; - if (video_encode_accelerator_) { - video_encode_accelerator_.release()->Destroy(); - } + video_encode_accelerator_.reset(); cast_environment_->PostTask( CastEnvironment::MAIN, FROM_HERE, diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index 5827c64..4bb30ba 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc @@ -220,8 +220,7 @@ void GpuVideoDecoder::DestroyPictureBuffers(PictureBufferMap* buffers) { void GpuVideoDecoder::DestroyVDA() { DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); - if (vda_) - vda_.release()->Destroy(); + vda_.reset(); // Not destroying PictureBuffers in |picture_buffers_at_display_| yet, since // their textures may still be in use by the user of this GpuVideoDecoder. diff --git a/media/video/video_decode_accelerator.cc b/media/video/video_decode_accelerator.cc index 9063d68..142dab3 100644 --- a/media/video/video_decode_accelerator.cc +++ b/media/video/video_decode_accelerator.cc @@ -9,3 +9,15 @@ namespace media { VideoDecodeAccelerator::~VideoDecodeAccelerator() {} } + +namespace base { + +void DefaultDeleter<media::VideoDecodeAccelerator>::operator()( + void* video_decode_accelerator) const { + static_cast<media::VideoDecodeAccelerator*>(video_decode_accelerator)-> + Destroy(); +} + +} // namespace base + + diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h index 950ac8d..7025a51 100644 --- a/media/video/video_decode_accelerator.h +++ b/media/video/video_decode_accelerator.h @@ -20,8 +20,6 @@ namespace media { // implement the backend of PPB_VideoDecode_Dev. class MEDIA_EXPORT VideoDecodeAccelerator { public: - virtual ~VideoDecodeAccelerator(); - // Enumeration of potential errors generated by the API. // Note: Keep these in sync with PP_VideoDecodeError_Dev. Also do not // rearrange, reuse or remove values as they are used for gathering UMA @@ -133,8 +131,28 @@ class MEDIA_EXPORT VideoDecodeAccelerator { // no more callbacks will be made on the client. Deletes |this| // unconditionally, so make sure to drop all pointers to it! virtual void Destroy() = 0; + + protected: + // Do not delete directly; use Destroy() or own it with a scoped_ptr, which + // will Destroy() it properly by default. + virtual ~VideoDecodeAccelerator(); }; } // namespace media +namespace base { + +template <class T> +struct DefaultDeleter; + +// Specialize DefaultDeleter so that scoped_ptr<VideoDecodeAccelerator> always +// uses "Destroy()" instead of trying to use the destructor. +template <> +struct MEDIA_EXPORT DefaultDeleter<media::VideoDecodeAccelerator> { + public: + void operator()(void* video_decode_accelerator) const; +}; + +} // namespace base + #endif // MEDIA_VIDEO_VIDEO_DECODE_ACCELERATOR_H_ diff --git a/media/video/video_encode_accelerator.cc b/media/video/video_encode_accelerator.cc index 6309180..d8a5838 100644 --- a/media/video/video_encode_accelerator.cc +++ b/media/video/video_encode_accelerator.cc @@ -9,3 +9,14 @@ namespace media { VideoEncodeAccelerator::~VideoEncodeAccelerator() {} } // namespace media + +namespace base { + +void DefaultDeleter<media::VideoEncodeAccelerator>::operator()( + void* video_encode_accelerator) const { + static_cast<media::VideoEncodeAccelerator*>(video_encode_accelerator)-> + Destroy(); +} + +} // namespace base + diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h index fd934dd..891204b 100644 --- a/media/video/video_encode_accelerator.h +++ b/media/video/video_encode_accelerator.h @@ -22,8 +22,6 @@ class VideoFrame; // Video encoder interface. class MEDIA_EXPORT VideoEncodeAccelerator { public: - virtual ~VideoEncodeAccelerator(); - // Specification of an encoding profile supported by an encoder. struct SupportedProfile { VideoCodecProfile profile; @@ -143,8 +141,28 @@ class MEDIA_EXPORT VideoEncodeAccelerator { // this method returns no more callbacks will be made on the client. Deletes // |this| unconditionally, so make sure to drop all pointers to it! virtual void Destroy() = 0; + + protected: + // Do not delete directly; use Destroy() or own it with a scoped_ptr, which + // will Destroy() it properly by default. + virtual ~VideoEncodeAccelerator(); }; } // namespace media +namespace base { + +template <class T> +struct DefaultDeleter; + +// Specialize DefaultDeleter so that scoped_ptr<VideoEncodeAccelerator> always +// uses "Destroy()" instead of trying to use the destructor. +template <> +struct MEDIA_EXPORT DefaultDeleter<media::VideoEncodeAccelerator> { + public: + void operator()(void* video_encode_accelerator) const; +}; + +} // namespace base + #endif // MEDIA_VIDEO_VIDEO_ENCODE_ACCELERATOR_H_ |