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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
media / mojo / mojom / interface_factory.mojom [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module media.mojom;
import "media/mojo/mojom/audio_decoder.mojom";
import "media/mojo/mojom/audio_encoder.mojom";
import "media/mojo/mojom/decryptor.mojom";
import "media/mojo/mojom/content_decryption_module.mojom";
import "media/mojo/mojom/media_log.mojom";
import "media/mojo/mojom/media_types.mojom";
import "media/mojo/mojom/renderer.mojom";
import "media/mojo/mojom/renderer_extensions.mojom";
import "media/mojo/mojom/stable/stable_video_decoder.mojom";
import "media/mojo/mojom/video_decoder.mojom";
import "mojo/public/mojom/base/token.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
// A factory for creating media mojo interfaces. Renderers can only access
// ContentDecryptionModules created with the same factory.
interface InterfaceFactory {
CreateAudioDecoder(pending_receiver<AudioDecoder> audio_decoder);
// Creates a VideoDecoder (|video_decoder|). If |dst_video_decoder| is
// provided and supported by the implementation, VideoDecoder calls on
// |video_decoder| should be forwarded to |dst_video_decoder|. This is
// intended to be used for out-of-process video decoding and LaCrOS in which
// the GPU process acts a proxy between a renderer and a video decoder process
// so that it can create a gpu::Mailbox for each decoded frame. As such, only
// the GPU process should be provided with a valid |dst_video_decoder|.
//
// TODO(b/327268445): we can remove the `dst_video_decoder` parameter once
// GTFO OOP-VD is used instead of regular OOP-VD.
CreateVideoDecoder(
pending_receiver<VideoDecoder> video_decoder,
pending_remote<media.stable.mojom.StableVideoDecoder>? dst_video_decoder);
// Creates a StableVideoDecoder (`video_decoder`). This method is intended to
// be used only for the "GTFO OOP-VD" mode, i.e., when the StableVideoDecoder
// client talks directly to the StableVideoDecoder service without using the
// GPU process as a proxy (in contrast to the "regular OOP-VD" mode).
//
// The StableVideoDecoder implementation lives in a utility process. Clients
// are expected to live in either the browser process (for supported profile
// querying) or the renderer process (to drive video decoding).
[EnableIf=allow_oop_video_decoder]
CreateStableVideoDecoder(
pending_receiver<media.stable.mojom.StableVideoDecoder> video_decoder);
// Creates an AudioEncoder bound to a given receiver.
CreateAudioEncoder(pending_receiver<AudioEncoder> audio_encoder);
// Creates a regular media::Renderer (RendererImplFactory).
// TODO(guohuideng): remove |audio_device_id|, it's not used.
// TODO(crbug.com/40242503): Rename this call.
CreateDefaultRenderer(string audio_device_id,
pending_receiver<Renderer> renderer);
[EnableIf=enable_cast_renderer]
// Creates a CastRenderer (CastRendererClientFactory).
// This is used on Chromecast only. The |overlay_plane_id| is generated by
// VideoOverlayFactory owned by MojoRenderer, therefore identifies the
// MojoRenderer. With |overlay_plane_id|, The service can keep track of
// which hosted CastRenderer is associated with which client.
// This is necessary because MediaService will need to look up CastRenderer
// by the |overlay_plane_id| to set video geometry on.
CreateCastRenderer(mojo_base.mojom.UnguessableToken overlay_plane_id,
pending_receiver<Renderer> renderer);
[EnableIf=is_android]
// Creates a MediaPlayerRenderer (MediaPlayerRendererClientFactory).
// - |renderer_extension| is bound in MediaPlayerRenderer, and receives calls
// from MediaPlayerRendererClient.
// - |client_extension| is bound in MediaPlayerRendererClient, and receives
// calls from the MediaPlayerRenderer.
CreateMediaPlayerRenderer(
pending_remote<MediaPlayerRendererClientExtension> client_extension,
pending_receiver<Renderer> renderer,
pending_receiver<MediaPlayerRendererExtension> renderer_extension);
[EnableIf=is_win]
// Creates a MediaFoundationRenderer (MediaFoundationRendererClientFactory).
// - |renderer_extension| is bound in MediaFoundationRenderer, and receives
// calls from MediaFoundationRendererClient.
// - |client_extension| is bound in MediaFoundationRendererClient, and
// received calls from MediaFoundationRenderer.
CreateMediaFoundationRenderer(
pending_remote<MediaLog> media_log,
pending_receiver<Renderer> renderer,
pending_receiver<MediaFoundationRendererExtension> renderer_extension,
pending_remote<MediaFoundationRendererClientExtension> client_extension);
[EnableIf=is_android]
// Creates a FlingingRenderer (FlingingRendererClientFactory).
// The |presentation_id| is used to find an already set-up RemotePlayback
// session (see blink::RemotePlayback).
CreateFlingingRenderer(
string presentation_id,
pending_remote<FlingingRendererClientExtension> client_extension,
pending_receiver<Renderer> renderer);
// Creates a CDM based on the `cdm_config` provided. The `key_system` in the
// `cdm_config` is a generic term for a decryption mechanism and/or content
// protection provider. It should be a reverse domain name,
// e.g. "com.example.somesystem". However, this call may be initiated by an
// untrusted process (e.g. renderer), so the implementation must fully
// validate `key_system` before creating the CDM. `cdm_config` specifies other
// properties of the CDM which may influence creation. Upon failure, the
// returned `cdm` and `cdm_context` will be null, and `status` will
// specify the error reason. Upon success, `cdm` and `cdm_context` will be
// valid, and `status` will be CreateCdmStatus::kSuccess.
CreateCdm(CdmConfig cdm_config) =>
(pending_remote<ContentDecryptionModule>? cdm,
CdmContext? cdm_context,
CreateCdmStatus status);
};