| Index: content/renderer/media_recorder/video_track_recorder.cc
|
| diff --git a/content/renderer/media_recorder/video_track_recorder.cc b/content/renderer/media_recorder/video_track_recorder.cc
|
| index 81245344ca211a02f51c319dfc3726d1eee81666..a9661b2ed70507f9116caa94952bd28dc2f599e5 100644
|
| --- a/content/renderer/media_recorder/video_track_recorder.cc
|
| +++ b/content/renderer/media_recorder/video_track_recorder.cc
|
| @@ -439,6 +439,8 @@ class VEAEncoder final : public VideoTrackRecorder::Encoder,
|
| base::TimeTicks capture_timestamp) override;
|
| void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
|
|
|
| + void DestroyOnEncodingTaskRunner(base::WaitableEvent* async_waiter);
|
| +
|
| media::GpuVideoAcceleratorFactories* const gpu_factories_;
|
|
|
| const media::VideoCodecProfile codec_;
|
| @@ -575,9 +577,20 @@ VEAEncoder::VEAEncoder(
|
| }
|
|
|
| VEAEncoder::~VEAEncoder() {
|
| + base::WaitableEvent release_waiter(
|
| + base::WaitableEvent::ResetPolicy::MANUAL,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| + // base::Unretained is safe because the class will be alive until
|
| + // |release_waiter| is signaled.
|
| + // TODO(emircan): Consider refactoring media::VideoEncodeAccelerator to avoid
|
| + // using naked pointers and using DeleteSoon() here, see
|
| + // http://crbug.com/701627.
|
| + // It is currently unsafe because |video_encoder_| might be in use on another
|
| + // function on |encoding_task_runner_|, see http://crbug.com/701030.
|
| encoding_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&media::VideoEncodeAccelerator::Destroy,
|
| - base::Unretained(video_encoder_.release())));
|
| + FROM_HERE, base::Bind(&VEAEncoder::DestroyOnEncodingTaskRunner,
|
| + base::Unretained(this), &release_waiter));
|
| + release_waiter.Wait();
|
| }
|
|
|
| void VEAEncoder::RequireBitstreamBuffers(unsigned int /*input_count*/,
|
| @@ -732,10 +745,7 @@ void VEAEncoder::EncodeOnEncodingTaskRunner(
|
| frames_in_encode_.push(std::make_pair(
|
| media::WebmMuxer::VideoParameters(frame), capture_timestamp));
|
|
|
| - encoding_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&media::VideoEncodeAccelerator::Encode,
|
| - base::Unretained(video_encoder_.get()), video_frame, false));
|
| + video_encoder_->Encode(video_frame, false);
|
| }
|
|
|
| void VEAEncoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) {
|
| @@ -753,6 +763,13 @@ void VEAEncoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) {
|
| }
|
| }
|
|
|
| +void VEAEncoder::DestroyOnEncodingTaskRunner(
|
| + base::WaitableEvent* async_waiter) {
|
| + DCHECK(encoding_task_runner_->BelongsToCurrentThread());
|
| + video_encoder_.reset();
|
| + async_waiter->Signal();
|
| +}
|
| +
|
| // static
|
| void VpxEncoder::ShutdownEncoder(std::unique_ptr<base::Thread> encoding_thread,
|
| ScopedVpxCodecCtxPtr encoder) {
|
|
|