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);
};