Skip to content

Commit 36bb2b0

Browse files
authored
Merge branch 'development' into task/xml-parse
2 parents 164334a + ff7aef7 commit 36bb2b0

17 files changed

+224
-217
lines changed

externals/BigInteger.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,9 +1280,7 @@ var bigInt = function (undefined) {
12801280
};
12811281
return Integer
12821282
}();
1283-
if (typeof module !== 'undefined' && module.hasOwnProperty('exports')) {
1284-
module.exports = bigInt
1285-
}
1283+
12861284
if (typeof define === 'function' && define.amd) {
12871285
define('big-integer', [], function () {
12881286
return bigInt

index.d.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -758,9 +758,9 @@ declare namespace dashjs {
758758
dvbFontFamily?: string;
759759
dvbMimeType?: string;
760760
dvbUrl?: string;
761-
id: string;
761+
id?: string;
762762
schemeIdUri: string;
763-
value: string;
763+
value?: string;
764764
}
765765

766766
export interface Event {
@@ -1771,6 +1771,8 @@ declare namespace dashjs {
17711771
audio?: TrackSwitchMode;
17721772
};
17731773
ignoreSelectionPriority?: boolean;
1774+
prioritizeRoleMain?: boolean;
1775+
assumeDefaultRoleAsMain?: boolean;
17741776
selectionModeForInitialTrack?: TrackSelectionMode;
17751777
fragmentRequestTimeout?: number;
17761778
fragmentRequestProgressTimeout?: number;
@@ -2770,11 +2772,11 @@ declare namespace dashjs {
27702772
}
27712773

27722774
export interface MediaSettings {
2773-
accessibility?: any;
2774-
audioChannelConfiguration?: any[];
2775-
lang?: string;
2776-
role?: string;
2777-
viewpoint?: any;
2775+
accessibility?: DescriptorType | string;
2776+
audioChannelConfiguration?: DescriptorType | string;
2777+
lang?: RegExp | string;
2778+
role?: DescriptorType | string;
2779+
viewpoint?: DescriptorType | string;
27782780
}
27792781

27802782
export class serviceDescriptions {

samples/network-interceptor/package-lock.json

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/network-interceptor/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"build": "webpack --mode development"
44
},
55
"devDependencies": {
6-
"@svta/common-media-library": "^0.7.4",
6+
"@svta/common-media-library": "^0.11.0",
77
"@types/node": "^18.14.0",
88
"copy-webpack-plugin": "^12.0.2",
99
"dashjs": "file:../..",

src/core/Settings.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ import Events from './events/Events.js';
189189
* video: Constants.TRACK_SWITCH_MODE_NEVER_REPLACE
190190
* },
191191
* ignoreSelectionPriority: false,
192+
* prioritizeRoleMain: true,
193+
* assumeDefaultRoleAsMain: true,
192194
* selectionModeForInitialTrack: Constants.TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY,
193195
* fragmentRequestTimeout: 20000,
194196
* fragmentRequestProgressTimeout: -1,
@@ -959,9 +961,9 @@ import Events from './events/Events.js';
959961
* @property {boolean} [applyContentSteering=true]
960962
* Set to true if dash.js should apply content steering during playback.
961963
* @property {boolean} [enableManifestDurationMismatchFix=true]
962-
* Overwrite the manifest segments base information timescale attributes with the timescale set in initialization segments
964+
* For multi-period streams, overwrite the manifest mediaPresentationDuration attribute with the sum of period durations if the manifest mediaPresentationDuration is greater than the sum of period durations
963965
* @property {boolean} [enableManifestTimescaleMismatchFix=false]
964-
* Defines the delay in milliseconds between two consecutive checks for events to be fired.
966+
* Overwrite the manifest segments base information timescale attributes with the timescale set in initialization segments
965967
* @property {boolean} [parseInbandPrft=false]
966968
* Set to true if dash.js should parse inband prft boxes (ProducerReferenceTime) and trigger events.
967969
* @property {module:Settings~Metrics} metrics Metric settings
@@ -1004,6 +1006,12 @@ import Events from './events/Events.js';
10041006
* @property {} [ignoreSelectionPriority: false]
10051007
* provides the option to disregard any signalled selectionPriority attribute. If disabled and if no initial media settings are set, track selection is accomplished as defined by selectionModeForInitialTrack.
10061008
*
1009+
* @property {} [prioritizeRoleMain: true]
1010+
* provides the option to disable prioritization of AdaptationSets with their Role set to Main
1011+
*
1012+
* @property {} [assumeDefaultRoleAsMain: true]
1013+
* when no Role descriptor is present, assume main per default
1014+
*
10071015
* @property {string} [selectionModeForInitialTrack="highestEfficiency"]
10081016
* Sets the selection mode for the initial track. This mode defines how the initial track will be selected if no initial media settings are set. If initial media settings are set this parameter will be ignored. Available options are:
10091017
*
@@ -1234,6 +1242,8 @@ function Settings() {
12341242
video: Constants.TRACK_SWITCH_MODE_NEVER_REPLACE
12351243
},
12361244
ignoreSelectionPriority: false,
1245+
prioritizeRoleMain: true,
1246+
assumeDefaultRoleAsMain: true,
12371247
selectionModeForInitialTrack: Constants.TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY,
12381248
fragmentRequestTimeout: 20000,
12391249
fragmentRequestProgressTimeout: -1,

src/dash/DashHandler.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,8 @@ import FragmentRequest from '../streaming/vo/FragmentRequest.js';
3232
import {HTTPRequest} from '../streaming/vo/metrics/HTTPRequest.js';
3333
import FactoryMaker from '../core/FactoryMaker.js';
3434
import MediaPlayerEvents from '../streaming/MediaPlayerEvents.js';
35-
import {
36-
replaceIDForTemplate,
37-
replaceTokenForTemplate,
38-
unescapeDollarsInTemplate
39-
} from './utils/SegmentsUtils.js';
4035
import DashConstants from './constants/DashConstants.js';
36+
import {processUriTemplate} from './utils/SegmentsUtils.js';
4137

4238

4339
const DEFAULT_ADJUST_SEEK_TIME_THRESHOLD = 0.5;
@@ -145,7 +141,7 @@ function DashHandler(config) {
145141
request.representation = representation;
146142

147143
if (_setRequestUrl(request, representation.initialization, representation)) {
148-
request.url = replaceTokenForTemplate(request.url, 'Bandwidth', representation.bandwidth);
144+
request.url = processUriTemplate(request.url, undefined, undefined, undefined, representation.bandwidth);
149145
return request;
150146
}
151147
}
@@ -158,13 +154,14 @@ function DashHandler(config) {
158154
const request = new FragmentRequest();
159155
const representation = segment.representation;
160156
const bandwidth = representation.bandwidth;
161-
let url = segment.media;
162-
163-
url = replaceTokenForTemplate(url, 'Number', segment.replacementNumber);
164-
url = replaceTokenForTemplate(url, 'Time', segment.replacementTime);
165-
url = replaceTokenForTemplate(url, 'Bandwidth', bandwidth);
166-
url = replaceIDForTemplate(url, representation.id);
167-
url = unescapeDollarsInTemplate(url);
157+
const url = processUriTemplate(
158+
segment.media,
159+
representation.id,
160+
segment.replacementNumber,
161+
undefined,
162+
bandwidth,
163+
segment.replacementTime
164+
);
168165

169166
request.mediaType = getType();
170167
request.bandwidth = representation.bandwidth;

src/dash/models/DashManifestModel.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@ function DashManifestModel() {
251251
return [];
252252
}
253253
return adaptation[DashConstants.ROLE].map(role => {
254+
// conceal misspelled "Main" from earlier MPEG-DASH editions (fixed with 6th edition)
255+
if ( role.schemeIdUri === Constants.DASH_ROLE_SCHEME_ID && role.value === 'Main') {
256+
role.value = DashConstants.MAIN;
257+
}
258+
254259
const r = new DescriptorType();
255260
r.init(role);
256261
return r

src/dash/utils/SegmentsUtils.js

Lines changed: 17 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -29,105 +29,13 @@
2929
* POSSIBILITY OF SUCH DAMAGE.
3030
*/
3131

32+
import {processUriTemplate as cmlProcessUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
3233
import Segment from './../vo/Segment.js';
3334

34-
function zeroPadToLength(numStr, minStrLength) {
35-
while (numStr.length < minStrLength) {
36-
numStr = '0' + numStr;
37-
}
38-
return numStr;
39-
}
40-
4135
function getNumberForSegment(segment, segmentIndex) {
4236
return segment.representation.startNumber + segmentIndex;
4337
}
4438

45-
export function unescapeDollarsInTemplate(url) {
46-
return url ? url.split('$$').join('$') : url;
47-
}
48-
49-
export function replaceIDForTemplate(url, value) {
50-
if (!value || !url || url.indexOf('$RepresentationID$') === -1) {
51-
return url;
52-
}
53-
let v = value.toString();
54-
return url.split('$RepresentationID$').join(v);
55-
}
56-
57-
export function replaceTokenForTemplate(url, token, value) {
58-
const formatTag = '%0';
59-
60-
let startPos,
61-
endPos,
62-
formatTagPos,
63-
specifier,
64-
width,
65-
paddedValue;
66-
67-
const tokenLen = token.length;
68-
const formatTagLen = formatTag.length;
69-
70-
if (!url) {
71-
return url;
72-
}
73-
74-
// keep looping round until all instances of <token> have been
75-
// replaced. once that has happened, startPos below will be -1
76-
// and the completed url will be returned.
77-
while (true) {
78-
79-
// check if there is a valid $<token>...$ identifier
80-
// if not, return the url as is.
81-
startPos = url.indexOf('$' + token);
82-
if (startPos < 0) {
83-
return url;
84-
}
85-
86-
// the next '$' must be the end of the identifier
87-
// if there isn't one, return the url as is.
88-
endPos = url.indexOf('$', startPos + tokenLen);
89-
if (endPos < 0) {
90-
return url;
91-
}
92-
93-
// now see if there is an additional format tag suffixed to
94-
// the identifier within the enclosing '$' characters
95-
formatTagPos = url.indexOf(formatTag, startPos + tokenLen);
96-
if (formatTagPos > startPos && formatTagPos < endPos) {
97-
98-
specifier = url.charAt(endPos - 1);
99-
width = parseInt(url.substring(formatTagPos + formatTagLen, endPos - 1), 10);
100-
101-
// support the minimum specifiers required by IEEE 1003.1
102-
// (d, i , o, u, x, and X) for completeness
103-
switch (specifier) {
104-
// treat all int types as uint,
105-
// hence deliberate fallthrough
106-
case 'd':
107-
case 'i':
108-
case 'u':
109-
paddedValue = zeroPadToLength(value.toString(), width);
110-
break;
111-
case 'x':
112-
paddedValue = zeroPadToLength(value.toString(16), width);
113-
break;
114-
case 'X':
115-
paddedValue = zeroPadToLength(value.toString(16), width).toUpperCase();
116-
break;
117-
case 'o':
118-
paddedValue = zeroPadToLength(value.toString(8), width);
119-
break;
120-
default:
121-
return url;
122-
}
123-
} else {
124-
paddedValue = value;
125-
}
126-
127-
url = url.substring(0, startPos) + paddedValue + url.substring(endPos + 1);
128-
}
129-
}
130-
13139
function getSegment(representation, duration, presentationStartTime, mediaStartTime, timelineConverter, presentationEndTime, isDynamic, index) {
13240
let seg = new Segment();
13341

@@ -170,6 +78,14 @@ function isSegmentAvailable(timelineConverter, representation, segment, isDynami
17078
return true;
17179
}
17280

81+
export function processUriTemplate(url, representationId, number, subNumber, bandwidth, time) {
82+
if (!url) {
83+
return url;
84+
}
85+
86+
return cmlProcessUriTemplate(url, representationId, number, subNumber, bandwidth, time);
87+
}
88+
17389
export function getIndexBasedSegment(timelineConverter, isDynamic, representation, index) {
17490
let duration,
17591
presentationStartTime,
@@ -222,10 +138,14 @@ export function getTimeBasedSegment(timelineConverter, isDynamic, representation
222138
}
223139

224140
seg.replacementTime = tManifest ? tManifest : time;
225-
226-
url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);
227-
url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);
228-
seg.media = url;
141+
seg.media = processUriTemplate(
142+
url,
143+
undefined,
144+
seg.replacementNumber,
145+
undefined,
146+
undefined,
147+
seg.replacementTime,
148+
);
229149
seg.mediaRange = range;
230150

231151
return seg;

src/dash/utils/TemplateSegmentsGetter.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@
2828
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2929
* POSSIBILITY OF SUCH DAMAGE.
3030
*/
31-
3231
import FactoryMaker from '../../core/FactoryMaker.js';
3332
import Constants from '../../streaming/constants/Constants.js';
34-
import {replaceTokenForTemplate, getIndexBasedSegment} from './SegmentsUtils.js';
33+
import {getIndexBasedSegment, processUriTemplate} from './SegmentsUtils.js';
3534

3635
function TemplateSegmentsGetter(config, isDynamic) {
3736
config = config || {};
@@ -82,11 +81,14 @@ function TemplateSegmentsGetter(config, isDynamic) {
8281
}
8382

8483
seg.replacementTime = Math.round(index * representation.segmentDuration * representation.timescale, 10);
85-
86-
let url = template.media;
87-
url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);
88-
url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);
89-
seg.media = url;
84+
seg.media = processUriTemplate(
85+
template.media,
86+
undefined,
87+
seg.replacementNumber,
88+
undefined,
89+
undefined,
90+
seg.replacementTime,
91+
);
9092
}
9193

9294
return seg;

0 commit comments

Comments
 (0)