@@ -2,238 +2,6 @@ import {AudioLevel, VideoLevel} from '../Levels.mjs';
22import { Utils } from '../../utils/Utils.mjs' ;
33
44export 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