diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/webcodecs')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/webcodecs/video_encoder.cc | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/chromium/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/chromium/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index fed19b9868a..feb69ba08bf 100644 --- a/chromium/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/chromium/third_party/blink/renderer/modules/webcodecs/video_encoder.cc @@ -70,6 +70,7 @@ #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" @@ -102,16 +103,6 @@ namespace { constexpr const char kCategory[] = "media"; constexpr int kMaxActiveEncodes = 5; -// Use this function in cases when we can't immediately delete |ptr| because -// there might be its methods on the call stack. -template <typename T> -void DeleteLater(ScriptState* state, std::unique_ptr<T> ptr) { - DCHECK(state->ContextIsValid()); - auto* context = ExecutionContext::From(state); - auto runner = context->GetTaskRunner(TaskType::kInternalDefault); - runner->DeleteSoon(FROM_HERE, std::move(ptr)); -} - bool IsAcceleratedConfigurationSupported( media::VideoCodecProfile profile, const media::VideoEncoder::Options& options, @@ -1005,6 +996,7 @@ void VideoEncoder::ResetInternal() { } static void isConfigSupportedWithSoftwareOnly( + ScriptState* script_state, ScriptPromiseResolver* resolver, VideoEncoderSupport* support, VideoEncoderTraits::ParsedConfig* config) { @@ -1029,22 +1021,25 @@ static void isConfigSupportedWithSoftwareOnly( return; } - auto done_callback = [](std::unique_ptr<media::VideoEncoder> sw_encoder, + auto done_callback = [](std::unique_ptr<media::VideoEncoder> encoder, ScriptPromiseResolver* resolver, + scoped_refptr<base::SingleThreadTaskRunner> runner, VideoEncoderSupport* support, media::EncoderStatus status) { support->setSupported(status.is_ok()); resolver->Resolve(support); - DeleteLater(resolver->GetScriptState(), std::move(sw_encoder)); + runner->DeleteSoon(FROM_HERE, std::move(encoder)); }; + auto* context = ExecutionContext::From(script_state); + auto runner = context->GetTaskRunner(TaskType::kInternalDefault); auto* software_encoder_raw = software_encoder.get(); software_encoder_raw->Initialize( config->profile, config->options, base::DoNothing(), - ConvertToBaseOnceCallback( - CrossThreadBindOnce(done_callback, std::move(software_encoder), - WrapCrossThreadPersistent(resolver), - WrapCrossThreadPersistent(support)))); + ConvertToBaseOnceCallback(CrossThreadBindOnce( + done_callback, std::move(software_encoder), + WrapCrossThreadPersistent(resolver), std::move(runner), + WrapCrossThreadPersistent(support)))); } static void isConfigSupportedWithHardwareOnly( @@ -1131,7 +1126,8 @@ ScriptPromise VideoEncoder::isConfigSupported(ScriptState* script_state, promises.push_back(resolver->Promise()); auto* support = VideoEncoderSupport::Create(); support->setConfig(config_copy); - isConfigSupportedWithSoftwareOnly(resolver, support, parsed_config); + isConfigSupportedWithSoftwareOnly(script_state, resolver, support, + parsed_config); } // Wait for all |promises| to resolve and check if any of them have |