Commit 3b04f4d6 authored by Dan Sanders's avatar Dan Sanders Committed by Chromium LUCI CQ

[webcodecs] Support VideoFrame.createImageBitmap() in workers

Creation of ImageBitmaps from VideoFrames is implemented using a
viz::RasterContextProvider in //media. Such a thing is available
from Platform on the main thread, but not in workers.

This CL exposes the underlying viz::RasterContextProvider from
WebGraphicsContext3DProvider so that the //media code can be called
using the SharedGpuContext context.

Bug: 1148849
Change-Id: Ie69e84e423f7e6f4aca13b7b86bcf178b3e15958
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2570331
Commit-Queue: Dan Sanders <sandersd@chromium.org>
Reviewed-by: default avatarKenneth Russell <kbr@chromium.org>
Reviewed-by: default avatarChrome Cunningham <chcunningham@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833949}
parent 6a856e64
......@@ -198,7 +198,12 @@ void WebGraphicsContext3DProviderImpl::CopyVideoFrame(
media::PaintCanvasVideoRenderer* video_renderer,
media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) {
video_renderer->Copy(video_frame, canvas, context_provider());
video_renderer->Copy(video_frame, canvas, provider_.get());
}
viz::RasterContextProvider*
WebGraphicsContext3DProviderImpl::RasterContextProvider() const {
return provider_.get();
}
} // namespace content
......@@ -57,10 +57,7 @@ class CONTENT_EXPORT WebGraphicsContext3DProviderImpl
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override;
viz::ContextProviderCommandBuffer* context_provider() const {
return provider_.get();
}
viz::RasterContextProvider* RasterContextProvider() const override;
private:
// viz::ContextLostObserver implementation.
......
......@@ -65,7 +65,11 @@ class RasterInterface;
namespace webgpu {
class WebGPUInterface;
}
}
} // namespace gpu
namespace viz {
class RasterContextProvider;
} // namespace viz
namespace blink {
enum AntialiasingMode {
......@@ -111,6 +115,7 @@ class WebGraphicsContext3DProvider {
virtual void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) = 0;
virtual viz::RasterContextProvider* RasterContextProvider() const = 0;
};
} // namespace blink
......
......@@ -6,6 +6,7 @@
#include <utility>
#include "base/memory/scoped_refptr.h"
#include "components/viz/common/gpu/raster_context_provider.h"
#include "components/viz/common/resources/single_release_callback.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
......@@ -454,20 +455,20 @@ ScriptPromise VideoFrame::CreateImageBitmap(ScriptState* script_state,
SkImage::MakeRasterData(info, image_pixels, bytes_per_row);
image = UnacceleratedStaticBitmapImage::Create(std::move(skImage));
} else {
if (!IsMainThread()) {
// TODO(crbug.com/1148849): We should either hop to the media thread and
// use the media context, or use the SharedGpuContext. Currently
// obtaining the media context requires synchronizing with the main
// thread, and PaintCanvasVideoRenderer is not compatible with
// SharedGpuContext.
scoped_refptr<viz::RasterContextProvider> raster_context_provider;
base::WeakPtr<WebGraphicsContext3DProviderWrapper> wrapper =
SharedGpuContext::ContextProviderWrapper();
if (wrapper && wrapper->ContextProvider()) {
raster_context_provider = base::WrapRefCounted(
wrapper->ContextProvider()->RasterContextProvider());
}
if (!raster_context_provider) {
exception_state.ThrowDOMException(DOMExceptionCode::kOperationError,
"Graphics context unavailable.");
return ScriptPromise();
}
scoped_refptr<viz::RasterContextProvider> raster_context_provider =
Platform::Current()->SharedMainThreadContextProvider();
auto* ri = raster_context_provider->RasterInterface();
auto* ri = raster_context_provider->RasterInterface();
gpu::SharedImageInterface* shared_image_interface =
raster_context_provider->SharedImageInterface();
uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2;
......
......@@ -74,6 +74,9 @@ class WebGraphicsContext3DProviderForTests
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override {}
viz::RasterContextProvider* RasterContextProvider() const override {
return nullptr;
}
private:
cc::StubDecodeCache image_decode_cache_;
......
......@@ -90,6 +90,9 @@ class FakeWebGraphicsContext3DProvider : public WebGraphicsContext3DProvider {
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override {}
viz::RasterContextProvider* RasterContextProvider() const override {
return nullptr;
}
private:
cc::StubDecodeCache stub_image_decode_cache_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment