116 const std::string& descriptor_string) {
117 StreamDescriptor descriptor;
120 std::vector<KVPair> kv_pairs =
121 SplitStringIntoKeyValuePairs(descriptor_string,
'=',
',');
122 if (kv_pairs.empty()) {
123 LOG(ERROR) <<
"Invalid stream descriptors name/value pairs: "
124 << descriptor_string;
127 std::vector<absl::string_view> tokens;
129 for (
const auto& pair : kv_pairs) {
130 switch (GetFieldType(pair.first)) {
131 case kStreamSelectorField:
132 descriptor.stream_selector = pair.second;
135 descriptor.input = pair.second;
138 descriptor.output = pair.second;
140 case kSegmentTemplateField:
141 descriptor.segment_template = pair.second;
143 case kBandwidthField: {
145 if (!absl::SimpleAtoi(pair.second, &bw)) {
146 LOG(ERROR) <<
"Non-numeric bandwidth specified.";
149 descriptor.bandwidth = bw;
152 case kLanguageField: {
153 descriptor.language = pair.second;
156 case kCcIndexField: {
158 if (!absl::SimpleAtoi(pair.second, &index)) {
159 LOG(ERROR) <<
"Non-numeric cc_index specified.";
162 descriptor.cc_index = index;
165 case kOutputFormatField: {
166 descriptor.output_format = pair.second;
169 case kHlsNameField: {
170 descriptor.hls_name = pair.second;
173 case kHlsGroupIdField: {
174 descriptor.hls_group_id = pair.second;
177 case kHlsPlaylistNameField: {
178 descriptor.hls_playlist_name = pair.second;
181 case kHlsIframePlaylistNameField: {
182 descriptor.hls_iframe_playlist_name = pair.second;
185 case kTrickPlayFactorField: {
187 if (!absl::SimpleAtoi(pair.second, &factor)) {
188 LOG(ERROR) <<
"Non-numeric trick play factor " << pair.second
193 LOG(ERROR) <<
"Stream trick_play_factor should be > 0.";
196 descriptor.trick_play_factor = factor;
199 case kSkipEncryptionField: {
200 unsigned skip_encryption_value;
201 if (!absl::SimpleAtoi(pair.second, &skip_encryption_value)) {
202 LOG(ERROR) <<
"Non-numeric option for skip encryption field "
204 << pair.second <<
").";
207 if (skip_encryption_value > 1) {
208 LOG(ERROR) <<
"skip_encryption should be either 0 or 1.";
212 descriptor.skip_encryption = skip_encryption_value > 0;
215 case kDrmStreamLabelField:
216 descriptor.drm_label = pair.second;
218 case kHlsCharacteristicsField:
219 descriptor.hls_characteristics =
220 SplitAndTrimSkipEmpty(pair.second,
';');
222 case kDashAccessiblitiesField: {
223 descriptor.dash_accessiblities =
224 SplitAndTrimSkipEmpty(pair.second,
';');
225 for (
const std::string& accessibility :
226 descriptor.dash_accessiblities) {
227 size_t pos = accessibility.find(
'=');
228 if (pos == std::string::npos) {
229 LOG(ERROR) <<
"Accessibility should be in scheme=value format, "
236 case kDashRolesField:
237 descriptor.dash_roles = SplitAndTrimSkipEmpty(pair.second,
';');
240 unsigned dash_only_value;
241 if (!absl::SimpleAtoi(pair.second, &dash_only_value)) {
242 LOG(ERROR) <<
"Non-numeric option for dash_only field "
244 << pair.second <<
").";
247 if (dash_only_value > 1) {
248 LOG(ERROR) <<
"dash_only should be either 0 or 1.";
251 descriptor.dash_only = dash_only_value > 0;
254 unsigned hls_only_value;
255 if (!absl::SimpleAtoi(pair.second, &hls_only_value)) {
256 LOG(ERROR) <<
"Non-numeric option for hls_only field "
258 << pair.second <<
").";
261 if (hls_only_value > 1) {
262 LOG(ERROR) <<
"hls_only should be either 0 or 1.";
265 descriptor.hls_only = hls_only_value > 0;
267 case kDashLabelField:
268 descriptor.dash_label = pair.second;
270 case kForcedSubtitleField:
271 unsigned forced_subtitle_value;
272 if (!absl::SimpleAtoi(pair.second, &forced_subtitle_value)) {
273 LOG(ERROR) <<
"Non-numeric option for forced field "
275 << pair.second <<
").";
278 if (forced_subtitle_value > 1) {
279 LOG(ERROR) <<
"forced should be either 0 or 1.";
282 descriptor.forced_subtitle = forced_subtitle_value > 0;
284 case kInputFormatField: {
285 descriptor.input_format = pair.second;
289 LOG(ERROR) <<
"Unknown field in stream descriptor (\"" << pair.first
295 if (descriptor.forced_subtitle) {
296 auto itr = std::find(descriptor.dash_roles.begin(),
297 descriptor.dash_roles.end(),
"forced-subtitle");
298 if (itr == descriptor.dash_roles.end()) {
299 descriptor.dash_roles.push_back(
"forced-subtitle");