gecko-dev/dom/media/ipc/RemoteDecoderManagerParent.h
Matt Woodrow cf1e91357b Bug 1561178 - Use Endpoints for VideoBridge construction, and support the possibility that there are multiple at the same time. r=jya
In the future we're going to want VideoBridge connections from the RDD process into both the parent process and the GPU process.
This does the preparation work for unifying the way we create VideoBridges (using Endpoints, required for cross-process connections),
and detects which one to use based on where the video will be composited.

Differential Revision: https://phabricator.services.mozilla.com/D35968

--HG--
extra : moz-landing-system : lando
2019-06-28 07:00:41 +00:00

72 lines
2.5 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 include_dom_media_ipc_RemoteDecoderManagerParent_h
#define include_dom_media_ipc_RemoteDecoderManagerParent_h
#include "mozilla/PRemoteDecoderManagerParent.h"
#include "mozilla/layers/VideoBridgeChild.h"
namespace mozilla {
class RemoteDecoderManagerThreadHolder;
class RemoteDecoderManagerParent final : public PRemoteDecoderManagerParent {
friend class PRemoteDecoderManagerParent;
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RemoteDecoderManagerParent)
static bool CreateForContent(
Endpoint<PRemoteDecoderManagerParent>&& aEndpoint);
static bool CreateVideoBridgeToParentProcess(
Endpoint<layers::PVideoBridgeChild>&& aEndpoint);
// Can be called from any thread
SurfaceDescriptorGPUVideo StoreImage(layers::Image* aImage,
layers::TextureClient* aTexture);
static bool StartupThreads();
static void ShutdownThreads();
static void ShutdownVideoBridge();
bool OnManagerThread();
protected:
PRemoteDecoderParent* AllocPRemoteDecoderParent(
const RemoteDecoderInfoIPDL& aRemoteDecoderInfo,
const CreateDecoderParams::OptionSet& aOptions,
const Maybe<layers::TextureFactoryIdentifier>& aIdentifier,
bool* aSuccess, nsCString* aBlacklistedD3D11Driver,
nsCString* aBlacklistedD3D9Driver, nsCString* aErrorDescription);
bool DeallocPRemoteDecoderParent(PRemoteDecoderParent* actor);
mozilla::ipc::IPCResult RecvReadback(const SurfaceDescriptorGPUVideo& aSD,
SurfaceDescriptor* aResult);
mozilla::ipc::IPCResult RecvDeallocateSurfaceDescriptorGPUVideo(
const SurfaceDescriptorGPUVideo& aSD);
void ActorDestroy(mozilla::ipc::IProtocol::ActorDestroyReason) override;
void ActorDealloc() override;
private:
explicit RemoteDecoderManagerParent(
RemoteDecoderManagerThreadHolder* aThreadHolder);
~RemoteDecoderManagerParent();
void Open(Endpoint<PRemoteDecoderManagerParent>&& aEndpoint);
std::map<uint64_t, RefPtr<layers::Image>> mImageMap;
std::map<uint64_t, RefPtr<layers::TextureClient>> mTextureMap;
RefPtr<RemoteDecoderManagerThreadHolder> mThreadHolder;
};
} // namespace mozilla
#endif // include_dom_media_ipc_RemoteDecoderManagerParent_h