libmpd++
DASH MPD parsing and manipulation library
 
Loading...
Searching...
No Matches
MPD.hh
Go to the documentation of this file.
1#ifndef _BBC_PARSE_DASH_MPD_MPD_HH_
2#define _BBC_PARSE_DASH_MPD_MPD_HH_
3/*****************************************************************************
4 * DASH MPD parsing library in C++: main meson build file
5 *****************************************************************************
6 * Copyright: (C) 2025 British Broadcasting Corporation
7 * Author(s): David Waring <david.waring2@bbc.co.uk>
8 * License: LGPLv3
9 *
10 * For full license terms please see the LICENSE file distributed with this
11 * library or refer to: https://www.gnu.org/licenses/lgpl-3.0.txt.
12 */
13#include <chrono>
14#include <iostream>
15#include <list>
16#include <optional>
17#include <string>
18#include <unordered_set>
19#include <vector>
20
21#include "macros.hh"
22#include "BaseURL.hh"
23#include "ContentProtection.hh"
24#include "Descriptor.hh"
25#include "InitializationSet.hh"
27#include "Metrics.hh"
28#include "PatchLocation.hh"
29#include "Period.hh"
30#include "ProgramInformation.hh"
32#include "ServiceDescription.hh"
33#include "UIntVWithID.hh"
34#include "URI.hh"
35
37
50public:
51 using time_type = std::chrono::system_clock::time_point;
52 using duration_type = std::chrono::microseconds;
53
60
65 MPD() = delete;
66
78 MPD(const duration_type &minimum_buffer_time, const URI &profile, const Period &period, PresentationType presentation_type = STATIC);
79 MPD(const duration_type &minimum_buffer_time, const URI &profile, Period &&period, PresentationType presentation_type = STATIC);
81
87 MPD(std::istream &input_stream, const std::optional<URI> &mpd_location = std::nullopt);
88
95 MPD(const std::vector<char> &mpd_xml, const std::optional<URI> &mpd_location = std::nullopt);
96 MPD(const std::vector<unsigned char> &mpd_xml, const std::optional<URI> &mpd_location = std::nullopt);
98
104 MPD(const std::string &filename, const std::optional<URI> &mpd_location = std::nullopt);
105
110 MPD(const MPD &other);
111
116 MPD(MPD &&other);
117
120 virtual ~MPD();
121
127 MPD &operator=(const MPD &other);
128
134 MPD &operator=(MPD &&other);
135
141 bool operator==(const MPD &other) const;
142
159 bool hasSourceURL() const { return m_mpdURL.has_value(); };
160
165 const std::optional<URI> &sourceURL() const { return m_mpdURL; };
166
173 MPD &sourceURL(const std::nullopt_t &) { m_mpdURL.reset(); return *this; };
174
180 MPD &sourceURL(const URI &url) { m_mpdURL = url; return *this; };
181 MPD &sourceURL(URI &&url) { m_mpdURL = std::move(url); return *this; };
182 MPD &sourceURL(const std::optional<URI> &url) { m_mpdURL = url; return *this; };
183 MPD &sourceURL(std::optional<URI> &&url) { m_mpdURL = std::move(url); return *this; };
185
192 bool isLive() const;
193
202 std::string asXML(bool compact_form) const;
203
217 static std::ostream &compact(std::ostream &os);
218
232 static std::ostream &pretty(std::ostream &os);
233
234 bool hasId() const { return m_id.has_value(); };
235 const std::string &id(const std::string &default_val) const;
236 const std::optional<std::string> &id() const { return m_id; };
237 MPD &id(const std::string &val) { m_id = val; return *this; };
238 MPD &id(std::string &&val) { m_id = std::move(val); return *this; };
239 MPD &id(const std::nullopt_t&) { m_id.reset(); return *this; };
240
241 const std::list<URI> &profiles() const { return m_profiles; };
242 std::list<URI>::const_iterator profilesBegin() const { return m_profiles.cbegin(); };
243 std::list<URI>::const_iterator profilesEnd() const { return m_profiles.cend(); };
244 std::list<URI>::iterator profilesBegin() { return m_profiles.begin(); };
245 std::list<URI>::iterator profilesEnd() { return m_profiles.end(); };
246 const URI &profile(std::list<URI>::size_type idx) const {
247 if (idx >= m_profiles.size())
248 throw std::out_of_range("MPD profile does not exist");
249 auto it = m_profiles.cbegin();
250 while (idx > 0 && it != m_profiles.cend()) {it++; idx--;}
251 return *it;
252 };
253 bool profilesContain(const URI &uri) const;
254 MPD &profileAdd(const URI &uri);
256 MPD &profileRemove(const std::list<URI>::const_iterator &it);
257 MPD &profileRemove(const URI &uri);
258
259 bool isStaticPresentation() const { return m_type == STATIC; };
260 bool isDynamicPresentation() const { return m_type == DYNAMIC; };
261 PresentationType presentationType() const { return m_type; };
262 MPD &presentationType(PresentationType pres_type) { m_type = pres_type; return *this; };
263
264 bool hasAvailabilityStartTime() const { return m_availabilityStartTime.has_value(); };
265 const time_type &availabilityStartTime(const time_type &default_val) const;
266 const std::optional<time_type> &availabilityStartTime() const { return m_availabilityStartTime; };
267 MPD &availabilityStartTime(const time_type &val) { m_availabilityStartTime = val; return *this; };
268 MPD &availabilityStartTime(time_type &&val) { m_availabilityStartTime = std::move(val); return *this; };
269 MPD &availabilityStartTime(const std::nullopt_t&) { m_availabilityStartTime.reset(); return *this; };
270
271 bool hasAvailabilityEndTime() const { return m_availabilityEndTime.has_value(); };
272 const time_type &availabilityEndTime(const time_type &default_val) const;
273 const std::optional<time_type> &availabilityEndTime() const { return m_availabilityEndTime; };
274 MPD &availabilityEndTime(const time_type &val) { m_availabilityEndTime = val; return *this; };
275 MPD &availabilityEndTime(time_type &&val) { m_availabilityEndTime = std::move(val); return *this; };
276 MPD &availabilityEndTime(const std::nullopt_t&) { m_availabilityEndTime.reset(); return *this; };
277
278 bool hasPublishTime() const { return m_publishTime.has_value(); };
279 const time_type &publishTime(const time_type &default_val) const;
280 const std::optional<time_type> &publishTime() const { return m_publishTime; };
281 MPD &publishTime(const time_type &val) { m_publishTime = val; return *this; };
282 MPD &publishTime(time_type &&val) { m_publishTime = std::move(val); return *this; };
283 MPD &publishTime(const std::nullopt_t&) { m_publishTime.reset(); return *this; };
284
285 bool hasMediaPresentationDuration() const { return m_mediaPresentationDuration.has_value(); };
286 const duration_type &mediaPresentationDuration(const duration_type &default_val) const;
287 const std::optional<duration_type> &mediaPresentationDuration() const { return m_mediaPresentationDuration; };
288 MPD &mediaPresentationDuration(const duration_type &val) { m_mediaPresentationDuration = val; return *this; };
289 MPD &mediaPresentationDuration(duration_type &&val) { m_mediaPresentationDuration = std::move(val); return *this; };
290 MPD &mediaPresentationDuration(const std::nullopt_t&) { m_mediaPresentationDuration.reset(); return *this; };
291
292 bool hasMinimumUpdatePeriod() const { return m_minimumUpdatePeriod.has_value(); };
293 const duration_type &minimumUpdatePeriod(const duration_type &default_val) const;
294 const std::optional<duration_type> &minimumUpdatePeriod() const { return m_minimumUpdatePeriod; };
295 MPD &minimumUpdatePeriod(const duration_type &val) { m_minimumUpdatePeriod = val; return *this; };
296 MPD &minimumUpdatePeriod(duration_type &&val) { m_minimumUpdatePeriod = std::move(val); return *this; };
297 MPD &minimumUpdatePeriod(const std::nullopt_t&) { m_minimumUpdatePeriod.reset(); return *this; };
298
299 const duration_type &minBufferTime() const { return m_minBufferTime; };
300 MPD &minBufferTime(const duration_type &val) { m_minBufferTime = val; return *this; };
301 MPD &minBufferTime(duration_type &&val) { m_minBufferTime = std::move(val); return *this; };
302
303 bool hasTimeShiftBufferDepth() const { return m_timeShiftBufferDepth.has_value(); };
304 const duration_type &timeShiftBufferDepth(const duration_type &default_val) const;
305 const std::optional<duration_type> &timeShiftBufferDepth() const { return m_timeShiftBufferDepth; };
306 MPD &timeShiftBufferDepth(const duration_type &val) { m_timeShiftBufferDepth = val; return *this; };
307 MPD &timeShiftBufferDepth(duration_type &&val) { m_timeShiftBufferDepth = std::move(val); return *this; };
308 MPD &timeShiftBufferDepth(const std::nullopt_t&) { m_timeShiftBufferDepth.reset(); return *this; };
309
310 bool hasSuggestedPresentationDelay() const { return m_suggestedPresentationDelay.has_value(); };
312 const std::optional<duration_type> &suggestedPresentationDelay() const { return m_suggestedPresentationDelay; };
313 MPD &suggestedPresentationDelay(const duration_type &val) { m_suggestedPresentationDelay = val; return *this; };
314 MPD &suggestedPresentationDelay(duration_type &&val) { m_suggestedPresentationDelay = std::move(val); return *this; };
315 MPD &suggestedPresentationDelay(const std::nullopt_t&) { m_suggestedPresentationDelay.reset(); return *this; };
316
317 bool hasMaxSegmentDuration() const { return m_maxSegmentDuration.has_value(); };
318 const duration_type &maxSegmentDuration(const duration_type &default_val) const;
319 const std::optional<duration_type> &maxSegmentDuration() const { return m_maxSegmentDuration; };
320 MPD &maxSegmentDuration(const duration_type &val) { m_maxSegmentDuration = val; return *this; };
321 MPD &maxSegmentDuration(duration_type &&val) { m_maxSegmentDuration = std::move(val); return *this; };
322 MPD &maxSegmentDuration(const std::nullopt_t&) { m_maxSegmentDuration.reset(); return *this; };
323
324 bool hasMaxSubsegmentDuration() const { return m_maxSubsegmentDuration.has_value(); };
325 const duration_type &maxSubsegmentDuration(const duration_type &default_val) const;
326 const std::optional<duration_type> &maxSubsegmentDuration() const { return m_maxSubsegmentDuration; };
327 MPD &maxSubsegmentDuration(const duration_type &val) { m_maxSubsegmentDuration = val; return *this; };
328 MPD &maxSubsegmentDuration(duration_type &&val) { m_maxSubsegmentDuration = std::move(val); return *this; };
329 MPD &maxSubsegmentDuration(const std::nullopt_t&) { m_maxSubsegmentDuration.reset(); return *this; };
330
331 const std::list<ProgramInformation> &programInformations() const { return m_programInformations; };
332 std::list<ProgramInformation>::const_iterator programInformationsBegin() const { return m_programInformations.cbegin(); };
333 std::list<ProgramInformation>::const_iterator programInformationsEnd() const { return m_programInformations.cend(); };
334 std::list<ProgramInformation>::iterator programInformationsBegin() { return m_programInformations.begin(); };
335 std::list<ProgramInformation>::iterator programInformationsEnd() { return m_programInformations.end(); };
339 MPD &programInformationRemove(const std::list<ProgramInformation>::const_iterator &);
340 MPD &programInformationRemove(const std::list<ProgramInformation>::iterator &);
341
342 const std::list<BaseURL> &baseURLs() const { return m_baseURLs; };
343 std::list<BaseURL>::const_iterator baseURLsBegin() const { return m_baseURLs.cbegin(); };
344 std::list<BaseURL>::const_iterator baseURLsEnd() const { return m_baseURLs.cend(); };
345 std::list<BaseURL>::iterator baseURLsBegin() { return m_baseURLs.begin(); };
346 std::list<BaseURL>::iterator baseURLsEnd() { return m_baseURLs.end(); };
347 MPD &baseURLAdd(const BaseURL &base_url);
348 MPD &baseURLAdd(BaseURL &&base_url);
349 MPD &baseURLRemove(const BaseURL &base_url);
350 MPD &baseURLRemove(const std::list<BaseURL>::const_iterator &);
351 MPD &baseURLRemove(const std::list<BaseURL>::iterator &);
352
364 std::list<BaseURL> getBaseURLs() const;
365
366 const std::list<URI> &locations() const { return m_locations; };
367 std::list<URI>::const_iterator locationsBegin() const { return m_locations.cbegin(); };
368 std::list<URI>::const_iterator locationsEnd() const { return m_locations.cend(); };
369 std::list<URI>::iterator locationsBegin() { return m_locations.begin(); };
370 std::list<URI>::iterator locationsEnd() { return m_locations.end(); };
371 MPD &locationAdd(const URI &location);
372 MPD &locationAdd(URI &&location);
373 MPD &locationRemove(const URI &location);
374 MPD &locationRemove(const std::list<URI>::const_iterator &);
375 MPD &locationRemove(const std::list<URI>::iterator &);
376
377 const std::list<PatchLocation> &patchLocations() const { return m_patchLocations; };
378 std::list<PatchLocation>::const_iterator patchLocationsBegin() const { return m_patchLocations.cbegin(); };
379 std::list<PatchLocation>::const_iterator patchLocationsEnd() const { return m_patchLocations.cend(); };
380 std::list<PatchLocation>::iterator patchLocationsBegin() { return m_patchLocations.begin(); };
381 std::list<PatchLocation>::iterator patchLocationsEnd() { return m_patchLocations.end(); };
382 MPD &patchLocationAdd(const PatchLocation &patch_location);
384 MPD &patchLocationRemove(const PatchLocation &patch_location);
385 MPD &patchLocationRemove(const std::list<PatchLocation>::const_iterator &);
386 MPD &patchLocationRemove(const std::list<PatchLocation>::iterator &);
387
388 const std::list<ServiceDescription> &serviceDescriptions() const { return m_serviceDescriptions; };
389 std::list<ServiceDescription>::const_iterator serviceDescriptionsBegin() const { return m_serviceDescriptions.cbegin(); };
390 std::list<ServiceDescription>::const_iterator serviceDescriptionsEnd() const { return m_serviceDescriptions.cend(); };
391 std::list<ServiceDescription>::iterator serviceDescriptionsBegin() { return m_serviceDescriptions.begin(); };
392 std::list<ServiceDescription>::iterator serviceDescriptionsEnd() { return m_serviceDescriptions.end(); };
396 MPD &serviceDescriptionRemove(const std::list<ServiceDescription>::const_iterator &);
397 MPD &serviceDescriptionRemove(const std::list<ServiceDescription>::iterator &);
398
399 const std::list<InitializationSet> &initializationSets() const { return m_initializationSets; };
400 std::list<InitializationSet>::const_iterator initializationSetsBegin() const { return m_initializationSets.cbegin(); };
401 std::list<InitializationSet>::const_iterator initializationSetsEnd() const { return m_initializationSets.cend(); };
402 std::list<InitializationSet>::iterator initializationSetsBegin() { return m_initializationSets.begin(); };
403 std::list<InitializationSet>::iterator initializationSetsEnd() { return m_initializationSets.end(); };
407 MPD &initializationSetRemove(const std::list<InitializationSet>::const_iterator &);
408 MPD &initializationSetRemove(const std::list<InitializationSet>::iterator &);
409
410 const std::list<UIntVWithID> &initializationGroups() const { return m_initializationGroups; };
411 std::list<UIntVWithID>::const_iterator initializationGroupsBegin() const { return m_initializationGroups.cbegin(); };
412 std::list<UIntVWithID>::const_iterator initializationGroupsEnd() const { return m_initializationGroups.cend(); };
413 std::list<UIntVWithID>::iterator initializationGroupsBegin() { return m_initializationGroups.begin(); };
414 std::list<UIntVWithID>::iterator initializationGroupsEnd() { return m_initializationGroups.end(); };
418 MPD &initializationGroupRemove(const std::list<UIntVWithID>::const_iterator &);
419 MPD &initializationGroupRemove(const std::list<UIntVWithID>::iterator &);
420
421 const std::list<UIntVWithID> &initializationPresentations() const { return m_initializationPresentations; };
422 std::list<UIntVWithID>::const_iterator initializationPresentationsBegin() const { return m_initializationPresentations.cbegin(); };
423 std::list<UIntVWithID>::const_iterator initializationPresentationsEnd() const { return m_initializationPresentations.cend(); };
424 std::list<UIntVWithID>::iterator initializationPresentationsBegin() { return m_initializationPresentations.begin(); };
425 std::list<UIntVWithID>::iterator initializationPresentationsEnd() { return m_initializationPresentations.end(); };
429 MPD &initializationPresentationRemove(const std::list<UIntVWithID>::const_iterator &);
430 MPD &initializationPresentationRemove(const std::list<UIntVWithID>::iterator &);
431
432 const std::list<ContentProtection> &contentProtections() const { return m_contentProtections; };
433 std::list<ContentProtection>::const_iterator contentProtectionsBegin() const { return m_contentProtections.cbegin(); };
434 std::list<ContentProtection>::const_iterator contentProtectionsEnd() const { return m_contentProtections.cend(); };
435 std::list<ContentProtection>::iterator contentProtectionsBegin() { return m_contentProtections.begin(); };
436 std::list<ContentProtection>::iterator contentProtectionsEnd() { return m_contentProtections.end(); };
437 MPD &contentProtectionAdd(const ContentProtection &content_protection);
439 MPD &contentProtectionRemove(const ContentProtection &content_protection);
440 MPD &contentProtectionRemove(const std::list<ContentProtection>::const_iterator &);
441 MPD &contentProtectionRemove(const std::list<ContentProtection>::iterator &);
442
443 const std::list<Period> &periods() const { return m_periods; };
444 std::list<Period>::const_iterator period(const std::string &id) const;
445 std::list<Period>::const_iterator periodsBegin() const {return m_periods.cbegin(); };
446 std::list<Period>::const_iterator periodsEnd() const {return m_periods.cend(); };
447 std::list<Period>::iterator period(const std::string &id);
448 std::list<Period>::iterator periodsBegin() { return m_periods.begin(); };
449 std::list<Period>::iterator periodsEnd() { return m_periods.end(); };
453 MPD &periodRemove(const std::list<Period>::const_iterator &period_it);
454 MPD &periodRemove(const std::list<Period>::iterator &period_it);
455
456 const std::list<Metrics> &metrics() const { return m_metrics; };
457 std::list<Metrics>::const_iterator metricsBegin() const { return m_metrics.cbegin(); };
458 std::list<Metrics>::const_iterator metricsEnd() const { return m_metrics.cend(); };
459 std::list<Metrics>::iterator metricsBegin() { return m_metrics.begin(); };
460 std::list<Metrics>::iterator metricsEnd() { return m_metrics.end(); };
461 MPD &metricAdd(const Metrics &prog_info);
462 MPD &metricAdd(Metrics &&prog_info);
463 MPD &metricRemove(const Metrics &prog_info);
464 MPD &metricRemove(const std::list<Metrics>::const_iterator &);
465 MPD &metricRemove(const std::list<Metrics>::iterator &);
466
467 const std::list<Descriptor> &essentialProperties() const { return m_essentialProperties; };
468 std::list<Descriptor>::const_iterator essentialPropertiesBegin() const { return m_essentialProperties.cbegin(); };
469 std::list<Descriptor>::const_iterator essentialPropertiesEnd() const { return m_essentialProperties.cend(); };
470 std::list<Descriptor>::iterator essentialPropertiesBegin() { return m_essentialProperties.begin(); };
471 std::list<Descriptor>::iterator essentialPropertiesEnd() { return m_essentialProperties.end(); };
475 MPD &essentialPropertyRemove(const std::list<Descriptor>::const_iterator &);
476 MPD &essentialPropertyRemove(const std::list<Descriptor>::iterator &);
477
478 const std::list<Descriptor> &supplementaryProperties() const { return m_supplementaryProperties; };
479 std::list<Descriptor>::const_iterator supplementaryPropertiesBegin() const { return m_supplementaryProperties.cbegin(); };
480 std::list<Descriptor>::const_iterator supplementaryPropertiesEnd() const { return m_supplementaryProperties.cend(); };
481 std::list<Descriptor>::iterator supplementaryPropertiesBegin() { return m_supplementaryProperties.begin(); };
482 std::list<Descriptor>::iterator supplementaryPropertiesEnd() { return m_supplementaryProperties.end(); };
486 MPD &supplementaryPropertyRemove(const std::list<Descriptor>::const_iterator &);
487 MPD &supplementaryPropertyRemove(const std::list<Descriptor>::iterator &);
488
489 const std::list<Descriptor> &utcTimings() const { return m_utcTimings; };
490 std::list<Descriptor>::const_iterator utcTimingsBegin() const { return m_utcTimings.cbegin(); };
491 std::list<Descriptor>::const_iterator utcTimingsEnd() const { return m_utcTimings.cend(); };
492 std::list<Descriptor>::iterator utcTimingsBegin() { return m_utcTimings.begin(); };
493 std::list<Descriptor>::iterator utcTimingsEnd() { return m_utcTimings.end(); };
494 MPD &utcTimingAdd(const Descriptor &prog_info);
496 MPD &utcTimingRemove(const Descriptor &prog_info);
497 MPD &utcTimingRemove(const std::list<Descriptor>::const_iterator &);
498 MPD &utcTimingRemove(const std::list<Descriptor>::iterator &);
500
501 bool hasLeapSecondInformation() const { return m_leapSecondInformation.has_value(); };
503 const std::optional<LeapSecondInformation> &leapSecondInformation() const { return m_leapSecondInformation; };
504 MPD &leapSecondInformation(const LeapSecondInformation &val) { m_leapSecondInformation = val; return *this; };
505 MPD &leapSecondInformation(LeapSecondInformation &&val) { m_leapSecondInformation = std::move(val); return *this; };
506 MPD &leapSecondInformation(const std::nullopt_t&) { m_leapSecondInformation.reset(); return *this; };
507
513
519
524 std::unordered_set<const Representation*> selectedRepresentations() const;
525
535 std::list<SegmentAvailability> selectedSegmentAvailability(const time_type &query_time = std::chrono::system_clock::now()) const;
536
547 std::list<SegmentAvailability> selectedInitializationSegments(const time_type &query_time = std::chrono::system_clock::now()) const;
548
551protected:
552 friend class Period;
553 friend class AdaptationSet;
554 friend class Representation;
555 time_type systemTimeToPresentationTime(const time_type &system_time) const; // Returns presentation time
556 time_type presentationTimeToSystemTime(const time_type &pres_time) const; // Returns system wallclock time
559
560private:
561 void extractMPD(void *doc);
562 std::list<Period>::const_iterator getPeriodFor(const time_type &pres_time) const;
563
564 // Derived from ISO 23009-1_2022
565 // MPD attributes
566 std::optional<std::string> m_id;
567 std::list<URI> m_profiles; // Must contain at least 1 entry
568 PresentationType m_type;
569 std::optional<time_type> m_availabilityStartTime;
570 std::optional<time_type> m_availabilityEndTime;
571 std::optional<time_type> m_publishTime;
572 std::optional<duration_type> m_mediaPresentationDuration;
573 std::optional<duration_type> m_minimumUpdatePeriod;
574 duration_type m_minBufferTime;
575 std::optional<duration_type> m_timeShiftBufferDepth;
576 std::optional<duration_type> m_suggestedPresentationDelay;
577 std::optional<duration_type> m_maxSegmentDuration;
578 std::optional<duration_type> m_maxSubsegmentDuration;
579 // MPD elements
580 std::list<ProgramInformation> m_programInformations;
581 std::list<BaseURL> m_baseURLs;
582 std::list<URI> m_locations;
583 std::list<PatchLocation> m_patchLocations;
584 std::list<ServiceDescription> m_serviceDescriptions;
585 std::list<InitializationSet> m_initializationSets;
586 std::list<UIntVWithID> m_initializationGroups;
587 std::list<UIntVWithID> m_initializationPresentations;
588 std::list<ContentProtection> m_contentProtections;
589 std::list<Period> m_periods; // must contain at least 1 item
590 std::list<Metrics> m_metrics;
591 std::list<Descriptor> m_essentialProperties;
592 std::list<Descriptor> m_supplementaryProperties;
593 std::list<Descriptor> m_utcTimings;
594 std::optional<LeapSecondInformation> m_leapSecondInformation;
595
596 // MPD original location (if known)
597 std::optional<URI> m_mpdURL;
598
599 // Cache values (can change, even in const object, hence the pointer)
600 struct Cache {
601 Cache();
602 bool haveUtcTimingOffsetFromSystemClock; // Indicate if we've fetched UTCTimings before now
603 duration_type utcTimingOffsetFromSystemClock; // Offset derived from UTCTiming or a default of 0s.
604 } *m_cache;
605};
606
608
609LIBMPDPP_PUBLIC_API std::ostream &operator<<(std::ostream &os, const LIBMPDPP_NAMESPACE_CLASS(MPD) &mpd);
610
611/* vim:ts=8:sts=4:sw=4:expandtab:
612 */
613#endif /*_BBC_PARSE_DASH_MPD_MPD_HH_*/
std::ostream & operator<<(std::ostream &os, const com::bbc::libmpdpp ::MPD &mpd)
AdaptationSet class.
Definition AdaptationSet.hh:60
Definition BaseURL.hh:43
Definition ContentProtection.hh:37
Definition Descriptor.hh:41
Definition InitializationSet.hh:39
Definition LeapSecondInformation.hh:37
std::list< Descriptor >::iterator utcTimingsEnd()
Definition MPD.hh:493
std::list< Period >::iterator periodsBegin()
Definition MPD.hh:448
MPD & profileRemove(const std::list< URI >::const_iterator &it)
MPD & baseURLRemove(const BaseURL &base_url)
std::list< Descriptor >::iterator supplementaryPropertiesEnd()
Definition MPD.hh:482
bool hasId() const
Definition MPD.hh:234
MPD & initializationSetAdd(const InitializationSet &init_set)
MPD & baseURLAdd(const BaseURL &base_url)
MPD & suggestedPresentationDelay(const duration_type &val)
Definition MPD.hh:313
MPD & locationAdd(const URI &location)
MPD & programInformationRemove(const std::list< ProgramInformation >::iterator &)
MPD & sourceURL(const std::nullopt_t &)
Definition MPD.hh:173
MPD & supplementaryPropertyRemove(const std::list< Descriptor >::iterator &)
MPD & locationRemove(const URI &location)
MPD & periodAdd(Period &&period)
MPD & profileAdd(const URI &uri)
MPD & publishTime(const std::nullopt_t &)
Definition MPD.hh:283
MPD & metricRemove(const std::list< Metrics >::const_iterator &)
MPD & id(std::string &&val)
Definition MPD.hh:238
const URI & profile(std::list< URI >::size_type idx) const
Definition MPD.hh:246
MPD & leapSecondInformation(const std::nullopt_t &)
Definition MPD.hh:506
std::list< URI >::iterator profilesBegin()
Definition MPD.hh:244
MPD & timeShiftBufferDepth(const duration_type &val)
Definition MPD.hh:306
std::list< UIntVWithID >::const_iterator initializationPresentationsBegin() const
Definition MPD.hh:422
MPD & maxSegmentDuration(const std::nullopt_t &)
Definition MPD.hh:322
PresentationType presentationType() const
Definition MPD.hh:261
MPD & programInformationAdd(const ProgramInformation &prog_info)
const std::list< ProgramInformation > & programInformations() const
Definition MPD.hh:331
bool hasMaxSubsegmentDuration() const
Definition MPD.hh:324
bool hasMinimumUpdatePeriod() const
Definition MPD.hh:292
std::list< Period >::const_iterator period(const std::string &id) const
MPD & minBufferTime(const duration_type &val)
Definition MPD.hh:300
MPD & mediaPresentationDuration(const std::nullopt_t &)
Definition MPD.hh:290
std::list< Descriptor >::const_iterator essentialPropertiesEnd() const
Definition MPD.hh:469
std::list< BaseURL >::iterator baseURLsEnd()
Definition MPD.hh:346
std::list< ProgramInformation >::iterator programInformationsEnd()
Definition MPD.hh:335
MPD(std::istream &input_stream, const std::optional< URI > &mpd_location=std::nullopt)
std::list< ProgramInformation >::const_iterator programInformationsBegin() const
Definition MPD.hh:332
std::list< URI >::const_iterator locationsBegin() const
Definition MPD.hh:367
MPD(const std::vector< unsigned char > &mpd_xml, const std::optional< URI > &mpd_location=std::nullopt)
const duration_type & minBufferTime() const
Definition MPD.hh:299
std::list< InitializationSet >::iterator initializationSetsBegin()
Definition MPD.hh:402
MPD & maxSubsegmentDuration(const duration_type &val)
Definition MPD.hh:327
std::list< Descriptor >::const_iterator supplementaryPropertiesEnd() const
Definition MPD.hh:480
static std::ostream & pretty(std::ostream &os)
bool hasLeapSecondInformation() const
Definition MPD.hh:501
std::list< URI >::const_iterator locationsEnd() const
Definition MPD.hh:368
std::list< BaseURL > getBaseURLs() const
std::list< BaseURL >::const_iterator baseURLsBegin() const
Definition MPD.hh:343
std::list< PatchLocation >::const_iterator patchLocationsBegin() const
Definition MPD.hh:378
std::list< BaseURL >::const_iterator baseURLsEnd() const
Definition MPD.hh:344
std::list< Metrics >::const_iterator metricsEnd() const
Definition MPD.hh:458
MPD & initializationPresentationAdd(UIntVWithID &&init_pres)
MPD & baseURLRemove(const std::list< BaseURL >::const_iterator &)
const std::list< BaseURL > & baseURLs() const
Definition MPD.hh:342
MPD & sourceURL(URI &&url)
Definition MPD.hh:181
MPD & initializationGroupRemove(const std::list< UIntVWithID >::iterator &)
std::list< Descriptor >::iterator supplementaryPropertiesBegin()
Definition MPD.hh:481
std::list< ContentProtection >::const_iterator contentProtectionsEnd() const
Definition MPD.hh:434
MPD & leapSecondInformation(const LeapSecondInformation &val)
Definition MPD.hh:504
const time_type & availabilityEndTime(const time_type &default_val) const
MPD & sourceURL(const std::optional< URI > &url)
Definition MPD.hh:182
std::unordered_set< const Representation * > selectedRepresentations() const
const time_type & publishTime(const time_type &default_val) const
MPD & minimumUpdatePeriod(duration_type &&val)
Definition MPD.hh:296
MPD & initializationGroupAdd(UIntVWithID &&init_group)
MPD & initializationGroupRemove(const UIntVWithID &init_group)
std::list< BaseURL >::iterator baseURLsBegin()
Definition MPD.hh:345
MPD & utcTimingAdd(Descriptor &&prog_info)
MPD & serviceDescriptionRemove(const std::list< ServiceDescription >::const_iterator &)
const std::list< URI > & locations() const
Definition MPD.hh:366
const std::list< Descriptor > & supplementaryProperties() const
Definition MPD.hh:478
std::list< SegmentAvailability > selectedSegmentAvailability(const time_type &query_time=std::chrono::system_clock::now()) const
MPD & contentProtectionRemove(const std::list< ContentProtection >::const_iterator &)
std::list< InitializationSet >::iterator initializationSetsEnd()
Definition MPD.hh:403
std::list< ContentProtection >::iterator contentProtectionsBegin()
Definition MPD.hh:435
MPD & serviceDescriptionRemove(const std::list< ServiceDescription >::iterator &)
MPD & periodAdd(const Period &period)
const std::list< UIntVWithID > & initializationGroups() const
Definition MPD.hh:410
MPD & availabilityEndTime(const time_type &val)
Definition MPD.hh:274
const std::list< ContentProtection > & contentProtections() const
Definition MPD.hh:432
MPD(const std::vector< char > &mpd_xml, const std::optional< URI > &mpd_location=std::nullopt)
std::list< Metrics >::iterator metricsBegin()
Definition MPD.hh:459
MPD(const MPD &other)
MPD & minimumUpdatePeriod(const duration_type &val)
Definition MPD.hh:295
const std::list< Descriptor > & essentialProperties() const
Definition MPD.hh:467
const std::optional< time_type > & publishTime() const
Definition MPD.hh:280
MPD & essentialPropertyRemove(const Descriptor &prog_info)
const std::optional< duration_type > & timeShiftBufferDepth() const
Definition MPD.hh:305
MPD & maxSegmentDuration(const duration_type &val)
Definition MPD.hh:320
MPD & minimumUpdatePeriod(const std::nullopt_t &)
Definition MPD.hh:297
std::list< UIntVWithID >::const_iterator initializationPresentationsEnd() const
Definition MPD.hh:423
const std::list< ServiceDescription > & serviceDescriptions() const
Definition MPD.hh:388
MPD & sourceURL(const URI &url)
Definition MPD.hh:180
std::list< URI >::iterator locationsEnd()
Definition MPD.hh:370
MPD & periodRemove(const std::list< Period >::const_iterator &period_it)
MPD & serviceDescriptionRemove(const ServiceDescription &service_desc)
MPD & supplementaryPropertyAdd(Descriptor &&prog_info)
MPD & metricAdd(Metrics &&prog_info)
std::list< SegmentAvailability > selectedInitializationSegments(const time_type &query_time=std::chrono::system_clock::now()) const
MPD & timeShiftBufferDepth(const std::nullopt_t &)
Definition MPD.hh:308
std::list< UIntVWithID >::const_iterator initializationGroupsEnd() const
Definition MPD.hh:412
bool profilesContain(const URI &uri) const
const std::optional< duration_type > & minimumUpdatePeriod() const
Definition MPD.hh:294
const std::list< Descriptor > & utcTimings() const
Definition MPD.hh:489
std::list< Period >::iterator periodsEnd()
Definition MPD.hh:449
bool hasMediaPresentationDuration() const
Definition MPD.hh:285
bool hasMaxSegmentDuration() const
Definition MPD.hh:317
MPD & essentialPropertyRemove(const std::list< Descriptor >::iterator &)
std::chrono::system_clock::time_point time_type
Date-time type used in the MPD.
Definition MPD.hh:51
std::list< PatchLocation >::const_iterator patchLocationsEnd() const
Definition MPD.hh:379
MPD & suggestedPresentationDelay(const std::nullopt_t &)
Definition MPD.hh:315
std::list< Period >::const_iterator periodsBegin() const
Definition MPD.hh:445
MPD & baseURLAdd(BaseURL &&base_url)
MPD & maxSubsegmentDuration(const std::nullopt_t &)
Definition MPD.hh:329
MPD & initializationSetAdd(InitializationSet &&init_set)
MPD & contentProtectionAdd(const ContentProtection &content_protection)
MPD & availabilityEndTime(time_type &&val)
Definition MPD.hh:275
const std::optional< duration_type > & maxSegmentDuration() const
Definition MPD.hh:319
const std::list< Metrics > & metrics() const
Definition MPD.hh:456
MPD & periodRemove(const std::list< Period >::iterator &period_it)
const std::optional< std::string > & id() const
Definition MPD.hh:236
const std::optional< duration_type > & mediaPresentationDuration() const
Definition MPD.hh:287
MPD & patchLocationRemove(const std::list< PatchLocation >::iterator &)
std::list< InitializationSet >::const_iterator initializationSetsBegin() const
Definition MPD.hh:400
MPD & id(const std::string &val)
Definition MPD.hh:237
std::list< Period >::iterator period(const std::string &id)
std::list< ServiceDescription >::iterator serviceDescriptionsBegin()
Definition MPD.hh:391
bool hasTimeShiftBufferDepth() const
Definition MPD.hh:303
MPD & contentProtectionAdd(ContentProtection &&content_protection)
MPD & essentialPropertyRemove(const std::list< Descriptor >::const_iterator &)
std::string asXML(bool compact_form) const
std::list< Period >::const_iterator periodsEnd() const
Definition MPD.hh:446
MPD(const duration_type &minimum_buffer_time, const URI &profile, Period &&period, PresentationType presentation_type=STATIC)
const duration_type & maxSegmentDuration(const duration_type &default_val) const
bool hasSourceURL() const
Definition MPD.hh:159
MPD & mediaPresentationDuration(const duration_type &val)
Definition MPD.hh:288
std::list< InitializationSet >::const_iterator initializationSetsEnd() const
Definition MPD.hh:401
const std::optional< duration_type > & maxSubsegmentDuration() const
Definition MPD.hh:326
const duration_type & maxSubsegmentDuration(const duration_type &default_val) const
const duration_type & minimumUpdatePeriod(const duration_type &default_val) const
std::list< ServiceDescription >::const_iterator serviceDescriptionsEnd() const
Definition MPD.hh:390
const std::optional< duration_type > & suggestedPresentationDelay() const
Definition MPD.hh:312
MPD & locationRemove(const std::list< URI >::iterator &)
const std::optional< time_type > & availabilityStartTime() const
Definition MPD.hh:266
MPD & supplementaryPropertyRemove(const std::list< Descriptor >::const_iterator &)
MPD & locationAdd(URI &&location)
bool isDynamicPresentation() const
Definition MPD.hh:260
MPD & presentationType(PresentationType pres_type)
Definition MPD.hh:262
const std::list< InitializationSet > & initializationSets() const
Definition MPD.hh:399
MPD & operator=(MPD &&other)
MPD & id(const std::nullopt_t &)
Definition MPD.hh:239
std::list< Descriptor >::const_iterator supplementaryPropertiesBegin() const
Definition MPD.hh:479
MPD(const std::string &filename, const std::optional< URI > &mpd_location=std::nullopt)
MPD & utcTimingRemove(const std::list< Descriptor >::iterator &)
std::list< Descriptor >::const_iterator utcTimingsEnd() const
Definition MPD.hh:491
MPD & initializationPresentationAdd(const UIntVWithID &init_pres)
std::list< UIntVWithID >::iterator initializationGroupsEnd()
Definition MPD.hh:414
std::list< Descriptor >::const_iterator essentialPropertiesBegin() const
Definition MPD.hh:468
const std::list< PatchLocation > & patchLocations() const
Definition MPD.hh:377
std::list< Descriptor >::const_iterator utcTimingsBegin() const
Definition MPD.hh:490
const duration_type & suggestedPresentationDelay(const duration_type &default_val) const
MPD & sourceURL(std::optional< URI > &&url)
Definition MPD.hh:183
std::list< UIntVWithID >::iterator initializationPresentationsBegin()
Definition MPD.hh:424
MPD & essentialPropertyAdd(Descriptor &&prog_info)
MPD & availabilityStartTime(time_type &&val)
Definition MPD.hh:268
bool hasAvailabilityStartTime() const
Definition MPD.hh:264
MPD & availabilityStartTime(const std::nullopt_t &)
Definition MPD.hh:269
const std::list< URI > & profiles() const
Definition MPD.hh:241
MPD & initializationPresentationRemove(const std::list< UIntVWithID >::iterator &)
MPD & programInformationAdd(ProgramInformation &&prog_info)
std::list< Descriptor >::iterator essentialPropertiesEnd()
Definition MPD.hh:471
const time_type & availabilityStartTime(const time_type &default_val) const
MPD & contentProtectionRemove(const ContentProtection &content_protection)
std::list< ContentProtection >::iterator contentProtectionsEnd()
Definition MPD.hh:436
std::list< Metrics >::const_iterator metricsBegin() const
Definition MPD.hh:457
MPD & supplementaryPropertyAdd(const Descriptor &prog_info)
MPD & profileAdd(URI &&uri)
bool hasAvailabilityEndTime() const
Definition MPD.hh:271
MPD & timeShiftBufferDepth(duration_type &&val)
Definition MPD.hh:307
std::list< UIntVWithID >::iterator initializationGroupsBegin()
Definition MPD.hh:413
PresentationType
Definition MPD.hh:56
@ DYNAMIC
Presentation is dynamic (can change during playback, e.g. live stream)
Definition MPD.hh:58
@ STATIC
Presentation is static (unchanging, e.g. video on demand)
Definition MPD.hh:57
MPD & availabilityStartTime(const time_type &val)
Definition MPD.hh:267
std::chrono::microseconds duration_type
Time duration type used in the MPD.
Definition MPD.hh:52
const duration_type & timeShiftBufferDepth(const duration_type &default_val) const
MPD & serviceDescriptionAdd(ServiceDescription &&service_desc)
void synchroniseWithUTCTiming() const
MPD & programInformationRemove(const ProgramInformation &prog_info)
MPD & initializationGroupAdd(const UIntVWithID &init_group)
MPD & baseURLRemove(const std::list< BaseURL >::iterator &)
std::list< PatchLocation >::iterator patchLocationsBegin()
Definition MPD.hh:380
MPD & minBufferTime(duration_type &&val)
Definition MPD.hh:301
MPD & leapSecondInformation(LeapSecondInformation &&val)
Definition MPD.hh:505
MPD & patchLocationAdd(const PatchLocation &patch_location)
MPD & suggestedPresentationDelay(duration_type &&val)
Definition MPD.hh:314
MPD & profileRemove(const URI &uri)
MPD & supplementaryPropertyRemove(const Descriptor &prog_info)
std::list< ProgramInformation >::const_iterator programInformationsEnd() const
Definition MPD.hh:333
MPD & maxSubsegmentDuration(duration_type &&val)
Definition MPD.hh:328
MPD & initializationPresentationRemove(const UIntVWithID &init_pres)
MPD & programInformationRemove(const std::list< ProgramInformation >::const_iterator &)
MPD & publishTime(const time_type &val)
Definition MPD.hh:281
MPD & metricRemove(const std::list< Metrics >::iterator &)
std::list< Metrics >::iterator metricsEnd()
Definition MPD.hh:460
const LeapSecondInformation & leapSecondInformation(const LeapSecondInformation &default_val) const
std::list< Descriptor >::iterator essentialPropertiesBegin()
Definition MPD.hh:470
MPD & initializationSetRemove(const std::list< InitializationSet >::iterator &)
std::list< PatchLocation >::iterator patchLocationsEnd()
Definition MPD.hh:381
bool operator==(const MPD &other) const
MPD & publishTime(time_type &&val)
Definition MPD.hh:282
MPD & initializationPresentationRemove(const std::list< UIntVWithID >::const_iterator &)
std::list< URI >::iterator locationsBegin()
Definition MPD.hh:369
std::list< ProgramInformation >::iterator programInformationsBegin()
Definition MPD.hh:334
bool hasPublishTime() const
Definition MPD.hh:278
MPD & operator=(const MPD &other)
MPD(const duration_type &minimum_buffer_time, const URI &profile, const Period &period, PresentationType presentation_type=STATIC)
MPD & initializationSetRemove(const InitializationSet &init_set)
MPD & utcTimingRemove(const Descriptor &prog_info)
std::list< URI >::const_iterator profilesEnd() const
Definition MPD.hh:243
const std::optional< LeapSecondInformation > & leapSecondInformation() const
Definition MPD.hh:503
const std::list< Period > & periods() const
Definition MPD.hh:443
MPD & patchLocationRemove(const std::list< PatchLocation >::const_iterator &)
const std::optional< time_type > & availabilityEndTime() const
Definition MPD.hh:273
static std::ostream & compact(std::ostream &os)
MPD & maxSegmentDuration(duration_type &&val)
Definition MPD.hh:321
std::list< UIntVWithID >::const_iterator initializationGroupsBegin() const
Definition MPD.hh:411
const std::list< UIntVWithID > & initializationPresentations() const
Definition MPD.hh:421
std::list< UIntVWithID >::iterator initializationPresentationsEnd()
Definition MPD.hh:425
std::list< ContentProtection >::const_iterator contentProtectionsBegin() const
Definition MPD.hh:433
MPD & mediaPresentationDuration(duration_type &&val)
Definition MPD.hh:289
MPD & metricAdd(const Metrics &prog_info)
bool hasSuggestedPresentationDelay() const
Definition MPD.hh:310
bool isStaticPresentation() const
Definition MPD.hh:259
MPD & metricRemove(const Metrics &prog_info)
std::list< URI >::const_iterator profilesBegin() const
Definition MPD.hh:242
MPD & utcTimingAdd(const Descriptor &prog_info)
MPD & patchLocationRemove(const PatchLocation &patch_location)
MPD & utcTimingRemove(const std::list< Descriptor >::const_iterator &)
std::list< URI >::iterator profilesEnd()
Definition MPD.hh:245
MPD & locationRemove(const std::list< URI >::const_iterator &)
const std::string & id(const std::string &default_val) const
std::list< ServiceDescription >::const_iterator serviceDescriptionsBegin() const
Definition MPD.hh:389
const duration_type & mediaPresentationDuration(const duration_type &default_val) const
MPD & serviceDescriptionAdd(const ServiceDescription &service_desc)
const std::optional< URI > & sourceURL() const
Definition MPD.hh:165
MPD & availabilityEndTime(const std::nullopt_t &)
Definition MPD.hh:276
std::list< ServiceDescription >::iterator serviceDescriptionsEnd()
Definition MPD.hh:392
MPD & contentProtectionRemove(const std::list< ContentProtection >::iterator &)
MPD & patchLocationAdd(PatchLocation &&patch_location)
MPD & essentialPropertyAdd(const Descriptor &prog_info)
MPD & initializationGroupRemove(const std::list< UIntVWithID >::const_iterator &)
std::list< Descriptor >::iterator utcTimingsBegin()
Definition MPD.hh:492
MPD & initializationSetRemove(const std::list< InitializationSet >::const_iterator &)
MPD & periodRemove(const Period &period)
Definition Metrics.hh:37
Definition PatchLocation.hh:38
Definition Period.hh:53
Definition ProgramInformation.hh:37
Definition Representation.hh:55
Definition ServiceDescription.hh:37
Definition UIntVWithID.hh:35
Definition URI.hh:40
#define LIBMPDPP_NAMESPACE_CLASS(A)
Definition macros.hh:61
#define LIBMPDPP_NAMESPACE_END
Definition macros.hh:54
#define LIBMPDPP_PUBLIC_API
Used to mark something as part of the public API.
Definition macros.hh:21
#define LIBMPDPP_NAMESPACE_BEGIN
Definition macros.hh:50