Shaka Player Embedded
track_list.h
Go to the documentation of this file.
1 // Copyright 2020 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 
15 #ifndef SHAKA_EMBEDDED_JS_MSE_TRACK_LIST_H_
16 #define SHAKA_EMBEDDED_JS_MSE_TRACK_LIST_H_
17 
18 #include <memory>
19 #include <unordered_map>
20 #include <unordered_set>
21 #include <utility>
22 #include <vector>
23 
25 #include "src/core/member.h"
26 #include "src/core/ref_ptr.h"
27 #include "src/debug/mutex.h"
28 #include "src/js/events/event.h"
31 
32 namespace shaka {
33 
34 namespace media {
35 
36 class MediaTrack;
37 class TextTrack;
38 
39 } // namespace media
40 
41 namespace js {
42 namespace mse {
43 
44 class AudioTrack;
45 class VideoTrack;
46 class TextTrack;
47 
54 template <typename JsTrack, typename PubTrack>
56  public:
57  explicit TrackList(media::MediaPlayer* player)
58  : mutex_("TrackList"), player_(player) {
59  player->AddClient(this);
60  }
61 
62  ~TrackList() override {
63  Detach();
64  }
65 
66  void Trace(memory::HeapTracer* tracer) const override {
67  events::EventTarget::Trace(tracer);
68  std::unique_lock<Mutex> lock(mutex_);
69  for (auto& pair : tracks_)
70  tracer->Trace(&pair.second);
71  }
72 
73  size_t length() const {
74  std::unique_lock<Mutex> lock(mutex_);
75  return tracks_.size();
76  }
77 
78  bool GetIndex(size_t i, RefPtr<JsTrack>* track) const {
79  std::unique_lock<Mutex> lock(mutex_);
80  if (i >= tracks_.size())
81  return false;
82 
83  *track = tracks_[i].second;
84  return true;
85  }
86 
87 
88  void Detach() {
89  if (player_) {
90  player_->RemoveClient(this);
91  player_ = nullptr;
92  }
93  }
94 
95  RefPtr<JsTrack> GetTrack(std::shared_ptr<PubTrack> pub_track) {
96  std::unique_lock<Mutex> lock(mutex_);
97  for (auto& pair : tracks_) {
98  if (pair.first == pub_track)
99  return pair.second;
100  }
101  return nullptr;
102  }
103 
104  void AddTrack(std::shared_ptr<PubTrack> pub_track) {
105  std::unique_lock<Mutex> lock(mutex_);
106  tracks_.emplace_back(pub_track, new JsTrack(pub_track));
107  ScheduleEvent<events::Event>(EventType::AddTrack);
108  }
109 
110  void RemoveTrack(std::shared_ptr<PubTrack> pub_track) {
111  std::unique_lock<Mutex> lock(mutex_);
112  for (auto it = tracks_.begin(); it != tracks_.end(); it++) {
113  if (it->first == pub_track) {
114  tracks_.erase(it);
115  ScheduleEvent<events::Event>(EventType::RemoveTrack);
116  return;
117  }
118  }
119  }
120 
121  private:
122  mutable Mutex mutex_;
123  std::vector<std::pair<std::shared_ptr<PubTrack>, Member<JsTrack>>> tracks_;
124  media::MediaPlayer* player_;
125 };
126 
127 class AudioTrackList : public TrackList<AudioTrack, media::MediaTrack> {
129 
130  public:
131  using TrackList::TrackList;
132 
133  private:
134  void OnAddAudioTrack(std::shared_ptr<media::MediaTrack> track) override;
135  void OnRemoveAudioTrack(std::shared_ptr<media::MediaTrack> track) override;
136 };
137 
138 class VideoTrackList : public TrackList<VideoTrack, media::MediaTrack> {
140 
141  public:
142  using TrackList::TrackList;
143 
144  private:
145  void OnAddVideoTrack(std::shared_ptr<media::MediaTrack> track) override;
146  void OnRemoveVideoTrack(std::shared_ptr<media::MediaTrack> track) override;
147 };
148 
149 class TextTrackList : public TrackList<TextTrack, media::TextTrack> {
151 
152  public:
153  using TrackList::TrackList;
154 
155  private:
156  void OnAddTextTrack(std::shared_ptr<media::TextTrack> track) override;
157  void OnRemoveTextTrack(std::shared_ptr<media::TextTrack> track) override;
158 };
159 
160 
161 template <typename T>
162 class TrackListFactory : public BackingObjectFactory<T, events::EventTarget> {
163  public:
165  this->AddGenericProperty("length", &T::length);
166  this->AddIndexer(&T::GetIndex);
167  }
168 };
169 
173 
174 } // namespace mse
175 } // namespace js
176 } // namespace shaka
177 
178 #endif // SHAKA_EMBEDDED_JS_MSE_TRACK_LIST_H_
virtual void AddClient(Client *client) const =0
RefPtr< JsTrack > GetTrack(std::shared_ptr< PubTrack > pub_track)
Definition: track_list.h:95
bool GetIndex(size_t i, RefPtr< JsTrack > *track) const
Definition: track_list.h:78
void Trace(const Traceable *ptr)
Definition: heap_tracer.cc:43
void RemoveTrack(std::shared_ptr< PubTrack > pub_track)
Definition: track_list.h:110
TrackList(media::MediaPlayer *player)
Definition: track_list.h:57
void Trace(memory::HeapTracer *tracer) const override
Definition: track_list.h:66
size_t length() const
Definition: track_list.h:73
void AddTrack(std::shared_ptr< PubTrack > pub_track)
Definition: track_list.h:104
#define DECLARE_TYPE_INFO(type)