| 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 |