Shaka Player Embedded
default_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 <vector>
18 
19 #include "shaka/media/text_track.h"
20 #include "src/debug/mutex.h"
21 #ifdef OS_IOS
23 #endif
25 
26 namespace shaka {
27 namespace media {
28 
30  public:
31  Impl(ClientList* clients, VideoRenderer* video_renderer,
32  AudioRenderer* audio_renderer)
33  : mutex("DefaultMediaPlayer"),
34 #ifdef OS_IOS
35  av_player(clients),
36  playing_src_(false),
37 #endif
38  mse_player(clients, video_renderer, audio_renderer) {
39  }
40 
42 #ifdef OS_IOS
43  ios::AvMediaPlayer av_player;
44  bool playing_src_;
45 #endif
47  std::vector<std::shared_ptr<TextTrack>> text_tracks_;
48 };
49 
51  AudioRenderer* audio_renderer)
52  : impl_(new Impl(GetClientList(), video_renderer, audio_renderer)) {}
54 
56  Decoder* audio_decoder) {
57  impl_->mse_player.SetDecoders(video_decoder, audio_decoder);
58 }
59 
61 #ifdef OS_IOS
62  return impl_->av_player.GetIosView();
63 #else
64  return nullptr;
65 #endif
66 }
67 
69 #ifdef OS_IOS
70  return impl_->av_player.GetAvPlayer();
71 #else
72  return nullptr;
73 #endif
74 }
75 
77  const MediaDecodingConfiguration& config) const {
78  if (config.type == MediaDecodingType::File) {
79 #ifdef OS_IOS
80  return impl_->av_player.DecodingInfo(config);
81 #else
82  return MediaCapabilitiesInfo();
83 #endif
84  } else {
85  return impl_->mse_player.DecodingInfo(config);
86  }
87 }
88 
89 std::vector<std::shared_ptr<MediaTrack>> DefaultMediaPlayer::AudioTracks() {
90  std::unique_lock<Mutex> lock(impl_->mutex);
91 #ifdef OS_IOS
92  if (impl_->playing_src_)
93  return impl_->av_player.AudioTracks();
94 #endif
95  return {};
96 }
97 
98 std::vector<std::shared_ptr<const MediaTrack>> DefaultMediaPlayer::AudioTracks()
99  const {
100  std::unique_lock<Mutex> lock(impl_->mutex);
101 #ifdef OS_IOS
102  if (impl_->playing_src_) {
103  return const_cast<const ios::AvMediaPlayer&>(impl_->av_player)
104  .AudioTracks();
105  }
106 #endif
107  return {};
108 }
109 
110 std::vector<std::shared_ptr<MediaTrack>> DefaultMediaPlayer::VideoTracks() {
111  std::unique_lock<Mutex> lock(impl_->mutex);
112 #ifdef OS_IOS
113  if (impl_->playing_src_)
114  return impl_->av_player.VideoTracks();
115 #endif
116  return {};
117 }
118 
119 std::vector<std::shared_ptr<const MediaTrack>> DefaultMediaPlayer::VideoTracks()
120  const {
121  std::unique_lock<Mutex> lock(impl_->mutex);
122 #ifdef OS_IOS
123  if (impl_->playing_src_) {
124  return const_cast<const ios::AvMediaPlayer&>(impl_->av_player)
125  .VideoTracks();
126  }
127 #endif
128  return {};
129 }
130 
131 std::vector<std::shared_ptr<TextTrack>> DefaultMediaPlayer::TextTracks() {
132  std::unique_lock<Mutex> lock(impl_->mutex);
133 #ifdef OS_IOS
134  if (impl_->playing_src_)
135  return impl_->av_player.TextTracks();
136 #endif
137  return impl_->text_tracks_;
138 }
139 
140 std::vector<std::shared_ptr<const TextTrack>> DefaultMediaPlayer::TextTracks()
141  const {
142  std::unique_lock<Mutex> lock(impl_->mutex);
143 #ifdef OS_IOS
144  if (impl_->playing_src_) {
145  return const_cast<const ios::AvMediaPlayer&>(impl_->av_player).TextTracks();
146  }
147 #endif
148  return {impl_->text_tracks_.begin(), impl_->text_tracks_.end()};
149 }
150 
151 std::shared_ptr<TextTrack> DefaultMediaPlayer::AddTextTrack(
152  TextTrackKind kind, const std::string& label, const std::string& language) {
153  std::shared_ptr<TextTrack> ret;
154  {
155  std::unique_lock<Mutex> lock(impl_->mutex);
156  ret.reset(new TextTrack(kind, label, language, ""));
157  impl_->text_tracks_.emplace_back(ret);
158  }
160  return ret;
161 }
162 
165 #ifdef OS_IOS
166  impl_->playing_src_ = true;
167 #endif
168 }
169 
170 
171 MediaPlayer* DefaultMediaPlayer::CreateMse() {
172  if (!impl_->mse_player.AttachMse())
173  return nullptr;
174  return &impl_->mse_player;
175 }
176 MediaPlayer* DefaultMediaPlayer::CreateSource(const std::string& src) {
177 #ifdef OS_IOS
178  if (!impl_->av_player.AttachSource(src))
179  return nullptr;
180  impl_->playing_src_ = true;
181  return &impl_->av_player;
182 #else
183  return nullptr;
184 #endif
185 }
186 
187 } // namespace media
188 } // namespace shaka
std::shared_ptr< TextTrack > AddTextTrack(TextTrackKind kind, const std::string &label, const std::string &language) override
std::vector< std::shared_ptr< TextTrack > > TextTracks() override
MediaCapabilitiesInfo DecodingInfo(const MediaDecodingConfiguration &config) const override
std::vector< std::shared_ptr< MediaTrack > > VideoTracks() override
std::vector< std::shared_ptr< TextTrack > > text_tracks_
void SetDecoders(Decoder *video_decoder, Decoder *audio_decoder)
std::vector< std::shared_ptr< MediaTrack > > AudioTracks() override
Impl(ClientList *clients, VideoRenderer *video_renderer, AudioRenderer *audio_renderer)
void OnAddTextTrack(std::shared_ptr< TextTrack > track) override
DefaultMediaPlayer(VideoRenderer *video_renderer, AudioRenderer *audio_renderer)