OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_media
_manager.h" | 5 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_media
_manager.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "base/task_runner_util.h" | 9 #include "base/task_runner_util.h" |
10 #include "content/public/common/service_registry.h" | 10 #include "content/public/common/service_registry.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 const char kErrorNoVideoFormatData[] = | 24 const char kErrorNoVideoFormatData[] = |
25 "Failed to get video format data from the given MediaStreamTrack object"; | 25 "Failed to get video format data from the given MediaStreamTrack object"; |
26 const char kErrorSinkCannotPlayVideo[] = | 26 const char kErrorSinkCannotPlayVideo[] = |
27 "The sink cannot play video from the given MediaStreamTrack object"; | 27 "The sink cannot play video from the given MediaStreamTrack object"; |
28 const char kErrorSinkCannotPlayAudio[] = | 28 const char kErrorSinkCannotPlayAudio[] = |
29 "The sink cannot play audio from the given MediaStreamTrack object"; | 29 "The sink cannot play audio from the given MediaStreamTrack object"; |
30 const char kErrorMediaPipelineFailure[] = | 30 const char kErrorMediaPipelineFailure[] = |
31 "Failed to initialize media pipeline for the session"; | 31 "Failed to initialize media pipeline for the session"; |
32 } // namespace | 32 } // namespace |
33 | 33 |
| 34 class WiFiDisplayAudioSink { |
| 35 public: |
| 36 WiFiDisplayAudioSink(const blink::WebMediaStreamTrack& track, |
| 37 content::MediaStreamAudioSink* delegate) |
| 38 : track_(track), delegate_(delegate), sink_added_(false) {} |
| 39 |
| 40 ~WiFiDisplayAudioSink() { Stop(); } |
| 41 |
| 42 void Start() { |
| 43 DCHECK(!sink_added_); |
| 44 sink_added_ = true; |
| 45 delegate_->AddToAudioTrack(delegate_, track_); |
| 46 } |
| 47 |
| 48 void Stop() { |
| 49 if (sink_added_) { |
| 50 delegate_->RemoveFromAudioTrack(delegate_, track_); |
| 51 sink_added_ = false; |
| 52 } |
| 53 } |
| 54 |
| 55 private: |
| 56 blink::WebMediaStreamTrack track_; |
| 57 content::MediaStreamAudioSink* delegate_; |
| 58 bool sink_added_; |
| 59 }; |
| 60 |
34 class WiFiDisplayVideoSink : public content::MediaStreamVideoSink { | 61 class WiFiDisplayVideoSink : public content::MediaStreamVideoSink { |
35 public: | 62 public: |
36 WiFiDisplayVideoSink( | 63 WiFiDisplayVideoSink( |
37 const blink::WebMediaStreamTrack& track, | 64 const blink::WebMediaStreamTrack& track, |
38 const content::VideoCaptureDeliverFrameCB& callback) | 65 const content::VideoCaptureDeliverFrameCB& callback) |
39 : track_(track), | 66 : track_(track), |
40 callback_(callback) { | 67 callback_(callback) { |
41 } | 68 } |
42 | 69 |
43 ~WiFiDisplayVideoSink() override { | 70 ~WiFiDisplayVideoSink() override { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 media::BindToCurrentLoop(error_callback_)), | 126 media::BindToCurrentLoop(error_callback_)), |
100 base::Bind(&WiFiDisplayMediaManager::OnPlayerCreated, | 127 base::Bind(&WiFiDisplayMediaManager::OnPlayerCreated, |
101 weak_factory_.GetWeakPtr())); | 128 weak_factory_.GetWeakPtr())); |
102 return; | 129 return; |
103 } | 130 } |
104 | 131 |
105 if (!is_initialized_) { | 132 if (!is_initialized_) { |
106 return; // Waiting for initialization being completed. | 133 return; // Waiting for initialization being completed. |
107 } | 134 } |
108 | 135 |
| 136 if (!audio_track_.isNull()) { |
| 137 audio_sink_.reset( |
| 138 new WiFiDisplayAudioSink(audio_track_, player_->audio_sink())); |
| 139 audio_sink_->Start(); |
| 140 } |
| 141 |
109 if (!video_track_.isNull()) { | 142 if (!video_track_.isNull()) { |
110 // To be called on IO thread. | 143 // To be called on IO thread. |
111 auto on_raw_video_frame = base::Bind( | 144 auto on_raw_video_frame = base::Bind( |
112 &WiFiDisplayMediaPipeline::InsertRawVideoFrame, | 145 &WiFiDisplayMediaPipeline::InsertRawVideoFrame, |
113 base::Unretained(player_)); | 146 base::Unretained(player_)); |
114 video_sink_.reset( | 147 video_sink_.reset( |
115 new WiFiDisplayVideoSink(video_track_, on_raw_video_frame)); | 148 new WiFiDisplayVideoSink(video_track_, on_raw_video_frame)); |
116 video_sink_->Start(); | 149 video_sink_->Start(); |
117 } | 150 } |
118 } | 151 } |
119 | 152 |
120 void WiFiDisplayMediaManager::Teardown() { | 153 void WiFiDisplayMediaManager::Teardown() { |
121 Pause(); | 154 Pause(); |
122 if (player_) { | 155 if (player_) { |
123 io_task_runner_->DeleteSoon(FROM_HERE, player_); | 156 io_task_runner_->DeleteSoon(FROM_HERE, player_); |
124 player_ = nullptr; | 157 player_ = nullptr; |
125 } | 158 } |
126 is_initialized_ = false; | 159 is_initialized_ = false; |
127 session_id_.clear(); | 160 session_id_.clear(); |
128 } | 161 } |
129 | 162 |
130 void WiFiDisplayMediaManager::Pause() { | 163 void WiFiDisplayMediaManager::Pause() { |
131 is_playing_ = false; | 164 is_playing_ = false; |
| 165 audio_sink_.reset(); |
132 video_sink_.reset(); | 166 video_sink_.reset(); |
133 } | 167 } |
134 | 168 |
135 bool WiFiDisplayMediaManager::IsPaused() const { | 169 bool WiFiDisplayMediaManager::IsPaused() const { |
136 return !is_playing_; | 170 return !is_playing_; |
137 } | 171 } |
138 | 172 |
139 wds::SessionType WiFiDisplayMediaManager::GetSessionType() const { | 173 wds::SessionType WiFiDisplayMediaManager::GetSessionType() const { |
140 uint16_t session_type = 0; | 174 uint16_t session_type = 0; |
141 if (!video_track_.isNull()) | 175 if (!video_track_.isNull()) |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 media::BindToCurrentLoop(on_completed)); | 448 media::BindToCurrentLoop(on_completed)); |
415 } | 449 } |
416 | 450 |
417 void WiFiDisplayMediaManager::ConnectToRemoteService( | 451 void WiFiDisplayMediaManager::ConnectToRemoteService( |
418 WiFiDisplayMediaServiceRequest request) { | 452 WiFiDisplayMediaServiceRequest request) { |
419 DCHECK(content::RenderThread::Get()); | 453 DCHECK(content::RenderThread::Get()); |
420 service_registry_->ConnectToRemoteService(std::move(request)); | 454 service_registry_->ConnectToRemoteService(std::move(request)); |
421 } | 455 } |
422 | 456 |
423 } // namespace extensions | 457 } // namespace extensions |
OLD | NEW |