Shaka Player Embedded
proxy_media_player.cc
Go to the documentation of this file.
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
16 
17 #include <cmath>
18 #include <vector>
19 
20 #include "shaka/optional.h"
21 #include "src/debug/mutex.h"
22 #include "src/util/utils.h"
23 
24 namespace shaka {
25 namespace media {
26 
28  public:
29  Impl()
30  : mutex("ProxyMediaPlayer"), player(nullptr), implementation(nullptr) {}
31 
32  void reset() {
33  player = nullptr;
34  fill_mode.reset();
35  volume.reset();
36  muted.reset();
37  autoplay.reset();
39  duration.reset();
41  }
42 
46  std::string key_system;
48 
56 };
57 
58 
61 
63  util::shared_lock<SharedMutex> lock(impl_->mutex);
64  if (impl_->player)
65  return impl_->player->VideoPlaybackQuality();
66  else
67  return VideoPlaybackQuality();
68 }
69 
70 void ProxyMediaPlayer::AddClient(Client* client) const {
71  impl_->clients.AddClient(client);
72 }
73 
75  impl_->clients.RemoveClient(client);
76 }
77 
78 std::vector<BufferedRange> ProxyMediaPlayer::GetBuffered() const {
79  util::shared_lock<SharedMutex> lock(impl_->mutex);
80  if (impl_->player)
81  return impl_->player->GetBuffered();
82  else
83  return {};
84 }
85 
87  util::shared_lock<SharedMutex> lock(impl_->mutex);
88  if (impl_->player)
89  return impl_->player->ReadyState();
90  else
92 }
93 
95  util::shared_lock<SharedMutex> lock(impl_->mutex);
96  if (impl_->player)
97  return impl_->player->PlaybackState();
98  else
100 }
101 
102 
104  std::unique_lock<SharedMutex> lock(impl_->mutex);
105  if (impl_->player) {
106  return impl_->player->SetVideoFillMode(mode);
107  } else {
108  impl_->fill_mode = mode;
109  return true;
110  }
111 }
112 
113 uint32_t ProxyMediaPlayer::Width() const {
114  util::shared_lock<SharedMutex> lock(impl_->mutex);
115  return impl_->player ? impl_->player->Width() : 0;
116 }
117 
118 uint32_t ProxyMediaPlayer::Height() const {
119  util::shared_lock<SharedMutex> lock(impl_->mutex);
120  return impl_->player ? impl_->player->Height() : 0;
121 }
122 
123 double ProxyMediaPlayer::Volume() const {
124  util::shared_lock<SharedMutex> lock(impl_->mutex);
125  if (impl_->player)
126  return impl_->player->Volume();
127  else
128  return impl_->volume.value_or(1);
129 }
130 
131 void ProxyMediaPlayer::SetVolume(double volume) {
132  std::unique_lock<SharedMutex> lock(impl_->mutex);
133  if (impl_->player)
134  impl_->player->SetVolume(volume);
135  else
136  impl_->volume = volume;
137 }
138 
140  util::shared_lock<SharedMutex> lock(impl_->mutex);
141  if (impl_->player)
142  return impl_->player->Muted();
143  else
144  return impl_->muted.value_or(false);
145 }
146 
147 void ProxyMediaPlayer::SetMuted(bool muted) {
148  std::unique_lock<SharedMutex> lock(impl_->mutex);
149  if (impl_->player)
150  impl_->player->SetMuted(muted);
151  else
152  impl_->muted = muted;
153 }
154 
155 
157  std::unique_lock<SharedMutex> lock(impl_->mutex);
158  if (impl_->player)
159  impl_->player->Play();
160  else
161  impl_->autoplay = true;
162 }
163 
165  std::unique_lock<SharedMutex> lock(impl_->mutex);
166  if (impl_->player)
167  impl_->player->Pause();
168  else
169  impl_->autoplay = false;
170 }
171 
173  util::shared_lock<SharedMutex> lock(impl_->mutex);
174  if (impl_->player)
175  return impl_->player->CurrentTime();
176  else
177  return impl_->current_time.value_or(0);
178 }
179 
181  std::unique_lock<SharedMutex> lock(impl_->mutex);
182  if (impl_->player)
183  impl_->player->SetCurrentTime(time);
184  else
185  impl_->current_time = time;
186 }
187 
189  util::shared_lock<SharedMutex> lock(impl_->mutex);
190  if (impl_->player)
191  return impl_->player->Duration();
192  else
193  return impl_->duration.value_or(HUGE_VAL);
194 }
195 
196 void ProxyMediaPlayer::SetDuration(double duration) {
197  std::unique_lock<SharedMutex> lock(impl_->mutex);
198  if (impl_->player)
199  impl_->player->SetDuration(duration);
200  else
201  impl_->duration = duration;
202 }
203 
205  util::shared_lock<SharedMutex> lock(impl_->mutex);
206  if (impl_->player)
207  return impl_->player->PlaybackRate();
208  else
209  return impl_->playback_rate.value_or(1);
210 }
211 
213  std::unique_lock<SharedMutex> lock(impl_->mutex);
214  if (impl_->player)
215  impl_->player->SetPlaybackRate(rate);
216  else
217  impl_->playback_rate = rate;
218 }
219 
220 
221 bool ProxyMediaPlayer::AttachSource(const std::string& src) {
222  MediaPlayer* player = CreateSource(src);
223  if (!player)
224  return false;
225 
226  std::unique_lock<SharedMutex> lock(impl_->mutex);
227  SetFields(player);
228  return true;
229 }
230 
232  MediaPlayer* player = CreateMse();
233  if (!player)
234  return false;
235 
236  std::unique_lock<SharedMutex> lock(impl_->mutex);
237  SetFields(player);
238  return true;
239 }
240 
241 bool ProxyMediaPlayer::AddMseBuffer(const std::string& mime, bool is_video,
242  const ElementaryStream* stream) {
243  std::unique_lock<SharedMutex> lock(impl_->mutex);
244  if (!impl_->player)
245  return false;
246  return impl_->player->AddMseBuffer(mime, is_video, stream);
247 }
248 
250  std::unique_lock<SharedMutex> lock(impl_->mutex);
251  if (impl_->player)
252  impl_->player->MseEndOfStream();
253 }
254 
255 void ProxyMediaPlayer::LoadedMetaData(double duration) {
256  util::shared_lock<SharedMutex> lock(impl_->mutex);
257  if (impl_->player)
258  impl_->player->LoadedMetaData(duration);
259 }
260 
261 
263  const std::string& key_system, eme::Implementation* implementation) {
264  std::unique_lock<SharedMutex> lock(impl_->mutex);
265  if (impl_->player) {
266  if (!impl_->player->SetEmeImplementation(key_system, implementation))
267  return false;
268  }
269  impl_->key_system = key_system;
270  impl_->implementation = implementation;
271  return true;
272 }
273 
275  std::unique_lock<SharedMutex> lock(impl_->mutex);
276  if (impl_->player)
277  impl_->player->Detach();
278  impl_->reset();
279 }
280 
282  return &impl_->clients;
283 }
284 
285 void ProxyMediaPlayer::SetFields(MediaPlayer* player) {
286  impl_->player = player;
287  if (impl_->implementation)
288  player->SetEmeImplementation(impl_->key_system, impl_->implementation);
289 
290  if (impl_->fill_mode.has_value())
291  player->SetVideoFillMode(impl_->fill_mode.value());
292  if (impl_->volume.has_value())
293  player->SetVolume(impl_->volume.value());
294  if (impl_->muted.has_value())
295  player->SetMuted(impl_->muted.value());
296  if (impl_->current_time.has_value())
297  player->SetCurrentTime(impl_->current_time.value());
298  if (impl_->duration.has_value())
299  player->SetDuration(impl_->duration.value());
300  if (impl_->playback_rate.has_value())
301  player->SetPlaybackRate(impl_->playback_rate.value());
302  if (impl_->autoplay.has_value()) {
303  if (impl_->autoplay.value())
304  player->Play();
305  else
306  player->Pause();
307  }
308 }
309 
310 } // namespace media
311 } // namespace shaka
void SetPlaybackRate(double rate) override
bool SetVideoFillMode(VideoFillMode mode) override
VideoFillMode
Definition: utils.h:41
bool SetEmeImplementation(const std::string &key_system, eme::Implementation *implementation) override
virtual bool SetVideoFillMode(VideoFillMode mode)=0
void LoadedMetaData(double duration) override
bool AddMseBuffer(const std::string &mime, bool is_video, const ElementaryStream *stream) override
double Duration() const override
virtual void SetPlaybackRate(double rate)=0
uint32_t Width() const override
void SetDuration(double duration) override
void SetCurrentTime(double time) override
virtual void SetMuted(bool muted)=0
void SetVolume(double volume) override
virtual void SetVolume(double volume)=0
virtual void Pause()=0
virtual bool SetEmeImplementation(const std::string &key_system, eme::Implementation *implementation)=0
double CurrentTime() const override
void reset()
Definition: optional.h:174
bool AttachSource(const std::string &src) override
void RemoveClient(Client *client) const override
VideoReadyState ReadyState() const override
virtual void SetDuration(double duration)=0
double Volume() const override
virtual void Play()=0
void SetMuted(bool muted) override
void AddClient(Client *client) const override
std::vector< BufferedRange > GetBuffered() const override
double PlaybackRate() const override
VideoPlaybackState PlaybackState() const override
struct VideoPlaybackQuality VideoPlaybackQuality() const override
uint32_t Height() const override
virtual void SetCurrentTime(double time)=0