Skip to content

Commit 8f38cb8

Browse files
committed
Fix default quality #401
1 parent 390aaa6 commit 8f38cb8

File tree

2 files changed

+1
-285
lines changed

2 files changed

+1
-285
lines changed

chrome/player/players/LevelManager.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export class LevelManager {
123123
}
124124

125125
getDesiredVideoHeight() {
126-
const defaultQuality = 'Auto'; // Placeholder, should be fetched from config
126+
const defaultQuality = this.client.options.defaultQuality;
127127
if (defaultQuality === 'Auto') {
128128
const qualityMultiplier = 1.1;
129129
return window.innerHeight * window.devicePixelRatio * qualityMultiplier;

chrome/player/players/dash/DashTrackUtils.mjs

Lines changed: 0 additions & 284 deletions
Original file line numberDiff line numberDiff line change
@@ -2,238 +2,6 @@ import {AudioLevel, VideoLevel} from '../Levels.mjs';
22
import {Utils} from '../../utils/Utils.mjs';
33

44
export class DashTrackUtils {
5-
static getTracksWithHighestSelectionPriority(trackArr) {
6-
let max = 0;
7-
let result = [];
8-
trackArr.forEach(function(track) {
9-
if (!isNaN(track.selectionPriority)) {
10-
if (track.selectionPriority > max) {
11-
max = track.selectionPriority;
12-
result = [track];
13-
} else if (track.selectionPriority === max) {
14-
result.push(track);
15-
}
16-
}
17-
});
18-
return result;
19-
}
20-
21-
static getTracksWithHighestBitrate(trackArr) {
22-
let max = 0;
23-
let result = [];
24-
let tmp;
25-
trackArr.forEach((track) => {
26-
tmp = Math.max(...track.bitrateList.map((obj) => {
27-
return obj.bandwidth;
28-
}));
29-
30-
if (tmp > max) {
31-
max = tmp;
32-
result = [track];
33-
} else if (tmp === max) {
34-
result.push(track);
35-
}
36-
});
37-
return result;
38-
}
39-
40-
41-
static getTracksWithWidestRange(trackArr) {
42-
let max = 0;
43-
let result = [];
44-
let tmp;
45-
trackArr.forEach(function(track) {
46-
tmp = track.representationCount;
47-
48-
if (tmp > max) {
49-
max = tmp;
50-
result = [track];
51-
} else if (tmp === max) {
52-
result.push(track);
53-
}
54-
});
55-
return result;
56-
}
57-
58-
static trackSelectionModeHighestSelectionPriority(tracks) {
59-
let tmpArr = this.getTracksWithHighestSelectionPriority(tracks);
60-
61-
if (tmpArr.length > 1) {
62-
tmpArr = this.getTracksWithHighestBitrate(tmpArr);
63-
}
64-
65-
if (tmpArr.length > 1) {
66-
tmpArr = this.getTracksWithWidestRange(tmpArr);
67-
}
68-
69-
return tmpArr;
70-
}
71-
72-
static prioritizeMP4Tracks(tracks) {
73-
const mp4Tracks = tracks.filter((track) => {
74-
return this.isTrackMP4(track);
75-
});
76-
77-
if (mp4Tracks.length > 0) {
78-
return mp4Tracks;
79-
} else {
80-
return tracks;
81-
}
82-
}
83-
84-
static isTrackMP4(track) {
85-
return (track.mimeType === 'video/mp4' || track.mimeType === 'audio/mp4');
86-
}
87-
88-
static prioritizeLang(tracks, lang) {
89-
if (lang.length === 0) {
90-
return tracks;
91-
}
92-
93-
// lang format: en-US
94-
const langArr = lang.split('-');
95-
const langTracks = tracks.filter((track) => {
96-
const langArrTrack = track.lang.split('-');
97-
return langArrTrack[0] === langArr[0];
98-
});
99-
100-
if (langTracks.length > 0) {
101-
tracks = langTracks;
102-
}
103-
104-
if (langArr.length > 1) {
105-
const langTracks = tracks.filter((track) => {
106-
const langArrTrack = track.lang.split('-');
107-
return langArrTrack[1] === langArr[1];
108-
});
109-
110-
if (langTracks.length > 0) {
111-
tracks = langTracks;
112-
}
113-
}
114-
return tracks;
115-
}
116-
117-
static filterByRole(tracks, role) {
118-
const filtered = tracks.filter((track) => {
119-
return track.roles.includes(role);
120-
});
121-
122-
if (filtered.length > 0) {
123-
return filtered;
124-
} else {
125-
return tracks;
126-
}
127-
}
128-
129-
static filterTracksByCodec(tracks) {
130-
// check if can play codec
131-
return tracks.filter((track) => {
132-
return MediaSource.isTypeSupported(track.codec);
133-
});
134-
}
135-
136-
static uniqueLanguages(tracks, defaultQuality) {
137-
tracks = this.filterTracksByCodec(tracks);
138-
139-
const languageMap = new Map();
140-
tracks.forEach((track) => {
141-
let languageMapItem = languageMap.get(track.lang);
142-
if (!languageMapItem) {
143-
languageMapItem = [];
144-
languageMap.set(track.lang, languageMapItem);
145-
}
146-
languageMapItem.push(track);
147-
});
148-
149-
const result = [];
150-
languageMap.forEach((langTracks) => {
151-
if (langTracks.length > 1) {
152-
langTracks = this.filterByRole(langTracks, 'main');
153-
}
154-
155-
if (langTracks.length > 1) {
156-
if (langTracks[0].type === 'video') {
157-
const levelList = this.getLevelList(langTracks, langTracks[0].lang);
158-
const chosenQuality = Utils.selectQuality(levelList, defaultQuality);
159-
langTracks = [levelList.get(chosenQuality).track];
160-
} else {
161-
langTracks = this.prioritizeMP4Tracks(langTracks);
162-
}
163-
}
164-
165-
if (langTracks.length > 1) {
166-
langTracks = this.trackSelectionModeHighestSelectionPriority(langTracks);
167-
}
168-
result.push(langTracks[0]);
169-
});
170-
171-
return result;
172-
}
173-
174-
static prioritizeMP4WithQuality(tracks) {
175-
const byQualityLevel = new Map();
176-
tracks.forEach((track) => {
177-
track.bitrateList.forEach((data, qualityIndex) => {
178-
const key = (data.width || 0) + 'x' + (data.height || 0);
179-
let arr = byQualityLevel.get(key);
180-
if (!arr) {
181-
arr = [];
182-
byQualityLevel.set(key, arr);
183-
}
184-
arr.push({
185-
level: data.id,
186-
bitrate: data.bandwidth,
187-
width: data.width,
188-
height: data.height,
189-
isMP4: this.isTrackMP4(track),
190-
track,
191-
});
192-
});
193-
});
194-
195-
const result = [];
196-
byQualityLevel.forEach((arr, key) => {
197-
const mp4Arr = arr.filter((o) => o.isMP4);
198-
if (mp4Arr.length > 0) {
199-
arr = mp4Arr;
200-
}
201-
202-
arr.sort((a, b) => {
203-
return a.bitrate - b.bitrate;
204-
});
205-
206-
if (key === '0x0') {
207-
arr.forEach((data) => {
208-
result.push(data);
209-
});
210-
} else {
211-
result.push(arr[0]);
212-
}
213-
});
214-
215-
// sort by bitrate
216-
result.sort((a, b) => {
217-
return a.bitrate - b.bitrate;
218-
});
219-
220-
return result;
221-
}
222-
223-
// static getLevelList(tracks, lang = null) {
224-
// if (lang) {
225-
// tracks = this.prioritizeLang(tracks, lang);
226-
// }
227-
// tracks = this.filterTracksByCodec(tracks);
228-
// const result = this.prioritizeMP4WithQuality(tracks);
229-
// // make into map
230-
// const map = new Map();
231-
// result.forEach((data) => {
232-
// map.set(data.level, data);
233-
// });
234-
// return map;
235-
// }
236-
2375
static getVideoLevelList(tracks) {
2386
// make into map
2397
const map = new Map();
@@ -305,57 +73,5 @@ export class DashTrackUtils {
30573

30674
return map;
30775
}
308-
309-
static filterTracks(tracks, lang, defaultQuality) {
310-
if (tracks.length > 1) {
311-
tracks = this.filterTracksByCodec(tracks);
312-
}
313-
314-
if (tracks.length > 1) {
315-
tracks = this.prioritizeLang(tracks, lang);
316-
}
317-
318-
if (tracks.length > 1) {
319-
tracks = this.filterByRole(tracks, 'main');
320-
}
321-
322-
if (tracks.length > 1) {
323-
if (tracks[0].type === 'video') {
324-
const levelList = this.getLevelList(tracks, lang);
325-
const chosenQuality = Utils.selectQuality(levelList, defaultQuality);
326-
tracks = [levelList.get(chosenQuality).track];
327-
} else {
328-
tracks = this.prioritizeMP4Tracks(tracks);
329-
}
330-
}
331-
332-
if (tracks.length > 1) {
333-
tracks = this.trackSelectionModeHighestSelectionPriority(tracks);
334-
}
335-
336-
return tracks;
337-
}
338-
339-
static selectRepresentationByQuality(representations, mediaInfo, defaultQuality) {
340-
if (representations.length > 1 && mediaInfo.type === 'video') {
341-
const levelList = this.getLevelList([mediaInfo]);
342-
const chosenQuality = Utils.selectQuality(levelList, defaultQuality);
343-
const representation = representations.find((rep) => {
344-
return rep.id === chosenQuality;
345-
});
346-
if (representation) {
347-
return [representation];
348-
}
349-
}
350-
351-
// fallback to highest bitrate
352-
// sort representations by bitrate
353-
const sortedReps = representations.slice();
354-
sortedReps.sort((a, b) => {
355-
return a.bandwidth - b.bandwidth;
356-
});
357-
358-
return [sortedReps[sortedReps.length - 1]];
359-
}
36076
}
36177

0 commit comments

Comments
 (0)