7#include <packager/mpd/base/simple_mpd_notifier.h>
13#include <absl/log/check.h>
14#include <absl/log/log.h>
15#include <absl/synchronization/mutex.h>
17#include <packager/mpd/base/adaptation_set.h>
18#include <packager/mpd/base/mpd_builder.h>
19#include <packager/mpd/base/mpd_notifier.h>
20#include <packager/mpd/base/mpd_notifier_util.h>
21#include <packager/mpd/base/mpd_utils.h>
22#include <packager/mpd/base/period.h>
23#include <packager/mpd/base/representation.h>
27SimpleMpdNotifier::SimpleMpdNotifier(
const MpdOptions& mpd_options)
28 : MpdNotifier(mpd_options),
29 output_path_(mpd_options.mpd_params.mpd_output),
30 mpd_builder_(new MpdBuilder(mpd_options)),
31 content_protection_in_adaptation_set_(
32 mpd_options.mpd_params.generate_dash_if_iop_compliant_mpd) {
33 for (
const std::string& base_url : mpd_options.mpd_params.base_urls)
34 mpd_builder_->AddBaseUrl(base_url);
37SimpleMpdNotifier::~SimpleMpdNotifier() {}
39bool SimpleMpdNotifier::Init() {
43bool SimpleMpdNotifier::NotifyNewContainer(
const MediaInfo& media_info,
44 uint32_t* container_id) {
48 if (content_type == kContentTypeUnknown)
51 MediaInfo adjusted_media_info(media_info);
52 MpdBuilder::MakePathsRelativeToMpd(output_path_, &adjusted_media_info);
54 absl::MutexLock auto_lock(lock_);
55 const double kPeriodStartTimeSeconds = 0.0;
56 Period* period = mpd_builder_->GetOrCreatePeriod(kPeriodStartTimeSeconds);
59 media_info, content_protection_in_adaptation_set_);
60 DCHECK(adaptation_set);
61 if (!adaptation_set->
has_id())
62 adaptation_set->
set_id(next_adaptation_set_id_++);
68 *container_id = representation->
id();
69 if (content_protection_in_adaptation_set_) {
73 representation_id_to_adaptation_set_[representation->
id()] = adaptation_set;
77 representation_map_[representation->
id()] = representation;
81bool SimpleMpdNotifier::NotifyAvailabilityTimeOffset(uint32_t container_id) {
82 absl::MutexLock lock(lock_);
83 auto it = representation_map_.find(container_id);
84 if (it == representation_map_.end()) {
85 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
88 it->second->SetAvailabilityTimeOffset();
92bool SimpleMpdNotifier::NotifySampleDuration(uint32_t container_id,
93 int32_t sample_duration) {
94 absl::MutexLock lock(lock_);
95 auto it = representation_map_.find(container_id);
96 if (it == representation_map_.end()) {
97 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
100 it->second->SetSampleDuration(sample_duration);
104bool SimpleMpdNotifier::NotifySegmentDuration(uint32_t container_id) {
105 absl::MutexLock lock(lock_);
106 auto it = representation_map_.find(container_id);
107 if (it == representation_map_.end()) {
108 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
111 it->second->SetSegmentDuration();
115bool SimpleMpdNotifier::NotifyNewSegment(uint32_t container_id,
119 int64_t segment_number) {
120 absl::MutexLock lock(lock_);
121 auto it = representation_map_.find(container_id);
122 if (it == representation_map_.end()) {
123 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
126 it->second->AddNewSegment(start_time, duration, size, segment_number);
130bool SimpleMpdNotifier::NotifyCompletedSegment(uint32_t container_id,
133 absl::MutexLock lock(lock_);
134 auto it = representation_map_.find(container_id);
135 if (it == representation_map_.end()) {
136 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
139 it->second->UpdateCompletedSegment(duration, size);
143bool SimpleMpdNotifier::NotifyCueEvent(uint32_t container_id,
145 absl::MutexLock lock(lock_);
146 auto it = representation_map_.find(container_id);
147 if (it == representation_map_.end()) {
148 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
153 representation_id_to_adaptation_set_[container_id];
155 const MediaInfo& media_info = original_representation->
GetMediaInfo();
156 const double period_start_time_seconds =
157 static_cast<double>(timestamp) / media_info.reference_time_scale();
159 Period* period = mpd_builder_->GetOrCreatePeriod(period_start_time_seconds);
162 media_info, content_protection_in_adaptation_set_);
163 DCHECK(adaptation_set);
164 if (!adaptation_set->
has_id()) {
165 adaptation_set->
set_id(original_adaptation_set->id());
167 DCHECK_EQ(adaptation_set->id(), original_adaptation_set->id());
175 if (content_protection_in_adaptation_set_) {
179 representation_id_to_adaptation_set_[representation->
id()] = adaptation_set;
183 representation_map_[representation->
id()] = representation;
187bool SimpleMpdNotifier::NotifyEncryptionUpdate(
188 uint32_t container_id,
189 const std::string& drm_uuid,
190 const std::vector<uint8_t>& new_key_id,
191 const std::vector<uint8_t>& new_pssh) {
192 absl::MutexLock lock(lock_);
193 auto it = representation_map_.find(container_id);
194 if (it == representation_map_.end()) {
195 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
199 if (content_protection_in_adaptation_set_) {
201 representation_id_to_adaptation_set_[it->second->id()];
205 it->second->UpdateContentProtectionPssh(drm_uuid,
211bool SimpleMpdNotifier::NotifyEndOfStream() {
212 absl::MutexLock lock(lock_);
213 mpd_builder_->FinalizeDynamicMpd();
217bool SimpleMpdNotifier::NotifyMediaInfoUpdate(uint32_t container_id,
218 const MediaInfo& media_info) {
219 absl::MutexLock lock(lock_);
220 auto it = representation_map_.find(container_id);
221 if (it == representation_map_.end()) {
222 LOG(ERROR) <<
"Unexpected container_id: " << container_id;
226 MediaInfo adjusted_media_info(media_info);
227 MpdBuilder::MakePathsRelativeToMpd(output_path_, &adjusted_media_info);
229 it->second->set_media_info(adjusted_media_info);
233bool SimpleMpdNotifier::Flush() {
234 absl::MutexLock lock(lock_);
virtual Representation * AddRepresentation(const MediaInfo &media_info)
virtual Representation * CopyRepresentation(const Representation &representation)
virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
virtual AdaptationSet * GetOrCreateAdaptationSet(const MediaInfo &media_info, bool content_protection_in_adaptation_set)
virtual const MediaInfo & GetMediaInfo() const
All the methods that are virtual are virtual for mocking.
std::string Uint8VectorToBase64(const std::vector< uint8_t > &input)
Converts uint8 vector into base64 encoded string.
ContentType GetContentType(const MediaInfo &media_info)
bool WriteMpdToFile(const std::string &output_path, MpdBuilder *mpd_builder)
void AddContentProtectionElements(const MediaInfo &media_info, Representation *parent)