libmpd++
DASH MPD parsing and manipulation library
 
Loading...
Searching...
No Matches
SegmentTemplate.hh
Go to the documentation of this file.
1#ifndef _BBC_PARSE_DASH_MPD_SEGMENT_TEMPLATE_HH_
2#define _BBC_PARSE_DASH_MPD_SEGMENT_TEMPLATE_HH_
3/*****************************************************************************
4 * DASH MPD parsing library in C++: SegmentTemplate class
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 <optional>
15#include <string>
16
17#include "macros.hh"
19
22// Forward declarations for types only used by pointer or reference
23namespace xmlpp {
24 class Element;
25 class Node;
26}
29
31
32class AdaptationSet;
33class Representation;
34
41public:
46 class Variables {
47 public:
48 using duration_type = std::chrono::microseconds;
49
50 Variables(const std::optional<std::string> &rep_id = std::nullopt,
51 const std::optional<unsigned long> &number = std::nullopt,
52 const std::optional<unsigned int> &bandwidth = std::nullopt,
53 const std::optional<unsigned long> &time = std::nullopt,
54 const std::optional<unsigned long> &sub_number = std::nullopt
55 )
56 :m_representationId(rep_id)
57 ,m_number(number)
58 ,m_bandwidth(bandwidth)
59 ,m_time(time)
60 ,m_subNumber(sub_number)
61 {};
62 Variables(const Variables &other)
63 :m_representationId(other.m_representationId)
64 ,m_number(other.m_number)
65 ,m_bandwidth(other.m_bandwidth)
66 ,m_time(other.m_time)
67 ,m_subNumber(other.m_subNumber)
68 {};
70 :m_representationId(std::move(other.m_representationId))
71 ,m_number(std::move(other.m_number))
72 ,m_bandwidth(std::move(other.m_bandwidth))
73 ,m_time(std::move(other.m_time))
74 ,m_subNumber(std::move(other.m_subNumber))
75 {};
76
77 virtual ~Variables() {};
78
79 Variables &operator=(const Variables &other) {
80 m_representationId = other.m_representationId;
81 m_number = other.m_number;
82 m_bandwidth = other.m_bandwidth;
83 m_time = other.m_time;
84 m_subNumber = other.m_subNumber;
85 return *this;
86 };
87
89 m_representationId = std::move(other.m_representationId);
90 m_number = std::move(other.m_number);
91 m_bandwidth = std::move(other.m_bandwidth);
92 m_time = std::move(other.m_time);
93 m_subNumber = std::move(other.m_subNumber);
94 return *this;
95 };
96
97 const std::optional<std::string> &representationId() const { return m_representationId; };
98 std::optional<std::string> &representationId() { return m_representationId; };
99 Variables &representationId(const std::nullopt_t&) { m_representationId.reset(); return *this; };
100 Variables &representationId(const std::string &val) { m_representationId = val; return *this; };
101 Variables &representationId(std::string &&val) { m_representationId = std::move(val); return *this; };
102
103 const std::optional<unsigned long> &number() const { return m_number; };
104 std::optional<unsigned long> &number() { return m_number; };
105 Variables &number(const std::nullopt_t&) { m_number.reset(); return *this; };
106 Variables &number(unsigned long val) { m_number = val; return *this; };
107
108 const std::optional<unsigned int> &bandwidth() const { return m_bandwidth; };
109 std::optional<unsigned int> &bandwidth() { return m_bandwidth; };
110 Variables &bandwidth(const std::nullopt_t&) { m_bandwidth.reset(); return *this; };
111 Variables &bandwidth(unsigned int val) { m_bandwidth = val; return *this; };
112
113 const std::optional<unsigned long> &time() const { return m_time; };
114 std::optional<unsigned long> &time() { return m_time; };
115 Variables &time(const std::nullopt_t&) { m_time.reset(); return *this; };
116 Variables &time(unsigned long val) { m_time = val; return *this; };
118 return std::chrono::duration_cast<duration_type>(std::chrono::duration<double, std::ratio<1> >(static_cast<double>(m_time?m_time.value():0) / timescale));
119 };
120
121 const std::optional<unsigned long> &subNumber() const { return m_subNumber; };
122 std::optional<unsigned long> &subNumber() { return m_subNumber; };
123 Variables &subNumber(const std::nullopt_t&) { m_subNumber.reset(); return *this; };
124 Variables &subNumber(unsigned long val) { m_subNumber = val; return *this; };
125
126 std::string format(const std::string &format, const std::optional<unsigned int> &start_number = std::nullopt) const;
127
128 private:
129 std::optional<std::string> m_representationId;
130 std::optional<unsigned long> m_number;
131 std::optional<unsigned int> m_bandwidth;
132 std::optional<unsigned long> m_time;
133 std::optional<unsigned long> m_subNumber;
134 };
135
139
140 virtual ~SegmentTemplate() {};
141
144
145 bool operator==(const SegmentTemplate &) const;
146
147 std::string formatMediaTemplate(const Variables &) const;
148 std::string formatIndexTemplate(const Variables &) const;
149 std::string formatInitializationTemplate(const Variables &) const;
150 std::string formatBitstreamSwitchingTemplate(const Variables &) const;
151
152 // @media
153 bool hasMedia() const { return m_media.has_value(); };
154 const std::optional<std::string> &media() const { return m_media; };
155 SegmentTemplate &media(const std::nullopt_t&) { m_media.reset(); return *this; };
156 SegmentTemplate &media(const std::string &val) { m_media = val; return *this; };
157 SegmentTemplate &media(std::string &&val) { m_media = std::move(val); return *this; };
158
159 // @index
160 bool hasIndex() const { return m_index.has_value(); };
161 const std::optional<std::string> &index() const { return m_index; };
162 SegmentTemplate &index(const std::nullopt_t&) { m_index.reset(); return *this; };
163 SegmentTemplate &index(const std::string &val) { m_index = val; return *this; };
164 SegmentTemplate &index(std::string &&val) { m_index = std::move(val); return *this; };
165
166 // @initialization
167 bool hasInitialization() const { return m_initialization.has_value(); };
168 const std::optional<std::string> &initialization() const { return m_initialization; };
169 SegmentTemplate &initialization(const std::nullopt_t&) { m_initialization.reset(); return *this; };
170 SegmentTemplate &initialization(const std::string &val) { m_initialization = val; return *this; };
171 SegmentTemplate &initialization(std::string &&val) { m_initialization = std::move(val); return *this; };
172
173 // @bitstreamSwitching
174 bool hasBitstreamSwitching() const { return m_bitstreamSwitching.has_value(); };
175 const std::optional<std::string> &bitstreamSwitching() const { return m_bitstreamSwitching; };
176 SegmentTemplate &bitstreamSwitching(const std::nullopt_t&) { m_bitstreamSwitching.reset(); return *this; };
177 SegmentTemplate &bitstreamSwitching(const std::string &val) { m_bitstreamSwitching = val; return *this; };
178 SegmentTemplate &bitstreamSwitching(std::string &&val) { m_bitstreamSwitching = std::move(val); return *this; };
179
181protected:
182 friend class Period;
183 friend class AdaptationSet;
184 friend class Representation;
185 SegmentTemplate(xmlpp::Node&);
186 void setXMLElement(xmlpp::Element&) const;
188
189private:
190 std::string formatTemplate(const std::string &fmt, const Variables &vars) const;
191
192 // SegmentTemplate derived from ISO 23009-1:2022 Clause 5.3.9.4.3
193 // Attributes
194 std::optional<std::string> m_media;
195 std::optional<std::string> m_index;
196 std::optional<std::string> m_initialization;
197 std::optional<std::string> m_bitstreamSwitching;
198};
199
201
202/* vim:ts=8:sts=4:sw=4:expandtab:
203 */
204#endif /*_BBC_PARSE_DASH_MPD_SEGMENT_TEMPLATE_HH_*/
AdaptationSet class.
Definition AdaptationSet.hh:60
Definition Period.hh:53
Definition Representation.hh:55
const std::optional< unsigned int > & timescale() const
Definition SegmentBase.hh:58
Definition SegmentTemplate.hh:46
virtual ~Variables()
Definition SegmentTemplate.hh:77
Variables & time(unsigned long val)
Definition SegmentTemplate.hh:116
Variables & representationId(const std::nullopt_t &)
Definition SegmentTemplate.hh:99
std::optional< std::string > & representationId()
Definition SegmentTemplate.hh:98
Variables & bandwidth(unsigned int val)
Definition SegmentTemplate.hh:111
std::optional< unsigned int > & bandwidth()
Definition SegmentTemplate.hh:109
Variables(Variables &&other)
Definition SegmentTemplate.hh:69
const std::optional< unsigned long > & time() const
Definition SegmentTemplate.hh:113
Variables(const std::optional< std::string > &rep_id=std::nullopt, const std::optional< unsigned long > &number=std::nullopt, const std::optional< unsigned int > &bandwidth=std::nullopt, const std::optional< unsigned long > &time=std::nullopt, const std::optional< unsigned long > &sub_number=std::nullopt)
Definition SegmentTemplate.hh:50
std::string format(const std::string &format, const std::optional< unsigned int > &start_number=std::nullopt) const
std::optional< unsigned long > & subNumber()
Definition SegmentTemplate.hh:122
Variables & operator=(Variables &&other)
Definition SegmentTemplate.hh:88
const std::optional< std::string > & representationId() const
Definition SegmentTemplate.hh:97
Variables & bandwidth(const std::nullopt_t &)
Definition SegmentTemplate.hh:110
Variables & number(const std::nullopt_t &)
Definition SegmentTemplate.hh:105
Variables & subNumber(unsigned long val)
Definition SegmentTemplate.hh:124
Variables & operator=(const Variables &other)
Definition SegmentTemplate.hh:79
Variables & number(unsigned long val)
Definition SegmentTemplate.hh:106
const std::optional< unsigned int > & bandwidth() const
Definition SegmentTemplate.hh:108
Variables & representationId(std::string &&val)
Definition SegmentTemplate.hh:101
std::chrono::microseconds duration_type
Definition SegmentTemplate.hh:48
Variables & subNumber(const std::nullopt_t &)
Definition SegmentTemplate.hh:123
Variables & representationId(const std::string &val)
Definition SegmentTemplate.hh:100
duration_type timeAsDurationType(unsigned int timescale) const
Definition SegmentTemplate.hh:117
std::optional< unsigned long > & number()
Definition SegmentTemplate.hh:104
Variables & time(const std::nullopt_t &)
Definition SegmentTemplate.hh:115
std::optional< unsigned long > & time()
Definition SegmentTemplate.hh:114
const std::optional< unsigned long > & number() const
Definition SegmentTemplate.hh:103
Variables(const Variables &other)
Definition SegmentTemplate.hh:62
const std::optional< unsigned long > & subNumber() const
Definition SegmentTemplate.hh:121
Definition SegmentTemplate.hh:40
bool hasBitstreamSwitching() const
Definition SegmentTemplate.hh:174
SegmentTemplate & index(const std::nullopt_t &)
Definition SegmentTemplate.hh:162
SegmentTemplate & index(const std::string &val)
Definition SegmentTemplate.hh:163
SegmentTemplate & bitstreamSwitching(std::string &&val)
Definition SegmentTemplate.hh:178
SegmentTemplate(const SegmentTemplate &)
SegmentTemplate & index(std::string &&val)
Definition SegmentTemplate.hh:164
SegmentTemplate & operator=(const SegmentTemplate &)
SegmentTemplate & bitstreamSwitching(const std::string &val)
Definition SegmentTemplate.hh:177
SegmentTemplate & initialization(const std::nullopt_t &)
Definition SegmentTemplate.hh:169
bool hasMedia() const
Definition SegmentTemplate.hh:153
std::string formatInitializationTemplate(const Variables &) const
bool hasInitialization() const
Definition SegmentTemplate.hh:167
SegmentTemplate & media(const std::string &val)
Definition SegmentTemplate.hh:156
std::string formatIndexTemplate(const Variables &) const
SegmentTemplate(SegmentTemplate &&)
const std::optional< std::string > & bitstreamSwitching() const
Definition SegmentTemplate.hh:175
bool hasIndex() const
Definition SegmentTemplate.hh:160
virtual ~SegmentTemplate()
Definition SegmentTemplate.hh:140
SegmentTemplate & bitstreamSwitching(const std::nullopt_t &)
Definition SegmentTemplate.hh:176
SegmentTemplate & initialization(const std::string &val)
Definition SegmentTemplate.hh:170
const std::optional< std::string > & initialization() const
Definition SegmentTemplate.hh:168
bool operator==(const SegmentTemplate &) const
std::string formatBitstreamSwitchingTemplate(const Variables &) const
std::string formatMediaTemplate(const Variables &) const
const std::optional< std::string > & index() const
Definition SegmentTemplate.hh:161
SegmentTemplate & initialization(std::string &&val)
Definition SegmentTemplate.hh:171
SegmentTemplate & media(std::string &&val)
Definition SegmentTemplate.hh:157
SegmentTemplate & media(const std::nullopt_t &)
Definition SegmentTemplate.hh:155
SegmentTemplate & operator=(SegmentTemplate &&)
const std::optional< std::string > & media() const
Definition SegmentTemplate.hh:154
#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
Definition SegmentAvailability.hh:87