summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/gpu/media/gpu_video_decode_accelerator.cc3
-rw-r--r--content/common/gpu/media/gpu_video_encode_accelerator.cc3
-rw-r--r--content/common/gpu/media/video_decode_accelerator_impl.cc4
-rw-r--r--content/common/gpu/media/video_decode_accelerator_impl.h22
-rw-r--r--content/common/gpu/media/video_decode_accelerator_unittest.cc2
-rw-r--r--content/common/gpu/media/video_encode_accelerator_unittest.cc2
-rw-r--r--content/renderer/media/rtc_video_encoder.cc6
-rw-r--r--content/renderer/pepper/ppb_video_decoder_impl.cc3
-rw-r--r--media/cast/video_sender/external_video_encoder.cc8
-rw-r--r--media/filters/gpu_video_decoder.cc3
-rw-r--r--media/video/video_decode_accelerator.cc12
-rw-r--r--media/video/video_decode_accelerator.h22
-rw-r--r--media/video/video_encode_accelerator.cc11
-rw-r--r--media/video/video_encode_accelerator.h22
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_