DASH Media Packaging SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator
simple_mpd_notifier.cc
1 // Copyright 2014 Google Inc. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file or at
5 // https://developers.google.com/open-source/licenses/bsd
6 
7 #include "packager/mpd/base/simple_mpd_notifier.h"
8 
9 #include "packager/base/logging.h"
10 #include "packager/base/stl_util.h"
11 #include "packager/mpd/base/mpd_builder.h"
12 #include "packager/mpd/base/mpd_notifier_util.h"
13 #include "packager/mpd/base/mpd_utils.h"
14 
15 namespace shaka {
16 
17 SimpleMpdNotifier::SimpleMpdNotifier(DashProfile dash_profile,
18  const MpdOptions& mpd_options,
19  const std::vector<std::string>& base_urls,
20  const std::string& output_path)
21  : MpdNotifier(dash_profile),
22  output_path_(output_path),
23  mpd_builder_(new MpdBuilder(dash_profile == kLiveProfile
24  ? MpdBuilder::kDynamic
25  : MpdBuilder::kStatic,
26  mpd_options)) {
27  DCHECK(dash_profile == kLiveProfile || dash_profile == kOnDemandProfile);
28  for (size_t i = 0; i < base_urls.size(); ++i)
29  mpd_builder_->AddBaseUrl(base_urls[i]);
30 }
31 
32 SimpleMpdNotifier::~SimpleMpdNotifier() {
33 }
34 
36  return true;
37 }
38 
39 bool SimpleMpdNotifier::NotifyNewContainer(const MediaInfo& media_info,
40  uint32_t* container_id) {
41  DCHECK(container_id);
42 
43  ContentType content_type = GetContentType(media_info);
44  if (content_type == kContentTypeUnknown)
45  return false;
46 
47  base::AutoLock auto_lock(lock_);
48 
49  // TODO(kqyang): Consider adding a new method MpdBuilder::AddRepresentation.
50  // Most of the codes here can be moved inside.
51  std::string key = GetAdaptationSetKey(media_info);
52  std::string lang = GetLanguage(media_info);
53  AdaptationSet** adaptation_set = &adaptation_set_map_[key];
54  if (*adaptation_set == NULL)
55  *adaptation_set = mpd_builder_->AddAdaptationSet(lang);
56 
57  DCHECK(*adaptation_set);
58  MediaInfo adjusted_media_info(media_info);
59  MpdBuilder::MakePathsRelativeToMpd(output_path_, &adjusted_media_info);
60  Representation* representation =
61  (*adaptation_set)->AddRepresentation(adjusted_media_info);
62  if (representation == NULL)
63  return false;
64 
65  // For SimpleMpdNotifier, just put it in Representation. It should still
66  // generate a valid MPD.
67  AddContentProtectionElements(media_info, representation);
68  *container_id = representation->id();
69  DCHECK(!ContainsKey(representation_map_, representation->id()));
70  representation_map_[representation->id()] = representation;
71  return true;
72 }
73 
74 bool SimpleMpdNotifier::NotifySampleDuration(uint32_t container_id,
75  uint32_t sample_duration) {
76  base::AutoLock auto_lock(lock_);
77  RepresentationMap::iterator it = representation_map_.find(container_id);
78  if (it == representation_map_.end()) {
79  LOG(ERROR) << "Unexpected container_id: " << container_id;
80  return false;
81  }
82  it->second->SetSampleDuration(sample_duration);
83  return true;
84 }
85 
86 bool SimpleMpdNotifier::NotifyNewSegment(uint32_t container_id,
87  uint64_t start_time,
88  uint64_t duration,
89  uint64_t size) {
90  base::AutoLock auto_lock(lock_);
91  RepresentationMap::iterator it = representation_map_.find(container_id);
92  if (it == representation_map_.end()) {
93  LOG(ERROR) << "Unexpected container_id: " << container_id;
94  return false;
95  }
96  it->second->AddNewSegment(start_time, duration, size);
97  return true;
98 }
99 
101  uint32_t container_id,
102  const std::string& drm_uuid,
103  const std::vector<uint8_t>& new_key_id,
104  const std::vector<uint8_t>& new_pssh) {
105  base::AutoLock auto_lock(lock_);
106  RepresentationMap::iterator it = representation_map_.find(container_id);
107  if (it == representation_map_.end()) {
108  LOG(ERROR) << "Unexpected container_id: " << container_id;
109  return false;
110  }
111  it->second->UpdateContentProtectionPssh(drm_uuid,
112  Uint8VectorToBase64(new_pssh));
113  return true;
114 }
115 
117  uint32_t container_id,
118  const ContentProtectionElement& content_protection_element) {
119  base::AutoLock auto_lock(lock_);
120  RepresentationMap::iterator it = representation_map_.find(container_id);
121  if (it == representation_map_.end()) {
122  LOG(ERROR) << "Unexpected container_id: " << container_id;
123  return false;
124  }
125  it->second->AddContentProtectionElement(content_protection_element);
126  return true;
127 }
128 
130  base::AutoLock auto_lock(lock_);
131  return WriteMpdToFile(output_path_, mpd_builder_.get());
132 }
133 
134 } // namespace shaka
uint32_t id() const
Definition: mpd_builder.h:500
bool AddContentProtectionElement(uint32_t id, const ContentProtectionElement &content_protection_element) override
void AddContentProtectionElements(const MediaInfo &media_info, Representation *parent)
Definition: mpd_utils.cc:347
bool NotifyNewSegment(uint32_t id, uint64_t start_time, uint64_t duration, uint64_t size) override
std::string Uint8VectorToBase64(const std::vector< uint8_t > &input)
Converts uint8 vector into base64 encoded string.
bool NotifySampleDuration(uint32_t container_id, uint32_t sample_duration) override
bool NotifyEncryptionUpdate(uint32_t container_id, const std::string &drm_uuid, const std::vector< uint8_t > &new_key_id, const std::vector< uint8_t > &new_pssh) override
static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
Definition: mpd_builder.cc:647
ContentType GetContentType(const MediaInfo &media_info)
bool WriteMpdToFile(const std::string &output_path, MpdBuilder *mpd_builder)
bool NotifyNewContainer(const MediaInfo &media_info, uint32_t *id) override