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( ...@@ -198,7 +198,12 @@ void WebGraphicsContext3DProviderImpl::CopyVideoFrame(
media::PaintCanvasVideoRenderer* video_renderer, media::PaintCanvasVideoRenderer* video_renderer,
media::VideoFrame* video_frame, media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) { 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 } // namespace content
...@@ -57,10 +57,7 @@ class CONTENT_EXPORT WebGraphicsContext3DProviderImpl ...@@ -57,10 +57,7 @@ class CONTENT_EXPORT WebGraphicsContext3DProviderImpl
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render, void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame, media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override; cc::PaintCanvas* canvas) override;
viz::RasterContextProvider* RasterContextProvider() const override;
viz::ContextProviderCommandBuffer* context_provider() const {
return provider_.get();
}
private: private:
// viz::ContextLostObserver implementation. // viz::ContextLostObserver implementation.
......
...@@ -65,7 +65,11 @@ class RasterInterface; ...@@ -65,7 +65,11 @@ class RasterInterface;
namespace webgpu { namespace webgpu {
class WebGPUInterface; class WebGPUInterface;
} }
} } // namespace gpu
namespace viz {
class RasterContextProvider;
} // namespace viz
namespace blink { namespace blink {
enum AntialiasingMode { enum AntialiasingMode {
...@@ -111,6 +115,7 @@ class WebGraphicsContext3DProvider { ...@@ -111,6 +115,7 @@ class WebGraphicsContext3DProvider {
virtual void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render, virtual void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame, media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) = 0; cc::PaintCanvas* canvas) = 0;
virtual viz::RasterContextProvider* RasterContextProvider() const = 0;
}; };
} // namespace blink } // namespace blink
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <utility> #include <utility>
#include "base/memory/scoped_refptr.h"
#include "components/viz/common/gpu/raster_context_provider.h" #include "components/viz/common/gpu/raster_context_provider.h"
#include "components/viz/common/resources/single_release_callback.h" #include "components/viz/common/resources/single_release_callback.h"
#include "gpu/command_buffer/client/shared_image_interface.h" #include "gpu/command_buffer/client/shared_image_interface.h"
...@@ -454,20 +455,20 @@ ScriptPromise VideoFrame::CreateImageBitmap(ScriptState* script_state, ...@@ -454,20 +455,20 @@ ScriptPromise VideoFrame::CreateImageBitmap(ScriptState* script_state,
SkImage::MakeRasterData(info, image_pixels, bytes_per_row); SkImage::MakeRasterData(info, image_pixels, bytes_per_row);
image = UnacceleratedStaticBitmapImage::Create(std::move(skImage)); image = UnacceleratedStaticBitmapImage::Create(std::move(skImage));
} else { } else {
if (!IsMainThread()) { scoped_refptr<viz::RasterContextProvider> raster_context_provider;
// TODO(crbug.com/1148849): We should either hop to the media thread and base::WeakPtr<WebGraphicsContext3DProviderWrapper> wrapper =
// use the media context, or use the SharedGpuContext. Currently SharedGpuContext::ContextProviderWrapper();
// obtaining the media context requires synchronizing with the main if (wrapper && wrapper->ContextProvider()) {
// thread, and PaintCanvasVideoRenderer is not compatible with raster_context_provider = base::WrapRefCounted(
// SharedGpuContext. wrapper->ContextProvider()->RasterContextProvider());
}
if (!raster_context_provider) {
exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, exception_state.ThrowDOMException(DOMExceptionCode::kOperationError,
"Graphics context unavailable."); "Graphics context unavailable.");
return ScriptPromise(); 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 = gpu::SharedImageInterface* shared_image_interface =
raster_context_provider->SharedImageInterface(); raster_context_provider->SharedImageInterface();
uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2; uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2;
......
...@@ -74,6 +74,9 @@ class WebGraphicsContext3DProviderForTests ...@@ -74,6 +74,9 @@ class WebGraphicsContext3DProviderForTests
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render, void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame, media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override {} cc::PaintCanvas* canvas) override {}
viz::RasterContextProvider* RasterContextProvider() const override {
return nullptr;
}
private: private:
cc::StubDecodeCache image_decode_cache_; cc::StubDecodeCache image_decode_cache_;
......
...@@ -90,6 +90,9 @@ class FakeWebGraphicsContext3DProvider : public WebGraphicsContext3DProvider { ...@@ -90,6 +90,9 @@ class FakeWebGraphicsContext3DProvider : public WebGraphicsContext3DProvider {
void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render, void CopyVideoFrame(media::PaintCanvasVideoRenderer* video_render,
media::VideoFrame* video_frame, media::VideoFrame* video_frame,
cc::PaintCanvas* canvas) override {} cc::PaintCanvas* canvas) override {}
viz::RasterContextProvider* RasterContextProvider() const override {
return nullptr;
}
private: private:
cc::StubDecodeCache stub_image_decode_cache_; 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