File: playback_command_dispatcher.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (156 lines) | stat: -rw-r--r-- 7,040 bytes parent folder | download | duplicates (9)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_CAST_STREAMING_BROWSER_CONTROL_PLAYBACK_COMMAND_DISPATCHER_H_
#define COMPONENTS_CAST_STREAMING_BROWSER_CONTROL_PLAYBACK_COMMAND_DISPATCHER_H_

#include <memory>

#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "components/cast_streaming/browser/common/streaming_initialization_info.h"
#include "components/cast_streaming/browser/control/remoting/remoting_session_client.h"
#include "components/cast_streaming/browser/control/remoting/renderer_rpc_call_translator.h"
#include "components/cast_streaming/browser/control/remoting/rpc_demuxer_stream_handler.h"
#include "components/cast_streaming/browser/control/remoting/rpc_initialization_call_handler_base.h"
#include "components/cast_streaming/browser/control/renderer_control_multiplexer.h"
#include "components/cast_streaming/browser/public/receiver_config.h"
#include "components/cast_streaming/common/public/mojom/renderer_controller.mojom.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/video_decoder_config.h"
#include "media/mojo/mojom/renderer.mojom.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "third_party/openscreen/src/cast/streaming/public/receiver_session.h"
#include "third_party/openscreen/src/cast/streaming/public/rpc_messenger.h"

namespace openscreen {
namespace cast {
class RpcMessage;
}  // namespace cast
}  // namespace openscreen

namespace cast_streaming {

namespace remoting {
class RendererRpcCallTranslator;
}  // namespace remoting

// This class is responsible for initiating a mojo connection to a
// media::Renderer (expected to be a PlaybackCommandForwardingRenderer) via an
// initial call to |control_configuration| and then setting up any necessary
// infrastructure for messages to be passed across this pipe. While this class
// is used to initiate and maintain control over a Renderer for a Cast Remoting
// session, it is also used for starting playback of a Cast Mirroring session.
class PlaybackCommandDispatcher
    : public remoting::RpcInitializationCallHandlerBase,
      public remoting::RemotingSessionClient,
      public remoting::RpcDemuxerStreamHandler::Client {
 public:
  // Creates a new PlaybackCommandDispatcher.
  // |flush_until_cb| will be called when a Flush() remoting command is
  // received, if remoting is enabled.
  // |remoting_constraints| will be validated against received config values for
  // configs received when configuring the remoting stream, if remoting is
  // enabled.
  PlaybackCommandDispatcher(
      scoped_refptr<base::SequencedTaskRunner> task_runner,
      mojo::AssociatedRemote<mojom::RendererController> control_configuration,
      remoting::RendererRpcCallTranslator::FlushUntilCallback flush_until_cb,
      std::optional<ReceiverConfig::RemotingConstraints> remoting_constraints);
  ~PlaybackCommandDispatcher() override;

  void RegisterCommandSource(
      mojo::PendingReceiver<media::mojom::Renderer> controls);

  // Call Flush() on the Renderer associated with this streaming session.
  void Flush(media::mojom::Renderer::FlushCallback callback);

  // Begins playback of the streaming session via calls to the Renderer if it
  // has not yet begun. This is required because the remote device will
  // sometimes, but not always, call StartPlayingFrom() on a session that it
  // wants to be playing.
  void TryStartPlayback(base::TimeDelta timestamp);

  // remoting::RemotingSessionClient overrides.
  void OnRemotingSessionNegotiated(
      openscreen::cast::RpcMessenger* messenger) override;
  void ConfigureRemotingAsync(
      Dispatcher* dispatcher,
      const openscreen::cast::ReceiverSession* session,
      openscreen::cast::ReceiverSession::ConfiguredReceivers receivers)
      override;
  void OnRemotingSessionEnded() override;

 private:
  void SendRemotingRpcMessageToRemote(
      openscreen::cast::RpcMessenger::Handle handle,
      std::unique_ptr<openscreen::cast::RpcMessage> message);
  void ProcessRemotingRpcMessageFromRemote(
      std::unique_ptr<openscreen::cast::RpcMessage> message);

  // Acquires a new handle from |messenger_|.
  openscreen::cast::RpcMessenger::Handle AcquireHandle();

  // Registers a |handle| with |messenger_| to receive callbacks to
  // ProcessRemotingRpcMessageFromRemote().
  void RegisterHandleForCallbacks(
      openscreen::cast::RpcMessenger::Handle handle);

  // Starts streaming if each expected audio or video config has been received.
  void MaybeStartStreamingSession();

  // Callback for mojom::RendererController::SetPlaybackController() call.
  void OnSetPlaybackControllerDone();

  // RpcInitializationCallHandlerBase overrides.
  void RpcAcquireRendererAsync(
      openscreen::cast::RpcMessenger::Handle remote_handle,
      AcquireRendererCB cb) override;
  void OnRpcAcquireDemuxer(
      openscreen::cast::RpcMessenger::Handle audio_stream_handle,
      openscreen::cast::RpcMessenger::Handle video_stream_handle) override;

  // RpcDemuxerStreamHandler::Client overrides.
  void OnNewAudioConfig(media::AudioDecoderConfig new_config) override;
  void OnNewVideoConfig(media::VideoDecoderConfig new_config) override;

  // Synchronization for calling |acquire_renderer_cb_| at the correct time.
  bool has_set_playback_controller_call_returned_ = false;
  base::OnceCallback<void()> acquire_renderer_cb_;

  raw_ptr<openscreen::cast::RpcMessenger> messenger_;

  // Multiplexes Renderer commands from a number of senders.
  std::unique_ptr<RendererControlMultiplexer> muxer_;

  // Handles translating between Remoting commands (in proto form) and mojo
  // commands.
  std::unique_ptr<remoting::RendererRpcCallTranslator>
      renderer_call_translator_;

  // Handles DemuxerStream interactions.
  std::unique_ptr<remoting::RpcDemuxerStreamHandler> demuxer_stream_handler_;

  // Handles for the demuxer stream data providers, to be used for dispatching
  // demuxer stream RPC commands.
  std::optional<StreamingInitializationInfo> streaming_init_info_;
  std::optional<ReceiverConfig::RemotingConstraints> remoting_constraints_;
  raw_ptr<Dispatcher> streaming_dispatcher_ = nullptr;
  raw_ptr<const openscreen::cast::ReceiverSession> receiver_session_ = nullptr;

  // The mojo API used to configure the renderer controls in the renderer
  // process. Although this instance is only needed once, it is stored as an
  // instance variable so that the destruction of this instance is visible to
  // the Renderer process via the mojo disconnection handler.
  mojo::AssociatedRemote<mojom::RendererController> control_configuration_;

  scoped_refptr<base::SequencedTaskRunner> task_runner_;
  base::WeakPtrFactory<PlaybackCommandDispatcher> weak_factory_{this};
};

}  // namespace cast_streaming

#endif  // COMPONENTS_CAST_STREAMING_BROWSER_CONTROL_PLAYBACK_COMMAND_DISPATCHER_H_