mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
efe35b01d5
In this patch, we ask the media engine to return a handle for shareable dcomp surface, which will then be packaged into a new texture data type and being shared with the GPU process via the video bridge. DcompSurfaceImage is the image which contains the handle texture data, which doesn't support being accessed in the content process. When the compositor uploads the image to the GPU process, the corresponding texture host will be created. The render texture host will be created by that texture host, and it will be used in DCLayerTree. In DCLayerTree, we create a new type of surface for our dcomp handle. DCSurfaceHandle will ask the render texture host to reconstruct the surface by the handle shared from the remote process (the handle is actually duplicated to the parent process first due to the sandbox policy, and then be duplicated to the GPU process later) DCSurfaceHandle will attach that surface to its visual in order to display the video frame directly. In the whole process, it's not possible for Gecko to access any decoded video data which is protected by the media engine itself. Depends on D149941 Differential Revision: https://phabricator.services.mozilla.com/D151019
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
/* -*- Mode: C++; tab-width: ; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef MOZILLA_GFX_RENDERDCOMPSURFACETEXTUREHOST_H
|
|
#define MOZILLA_GFX_RENDERDCOMPSURFACETEXTUREHOST_H
|
|
|
|
#include "GLTypes.h"
|
|
#include "RenderTextureHostSWGL.h"
|
|
#include "mozilla/webrender/RenderThread.h"
|
|
|
|
struct IDCompositionDevice;
|
|
struct IDCompositionSurface;
|
|
|
|
inline mozilla::LazyLogModule gDcompSurface("DcompSurface");
|
|
|
|
namespace mozilla::wr {
|
|
|
|
/**
|
|
* A render texture host is responsible to create a dcomp surface from an
|
|
* existing dcomp handle. Currently usage is that MF media engine will create
|
|
* a surface handle from another remote process, and we reconstruct the surface
|
|
* and use it in the DCLayerTree in the GPU process.
|
|
*/
|
|
class RenderDcompSurfaceTextureHost final : public RenderTextureHostSWGL {
|
|
public:
|
|
RenderDcompSurfaceTextureHost(HANDLE aHandle, gfx::IntSize aSize,
|
|
gfx::SurfaceFormat aFormat);
|
|
|
|
// RenderTextureHost
|
|
RenderDcompSurfaceTextureHost* AsRenderDcompSurfaceTextureHost() override {
|
|
return this;
|
|
}
|
|
|
|
// RenderTextureHostSWGL
|
|
gfx::SurfaceFormat GetFormat() const override { return mFormat; }
|
|
gfx::ColorDepth GetColorDepth() const override {
|
|
return gfx::ColorDepth::COLOR_8;
|
|
}
|
|
size_t GetPlaneCount() const override { return 1; }
|
|
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
|
|
PlaneInfo& aPlaneInfo) override {
|
|
return false;
|
|
}
|
|
void UnmapPlanes() override {}
|
|
gfx::YUVRangedColorSpace GetYUVColorSpace() const override {
|
|
return gfx::YUVRangedColorSpace::GbrIdentity;
|
|
}
|
|
size_t Bytes() override { return 0; }
|
|
|
|
gfx::IntSize GetSize() const { return mSize; };
|
|
|
|
HANDLE GetDcompSurfaceHandle() const { return mHandle; }
|
|
|
|
// Not thread-safe. They should only be called on the renderer thread on the
|
|
// GPU process.
|
|
IDCompositionSurface* CreateSurfaceFromDevice(IDCompositionDevice* aDevice);
|
|
IDCompositionSurface* GetSurface() const { return mDcompSurface; };
|
|
|
|
private:
|
|
const HANDLE mHandle;
|
|
const gfx::IntSize mSize;
|
|
const gfx::SurfaceFormat mFormat;
|
|
RefPtr<IDCompositionSurface> mDcompSurface;
|
|
};
|
|
|
|
} // namespace mozilla::wr
|
|
|
|
#endif // MOZILLA_GFX_RENDERDCOMPSURFACETEXTUREHOST_H
|