1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/webcodecs/gpu_factories_retriever.h"
#include "media/video/gpu_video_accelerator_factories.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
#include "third_party/blink/renderer/platform/wtf/wtf.h"
namespace blink {
// Define a function that is allowed to access MainThreadTaskRunnerRestricted.
MainThreadTaskRunnerRestricted AccessMainThreadForGpuFactories() {
return {};
}
namespace {
media::GpuVideoAcceleratorFactories* GetGpuFactoriesOnMainThread() {
DCHECK(IsMainThread());
return Platform::Current()->GetGpuFactories();
}
void RetrieveGpuFactories(OutputCB result_callback) {
if (IsMainThread()) {
std::move(result_callback).Run(GetGpuFactoriesOnMainThread());
return;
}
Thread::MainThread()
->GetTaskRunner(AccessMainThreadForGpuFactories())
->PostTaskAndReplyWithResult(
FROM_HERE,
ConvertToBaseOnceCallback(
CrossThreadBindOnce(&GetGpuFactoriesOnMainThread)),
ConvertToBaseOnceCallback(std::move(result_callback)));
}
void OnSupportKnown(OutputCB result_cb,
media::GpuVideoAcceleratorFactories* factories) {
std::move(result_cb).Run(factories);
}
} // namespace
void RetrieveGpuFactoriesWithKnownEncoderSupport(OutputCB callback) {
auto on_factories_received =
[](OutputCB result_cb, media::GpuVideoAcceleratorFactories* factories) {
if (!factories || factories->IsEncoderSupportKnown()) {
std::move(result_cb).Run(factories);
} else {
factories->NotifyEncoderSupportKnown(ConvertToBaseOnceCallback(
CrossThreadBindOnce(OnSupportKnown, std::move(result_cb),
CrossThreadUnretained(factories))));
}
};
auto factories_callback =
CrossThreadBindOnce(on_factories_received, std::move(callback));
RetrieveGpuFactories(std::move(factories_callback));
}
void RetrieveGpuFactoriesWithKnownDecoderSupport(OutputCB callback) {
auto on_factories_received =
[](OutputCB result_cb, media::GpuVideoAcceleratorFactories* factories) {
if (!factories || factories->IsDecoderSupportKnown()) {
std::move(result_cb).Run(factories);
} else {
factories->NotifyDecoderSupportKnown(ConvertToBaseOnceCallback(
CrossThreadBindOnce(OnSupportKnown, std::move(result_cb),
CrossThreadUnretained(factories))));
}
};
auto factories_callback =
CrossThreadBindOnce(on_factories_received, std::move(callback));
RetrieveGpuFactories(std::move(factories_callback));
}
} // namespace blink
|