| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_REMOTING_END2END_TEST_RENDERER_H_ |
| #define MEDIA_REMOTING_END2END_TEST_RENDERER_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "media/base/demuxer_stream.h" |
| #include "media/base/renderer.h" |
| #include "media/remoting/stream_provider.h" |
| #include "third_party/openscreen/src/cast/streaming/rpc_messenger.h" |
| |
| namespace media { |
| namespace remoting { |
| |
| class RendererController; |
| class CourierRenderer; |
| class Receiver; |
| class ReceiverController; |
| |
| // Simulates the media remoting pipeline. |
| class End2EndTestRenderer final : public Renderer { |
| public: |
| explicit End2EndTestRenderer(std::unique_ptr<Renderer> renderer); |
| ~End2EndTestRenderer() override; |
| |
| // Renderer implementation. |
| void Initialize(MediaResource* media_resource, |
| RendererClient* client, |
| PipelineStatusCallback init_cb) override; |
| void SetLatencyHint(absl::optional<base::TimeDelta> latency_hint) override; |
| void SetPreservesPitch(bool preserves_pitch) override; |
| void Flush(base::OnceClosure flush_cb) override; |
| void StartPlayingFrom(base::TimeDelta time) override; |
| void SetPlaybackRate(double playback_rate) override; |
| void SetVolume(float volume) override; |
| base::TimeDelta GetMediaTime() override; |
| |
| void OnSelectedVideoTracksChanged( |
| const std::vector<DemuxerStream*>& enabled_tracks, |
| base::OnceClosure change_completed_cb) override; |
| |
| void OnEnabledAudioTracksChanged( |
| const std::vector<DemuxerStream*>& enabled_tracks, |
| base::OnceClosure change_completed_cb) override; |
| |
| private: |
| class TestRemotee; |
| |
| void InitTestApi(); |
| |
| // Called to send RPC messages to |receiver_|. |
| void SendMessageToSink(const std::vector<uint8_t>& message); |
| |
| // Called to send frame data to |receiver_|. |
| void SendFrameToSink(uint32_t frame_count, |
| const std::vector<uint8_t>& data, |
| DemuxerStream::Type type); |
| |
| // Called when receives RPC messages from |receiver_|. |
| void OnMessageFromSink(std::unique_ptr<std::vector<uint8_t>> message); |
| |
| void InitializeReceiverRenderer(PipelineStatus status); |
| void OnCourierRendererInitialized(PipelineStatus status); |
| void OnReceiverInitalized(PipelineStatus status); |
| void CompleteInitialize(); |
| |
| // Callback function when RPC message is received. |
| void OnReceivedRpc(std::unique_ptr<openscreen::cast::RpcMessage> message); |
| void OnAcquireRenderer(std::unique_ptr<openscreen::cast::RpcMessage> message); |
| void OnAcquireRendererDone(int receiver_renderer_handle); |
| |
| PipelineStatusCallback init_cb_; |
| |
| bool courier_renderer_initialized_; |
| bool receiver_initialized_; |
| |
| // Sender components. |
| std::unique_ptr<RendererController> controller_; |
| std::unique_ptr<CourierRenderer> courier_renderer_; |
| |
| // Receiver components. |
| std::unique_ptr<TestRemotee> media_remotee_; |
| ReceiverController* receiver_controller_; |
| std::unique_ptr<Receiver> receiver_; |
| std::unique_ptr<StreamProvider> stream_provider_; |
| openscreen::cast::RpcMessenger* receiver_rpc_messenger_; |
| |
| // Handle of |receiver_| |
| int receiver_renderer_handle_ = |
| openscreen::cast::RpcMessenger::kInvalidHandle; |
| // Handle of |courier_renderer_|, it would be sent with AcquireRenderer |
| // message. |
| int sender_renderer_handle_ = openscreen::cast::RpcMessenger::kInvalidHandle; |
| |
| base::WeakPtrFactory<End2EndTestRenderer> weak_factory_{this}; |
| }; |
| |
| } // namespace remoting |
| } // namespace media |
| |
| #endif // MEDIA_REMOTING_END2END_TEST_RENDERER_H_ |