Whitespace and formatting cleanup
Remove a remaining tabs. Standardize whitespace usage around declarations and keywords. Lift and unify `var` declarations.
Showing
7 changed files
with
209 additions
and
305 deletions
1 | (function (window) { | 1 | (function(window) { |
2 | window.videojs.hls.HLSPlaybackController = function (vjsPlayerReference) { | 2 | var |
3 | var ManifestController = window.videojs.hls.ManifestController; | 3 | ManifestController = window.videojs.hls.ManifestController, |
4 | var SegmentController = window.videojs.hls.SegmentController; | 4 | SegmentController = window.videojs.hls.SegmentController, |
5 | var MediaSource = window.videojs.MediaSource; | 5 | MediaSource = window.videojs.MediaSource, |
6 | var SegmentParser = window.videojs.hls.SegmentParser; | 6 | SegmentParser = window.videojs.hls.SegmentParser, |
7 | var M3U8 = window.videojs.hls.M3U8; | 7 | M3U8 = window.videojs.hls.M3U8; |
8 | |||
9 | window.videojs.hls.HLSPlaybackController = function(player) { | ||
8 | 10 | ||
9 | var self = this; | 11 | var self = this; |
10 | 12 | ||
11 | self.player = vjsPlayerReference; | 13 | self.player = player; |
12 | self.mediaSource = new MediaSource(); | 14 | self.mediaSource = new MediaSource(); |
13 | self.parser = new SegmentParser(); | 15 | self.parser = new SegmentParser(); |
14 | 16 | ||
15 | self.manifestController = null; | ||
16 | self.segmentController = null; | ||
17 | self.manifestLoaded = false; | 17 | self.manifestLoaded = false; |
18 | self.currentSegment = 0; | 18 | self.currentSegment = 0; |
19 | self.currentManifest = null; | ||
20 | self.currentPlaylist = null; | ||
21 | self.currentRendition = null; | ||
22 | |||
23 | // Register Externall Callbacks | ||
24 | self.manifestLoadCompleteCallback; | ||
25 | |||
26 | self.player.on('timeupdate', function () { | ||
27 | console.log(self.player.currentTime()); | ||
28 | }); | ||
29 | |||
30 | self.player.on('onsrcchange', function () { | ||
31 | console.log('src change', self.player.currentSrc()); | ||
32 | //if src.url.m3u8 -- loadManifest.url | ||
33 | }); | ||
34 | 19 | ||
35 | self.rendition = function (rendition) { | 20 | // register external callbacks |
21 | self.rendition = function(rendition) { | ||
36 | self.currentRendition = rendition; | 22 | self.currentRendition = rendition; |
37 | self.loadManifest(self.currentRendition.url, self.onM3U8LoadComplete, self.onM3U8LoadError, self.onM3U8Update); | 23 | self.loadManifest(self.currentRendition.url, self.onM3U8LoadComplete, self.onM3U8LoadError, self.onM3U8Update); |
38 | }; | 24 | }; |
39 | 25 | ||
40 | self.loadManifest = function (manifestUrl, onDataCallback, onErrorCallback, onUpdateCallback) { | 26 | self.loadManifest = function(manifestUrl, onDataCallback, onErrorCallback, onUpdateCallback) { |
41 | self.mediaSource.addEventListener('sourceopen', function (event) { | 27 | self.mediaSource.addEventListener('sourceopen', function(event) { |
42 | console.log('source open here'); | ||
43 | // feed parsed bytes into the player | 28 | // feed parsed bytes into the player |
44 | self.sourceBuffer = self.mediaSource.addSourceBuffer('video/flv; codecs="vp6,aac"'); | 29 | self.sourceBuffer = self.mediaSource.addSourceBuffer('video/flv; codecs="vp6,aac"'); |
45 | 30 | ||
... | @@ -47,8 +32,7 @@ | ... | @@ -47,8 +32,7 @@ |
47 | 32 | ||
48 | self.sourceBuffer.appendBuffer(self.parser.getFlvHeader(), video); | 33 | self.sourceBuffer.appendBuffer(self.parser.getFlvHeader(), video); |
49 | 34 | ||
50 | if( onDataCallback ) | 35 | if (onDataCallback) { |
51 | { | ||
52 | self.manifestLoadCompleteCallback = onDataCallback; | 36 | self.manifestLoadCompleteCallback = onDataCallback; |
53 | } | 37 | } |
54 | 38 | ||
... | @@ -63,10 +47,9 @@ | ... | @@ -63,10 +47,9 @@ |
63 | }); | 47 | }); |
64 | }; | 48 | }; |
65 | 49 | ||
66 | self.onM3U8LoadComplete = function (m3u8) { | 50 | self.onM3U8LoadComplete = function(m3u8) { |
67 | if (m3u8.invalidReasons.length == 0) { | 51 | if (m3u8.invalidReasons.length === 0) { |
68 | if(m3u8.isPlaylist) | 52 | if (m3u8.isPlaylist) { |
69 | { | ||
70 | self.currentPlaylist = m3u8; | 53 | self.currentPlaylist = m3u8; |
71 | self.rendition(self.currentPlaylist.playlistItems[0]); | 54 | self.rendition(self.currentPlaylist.playlistItems[0]); |
72 | } else { | 55 | } else { |
... | @@ -75,52 +58,39 @@ | ... | @@ -75,52 +58,39 @@ |
75 | 58 | ||
76 | self.loadSegment(self.currentManifest.mediaItems[0]); | 59 | self.loadSegment(self.currentManifest.mediaItems[0]); |
77 | 60 | ||
78 | if(self.manifestLoadCompleteCallback) | 61 | if (self.manifestLoadCompleteCallback) { |
79 | { | ||
80 | self.manifestLoadCompleteCallback(m3u8); | 62 | self.manifestLoadCompleteCallback(m3u8); |
81 | } | 63 | } |
82 | } | 64 | } |
83 | } | 65 | } |
84 | }; | 66 | }; |
85 | 67 | ||
86 | self.onM3U8LoadError = function (error) { | 68 | self.onM3U8LoadError = function(error) {}; |
87 | 69 | self.onM3U8Update = function(m3u8) {}; | |
88 | }; | ||
89 | |||
90 | self.onM3U8Update = function (m3u8) { | ||
91 | |||
92 | }; | ||
93 | 70 | ||
94 | self.loadSegment = function(segment) { | 71 | self.loadSegment = function(segment) { |
95 | self.segmentController = new SegmentController(); | 72 | self.segmentController = new SegmentController(); |
96 | self.segmentController.loadSegment(segment.url, self.onSegmentLoadComplete, self.onSegmentLoadError); | 73 | self.segmentController.loadSegment(segment.url, self.onSegmentLoadComplete, self.onSegmentLoadError); |
97 | |||
98 | }; | 74 | }; |
99 | 75 | ||
100 | self.onSegmentLoadComplete = function (segment) { | 76 | self.onSegmentLoadComplete = function(segment) { |
101 | self.parser.parseSegmentBinaryData(segment.binaryData); | 77 | self.parser.parseSegmentBinaryData(segment.binaryData); |
102 | 78 | ||
103 | while (self.parser.tagsAvailable()) { | 79 | while (self.parser.tagsAvailable()) { |
104 | self.sourceBuffer.appendBuffer(self.parser.getNextTag().bytes, self.player); | 80 | self.sourceBuffer.appendBuffer(self.parser.getNextTag().bytes, self.player); |
105 | }; | 81 | } |
106 | |||
107 | console.log('load another',self.currentSegment,self.currentManifest.mediaItems.length); | ||
108 | 82 | ||
109 | if(self.currentSegment < self.currentManifest.mediaItems.length-1) | 83 | if (self.currentSegment < self.currentManifest.mediaItems.length-1) { |
110 | { | ||
111 | console.log('load another'); | ||
112 | self.loadNextSegment(); | 84 | self.loadNextSegment(); |
113 | } | 85 | } |
114 | }; | 86 | }; |
115 | 87 | ||
116 | self.loadNextSegment = function () { | 88 | self.loadNextSegment = function() { |
117 | self.currentSegment++; | 89 | self.currentSegment++; |
118 | self.loadSegment(self.currentManifest.mediaItems[self.currentSegment]); | 90 | self.loadSegment(self.currentManifest.mediaItems[self.currentSegment]); |
119 | } | 91 | } |
120 | 92 | ||
121 | self.onSegmentLoadError = function (error) { | 93 | self.onSegmentLoadError = function(error) {}; |
122 | |||
123 | }; | ||
124 | 94 | ||
125 | }; | 95 | }; |
126 | })(this); | 96 | })(this); | ... | ... |
... | @@ -2,169 +2,150 @@ | ... | @@ -2,169 +2,150 @@ |
2 | var M3U8 = window.videojs.hls.M3U8; | 2 | var M3U8 = window.videojs.hls.M3U8; |
3 | 3 | ||
4 | window.videojs.hls.M3U8Parser = function() { | 4 | window.videojs.hls.M3U8Parser = function() { |
5 | 5 | var | |
6 | var self = this; | 6 | self = this, |
7 | self.directory; | 7 | tagTypes = window.videojs.hls.m3u8TagType, |
8 | 8 | lines = [], | |
9 | var tagTypes = window.videojs.hls.m3u8TagType; | 9 | data; |
10 | var lines = []; | 10 | |
11 | var data; | 11 | self.getTagType = function(lineData) { |
12 | 12 | for (var s in tagTypes) { | |
13 | self.getTagType = function( lineData ) { | 13 | if (lineData.indexOf(tagTypes[s]) === 0) { |
14 | for ( var s in tagTypes ) | 14 | return tagTypes[s]; |
15 | { | 15 | } |
16 | if (lineData.indexOf(tagTypes[s]) == 0) | ||
17 | { | ||
18 | return tagTypes[s]; | ||
19 | } | ||
20 | } | 16 | } |
21 | } | 17 | }; |
22 | 18 | ||
23 | self.getTagValue = function ( lineData ) { | 19 | self.getTagValue = function(lineData) { |
24 | for ( var s in tagTypes ) | 20 | for (var s in tagTypes) { |
25 | { | 21 | if (lineData.indexOf(tagTypes[s]) === 0) { |
26 | if (lineData.indexOf(tagTypes[s]) == 0) | 22 | return lineData.substr(tagTypes[s].length); |
27 | { | 23 | } |
28 | return lineData.substr(tagTypes[s].length); | ||
29 | } | ||
30 | } | 24 | } |
31 | } | 25 | }; |
32 | 26 | ||
33 | self.parse = function( rawDataString ) { | 27 | self.parse = function(rawDataString) { |
34 | data = new M3U8(); | 28 | data = new M3U8(); |
35 | 29 | ||
36 | if(self.directory) | 30 | if (self.directory) { |
37 | { | 31 | data.directory = self.directory; |
38 | data.directory = self.directory; | ||
39 | } | 32 | } |
40 | 33 | ||
41 | if( rawDataString != undefined && rawDataString.toString().length > 0 ) | 34 | if (rawDataString === undefined || rawDataString.length <= 0) { |
42 | { | 35 | data.invalidReasons.push("Empty Manifest"); |
43 | lines = rawDataString.split('\n'); | 36 | return; |
44 | |||
45 | lines.forEach( | ||
46 | function(value,index) { | ||
47 | switch( self.getTagType(value) ) | ||
48 | { | ||
49 | case tagTypes.EXTM3U: | ||
50 | data.hasValidM3UTag = (index == 0); | ||
51 | if(!data.hasValidM3UTag) | ||
52 | { | ||
53 | data.invalidReasons.push("Invalid EXTM3U Tag"); | ||
54 | } | ||
55 | break; | ||
56 | |||
57 | case tagTypes.DISCONTINUITY: | ||
58 | break; | ||
59 | |||
60 | case tagTypes.PLAYLIST_TYPE: | ||
61 | if(self.getTagValue(value) == "VOD" || self.getTagValue(value) == "EVENT") | ||
62 | { | ||
63 | data.playlistType = self.getTagValue(value); | ||
64 | data.isPlaylist = true; | ||
65 | } else { | ||
66 | data.invalidReasons.push("Invalid Playlist Type Value"); | ||
67 | } | ||
68 | break; | ||
69 | |||
70 | case tagTypes.EXTINF: | ||
71 | var segment = {url: "unknown", byterange: -1, targetDuration: data.targetDuration }; | ||
72 | |||
73 | if( self.getTagType(lines[index+1]) == tagTypes.BYTERANGE ) | ||
74 | { | ||
75 | segment.byterange = self.getTagValue(lines[index+1]).split('@'); | ||
76 | segment.url = lines[index+2]; | ||
77 | } else | ||
78 | { | ||
79 | segment.url = lines[index+1]; | ||
80 | } | ||
81 | |||
82 | if(segment.url.indexOf("http")===-1 && self.directory) | ||
83 | { | ||
84 | if(data.directory[data.directory.length-1] === segment.url[0] && segment.url[0] === "/") | ||
85 | { | ||
86 | segment.url = segment.url.substr(1); | ||
87 | } | ||
88 | segment.url = self.directory + segment.url; | ||
89 | } | ||
90 | |||
91 | data.mediaItems.push(segment); | ||
92 | |||
93 | break; | ||
94 | |||
95 | case tagTypes.STREAM_INF: | ||
96 | var rendition = {}; | ||
97 | var attributes = value.substr(tagTypes.STREAM_INF.length).split(','); | ||
98 | |||
99 | attributes.forEach(function(attr_value,attr_index) { | ||
100 | if(isNaN(attr_value.split('=')[1])){ | ||
101 | rendition[attr_value.split('=')[0].toLowerCase()] = attr_value.split('=')[1]; | ||
102 | |||
103 | if(rendition[attr_value.split('=')[0].toLowerCase()].split('x').length = 2) | ||
104 | { | ||
105 | rendition.resolution = { | ||
106 | width: Number(rendition[attr_value.split('=')[0].toLowerCase()].split('x')[0]), | ||
107 | height: Number(rendition[attr_value.split('=')[0].toLowerCase()].split('x')[1]) | ||
108 | } | ||
109 | } | ||
110 | |||
111 | } else { | ||
112 | rendition[attr_value.split('=')[0].toLowerCase()] = Number(attr_value.split('=')[1]); | ||
113 | } | ||
114 | }); | ||
115 | |||
116 | |||
117 | if( self.getTagType(lines[index+1]) == tagTypes.BYTERANGE ) | ||
118 | { | ||
119 | rendition.byterange = self.getTagValue(lines[index+1]).split('@'); | ||
120 | rendition.url = lines[index+2]; | ||
121 | } else | ||
122 | { | ||
123 | rendition.url = lines[index+1]; | ||
124 | } | ||
125 | |||
126 | data.isPlaylist = true; | ||
127 | data.playlistItems.push(rendition); | ||
128 | break; | ||
129 | |||
130 | case tagTypes.TARGETDURATION: | ||
131 | data.targetDuration = Number(self.getTagValue(value).split(',')[0]); | ||
132 | break; | ||
133 | |||
134 | case tagTypes.ZEN_TOTAL_DURATION: | ||
135 | data.totalDuration = Number(self.getTagValue(value)); | ||
136 | break; | ||
137 | |||
138 | case tagTypes.VERSION: | ||
139 | data.version = Number(self.getTagValue(value)); | ||
140 | break; | ||
141 | |||
142 | case tagTypes.MEDIA_SEQUENCE: | ||
143 | data.mediaSequence = parseInt(self.getTagValue(value)); | ||
144 | break; | ||
145 | |||
146 | case tagTypes.ALLOW_CACHE: | ||
147 | if(self.getTagValue(value) == "YES" || self.getTagValue(value) == "NO") | ||
148 | { | ||
149 | data.allowCache = self.getTagValue(value); | ||
150 | } else { | ||
151 | data.invalidReasons.push("Invalid ALLOW_CACHE Value"); | ||
152 | } | ||
153 | break; | ||
154 | |||
155 | case tagTypes.ENDLIST: | ||
156 | data.hasEndTag = true; | ||
157 | break; | ||
158 | } | ||
159 | } | ||
160 | ) | ||
161 | } else { | ||
162 | data.invalidReasons.push("Empty Manifest"); | ||
163 | } | 37 | } |
38 | lines = rawDataString.split('\n'); | ||
39 | |||
40 | lines.forEach(function(value,index) { | ||
41 | var segment, rendition, attribute; | ||
42 | |||
43 | switch (self.getTagType(value)) { | ||
44 | case tagTypes.EXTM3U: | ||
45 | data.hasValidM3UTag = (index == 0); | ||
46 | if (!data.hasValidM3UTag) { | ||
47 | data.invalidReasons.push("Invalid EXTM3U Tag"); | ||
48 | } | ||
49 | break; | ||
50 | |||
51 | case tagTypes.DISCONTINUITY: | ||
52 | break; | ||
53 | |||
54 | case tagTypes.PLAYLIST_TYPE: | ||
55 | if (self.getTagValue(value) === "VOD" || | ||
56 | self.getTagValue(value) === "EVENT") { | ||
57 | data.playlistType = self.getTagValue(value); | ||
58 | data.isPlaylist = true; | ||
59 | } else { | ||
60 | data.invalidReasons.push("Invalid Playlist Type Value"); | ||
61 | } | ||
62 | break; | ||
63 | |||
64 | case tagTypes.EXTINF: | ||
65 | segment = { | ||
66 | url: "unknown", | ||
67 | byterange: -1, | ||
68 | targetDuration: data.targetDuration | ||
69 | }; | ||
70 | |||
71 | if (self.getTagType(lines[index + 1]) === tagTypes.BYTERANGE) { | ||
72 | segment.byterange = self.getTagValue(lines[index + 1]).split('@'); | ||
73 | segment.url = lines[index + 2]; | ||
74 | } else { | ||
75 | segment.url = lines[index + 1]; | ||
76 | } | ||
77 | |||
78 | if (segment.url.indexOf("http") === -1 && self.directory) { | ||
79 | if (data.directory[data.directory.length-1] === segment.url[0] && | ||
80 | segment.url[0] === "/") { | ||
81 | segment.url = segment.url.substr(1); | ||
82 | } | ||
83 | segment.url = self.directory + segment.url; | ||
84 | } | ||
85 | data.mediaItems.push(segment); | ||
86 | break; | ||
87 | |||
88 | case tagTypes.STREAM_INF: | ||
89 | rendition = {}; | ||
90 | attributes = value.substr(tagTypes.STREAM_INF.length).split(','); | ||
91 | |||
92 | attributes.forEach(function(attrValue) { | ||
93 | if (isNaN(attrValue.split('=')[1])) { | ||
94 | rendition[attrValue.split('=')[0].toLowerCase()] = attrValue.split('=')[1]; | ||
95 | |||
96 | if (rendition[attrValue.split('=')[0].toLowerCase()].split('x').length === 2) { | ||
97 | rendition.resolution = { | ||
98 | width: parseInt(rendition[attrValue.split('=')[0].toLowerCase()].split('x')[0]), | ||
99 | height: parseInt(rendition[attrValue.split('=')[0].toLowerCase()].split('x')[1]) | ||
100 | } | ||
101 | } | ||
102 | } else { | ||
103 | rendition[attrValue.split('=')[0].toLowerCase()] = parseInt(attrValue.split('=')[1]); | ||
104 | } | ||
105 | }); | ||
106 | |||
107 | if (self.getTagType(lines[index + 1]) === tagTypes.BYTERANGE) { | ||
108 | rendition.byterange = self.getTagValue(lines[index + 1]).split('@'); | ||
109 | rendition.url = lines[index + 2]; | ||
110 | } else { | ||
111 | rendition.url = lines[index + 1]; | ||
112 | } | ||
113 | |||
114 | data.isPlaylist = true; | ||
115 | data.playlistItems.push(rendition); | ||
116 | break; | ||
117 | |||
118 | case tagTypes.TARGETDURATION: | ||
119 | data.targetDuration = parseFloat(self.getTagValue(value).split(',')[0]); | ||
120 | break; | ||
121 | |||
122 | case tagTypes.ZEN_TOTAL_DURATION: | ||
123 | data.totalDuration = parseFloat(self.getTagValue(value)); | ||
124 | break; | ||
125 | |||
126 | case tagTypes.VERSION: | ||
127 | data.version = parseFloat(self.getTagValue(value)); | ||
128 | break; | ||
129 | |||
130 | case tagTypes.MEDIA_SEQUENCE: | ||
131 | data.mediaSequence = parseInt(self.getTagValue(value)); | ||
132 | break; | ||
133 | |||
134 | case tagTypes.ALLOW_CACHE: | ||
135 | if (self.getTagValue(value) === "YES" || self.getTagValue(value) === "NO") { | ||
136 | data.allowCache = self.getTagValue(value); | ||
137 | } else { | ||
138 | data.invalidReasons.push("Invalid ALLOW_CACHE Value"); | ||
139 | } | ||
140 | break; | ||
141 | |||
142 | case tagTypes.ENDLIST: | ||
143 | data.hasEndTag = true; | ||
144 | break; | ||
145 | } | ||
146 | }); | ||
164 | 147 | ||
165 | return data; | 148 | return data; |
166 | |||
167 | }; | 149 | }; |
168 | }; | 150 | }; |
169 | |||
170 | })(this); | 151 | })(this); | ... | ... |
1 | (function(window) { | 1 | (function(window) { |
2 | window.videojs.hls.m3u8TagType = { | 2 | window.videojs.hls.m3u8TagType = { |
3 | /* | 3 | /* |
4 | * Derived from V8: http://tools.ietf.org/html/draft-pantos-http-live-streaming-08 | 4 | * Derived from the HTTP Live Streaming Spec V8 |
5 | * http://tools.ietf.org/html/draft-pantos-http-live-streaming-08 | ||
5 | */ | 6 | */ |
6 | 7 | ||
7 | /** | 8 | /** | ... | ... |
1 | (function (window) { | 1 | (function (window) { |
2 | var M3U8 = window.videojs.hls.M3U8; | 2 | var |
3 | var M3U8Parser = window.videojs.hls.M3U8Parser; | 3 | M3U8 = window.videojs.hls.M3U8, |
4 | M3U8Parser = window.videojs.hls.M3U8Parser; | ||
4 | 5 | ||
5 | window.videojs.hls.ManifestController = function () { | 6 | window.videojs.hls.ManifestController = function() { |
6 | var self = this; | 7 | var self = this; |
7 | 8 | ||
8 | self.parser; | 9 | self.parser; |
... | @@ -13,7 +14,7 @@ | ... | @@ -13,7 +14,7 @@ |
13 | self.onErrorCallback; | 14 | self.onErrorCallback; |
14 | self.onUpdateCallback; | 15 | self.onUpdateCallback; |
15 | 16 | ||
16 | self.loadManifest = function (manifestUrl, onDataCallback, onErrorCallback, onUpdateCallback) { | 17 | self.loadManifest = function(manifestUrl, onDataCallback, onErrorCallback, onUpdateCallback) { |
17 | self.url = manifestUrl; | 18 | self.url = manifestUrl; |
18 | 19 | ||
19 | if (onDataCallback) { | 20 | if (onDataCallback) { |
... | @@ -30,7 +31,7 @@ | ... | @@ -30,7 +31,7 @@ |
30 | vjs.get(manifestUrl, self.onManifestLoadComplete, self.onManifestLoadError); | 31 | vjs.get(manifestUrl, self.onManifestLoadComplete, self.onManifestLoadError); |
31 | }; | 32 | }; |
32 | 33 | ||
33 | self.parseManifest = function (dataAsString) { | 34 | self.parseManifest = function(dataAsString) { |
34 | self.parser = new M3U8Parser(); | 35 | self.parser = new M3U8Parser(); |
35 | self.parser.directory = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(self.url).slice(1)[1]; | 36 | self.parser.directory = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(self.url).slice(1)[1]; |
36 | self.data = self.parser.parse(dataAsString); | 37 | self.data = self.parser.parse(dataAsString); |
... | @@ -38,7 +39,7 @@ | ... | @@ -38,7 +39,7 @@ |
38 | return self.data; | 39 | return self.data; |
39 | }; | 40 | }; |
40 | 41 | ||
41 | self.onManifestLoadComplete = function (response) { | 42 | self.onManifestLoadComplete = function(response) { |
42 | var output = self.parseManifest(response); | 43 | var output = self.parseManifest(response); |
43 | 44 | ||
44 | if (self.onDataCallback != undefined) { | 45 | if (self.onDataCallback != undefined) { |
... | @@ -46,7 +47,7 @@ | ... | @@ -46,7 +47,7 @@ |
46 | } | 47 | } |
47 | }; | 48 | }; |
48 | 49 | ||
49 | self.onManifestLoadError = function (err) { | 50 | self.onManifestLoadError = function(err) { |
50 | if (self.onErrorCallback != undefined) { | 51 | if (self.onErrorCallback != undefined) { |
51 | self.onErrorCallback((err != undefined) ? err : null); | 52 | self.onErrorCallback((err != undefined) ? err : null); |
52 | } | 53 | } | ... | ... |
1 | (function(window) { | 1 | (function(window) { |
2 | 2 | ||
3 | window.videojs.hls.SegmentController = function(){ | 3 | window.videojs.hls.SegmentController = function() { |
4 | |||
5 | var self = this; | 4 | var self = this; |
6 | 5 | ||
7 | self.url; | 6 | self.loadSegment = function(segmentUrl, onDataCallback, onErrorCallback, onUpdateCallback) { |
8 | 7 | var request = new XMLHttpRequest(); | |
9 | self.requestTimestamp; | ||
10 | self.responseTimestamp; | ||
11 | self.data; | ||
12 | |||
13 | self.onDataCallback; | ||
14 | self.onErrorCallback; | ||
15 | self.onUpdateCallback; | ||
16 | 8 | ||
17 | self.loadSegment = function ( segmentUrl, onDataCallback, onErrorCallback, onUpdateCallback ) { | ||
18 | self.url = segmentUrl; | 9 | self.url = segmentUrl; |
19 | self.onDataCallback = onDataCallback; | 10 | self.onDataCallback = onDataCallback; |
20 | self.onErrorCallback = onErrorCallback; | 11 | self.onErrorCallback = onErrorCallback; |
21 | self.onUpdateCallback = onUpdateCallback; | 12 | self.onUpdateCallback = onUpdateCallback; |
22 | self.requestTimestamp = new Date().getTime(); | 13 | self.requestTimestamp = +new Date(); |
23 | 14 | ||
24 | var req = new XMLHttpRequest(); | 15 | request.open('GET', segmentUrl, true); |
25 | req.open('GET', segmentUrl, true); | 16 | request.responseType = 'arraybuffer'; |
26 | req.responseType = 'arraybuffer'; | 17 | request.onload = function(response) { |
27 | req.onload = function(response) { | 18 | self.onSegmentLoadComplete(new Uint8Array(request.response)); |
28 | self.onSegmentLoadComplete(new Uint8Array(req.response)); | ||
29 | }; | 19 | }; |
30 | 20 | ||
31 | req.send(null); | 21 | request.send(null); |
32 | |||
33 | //vjs.get(segmentUrl, self.onSegmentLoadComplete, self.onSegmentLoadError); | ||
34 | }; | 22 | }; |
35 | 23 | ||
36 | self.parseSegment = function ( incomingData ) { | 24 | self.parseSegment = function(incomingData) { |
37 | // Add David's code later // | ||
38 | console.log('got segment data', incomingData.byteLength); | ||
39 | |||
40 | self.data = {}; | 25 | self.data = {}; |
41 | self.data.binaryData = incomingData; | 26 | self.data.binaryData = incomingData; |
42 | self.data.url = self.url; | 27 | self.data.url = self.url; |
... | @@ -44,36 +29,35 @@ | ... | @@ -44,36 +29,35 @@ |
44 | self.data.requestTimestamp = self.requestTimestamp; | 29 | self.data.requestTimestamp = self.requestTimestamp; |
45 | self.data.responseTimestamp = self.responseTimestamp; | 30 | self.data.responseTimestamp = self.responseTimestamp; |
46 | self.data.byteLength = incomingData.byteLength; | 31 | self.data.byteLength = incomingData.byteLength; |
47 | self.data.isCached = ( parseInt(self.responseTimestamp - self.requestTimestamp) < 75 ); | 32 | self.data.isCached = parseInt(self.responseTimestamp - self.requestTimestamp) < 75; |
48 | self.data.throughput = self.calculateThroughput(self.data.byteLength, self.requestTimestamp ,self.responseTimestamp); | 33 | self.data.throughput = self.calculateThroughput(self.data.byteLength, self.requestTimestamp ,self.responseTimestamp); |
49 | 34 | ||
50 | return self.data; | 35 | return self.data; |
51 | }; | 36 | }; |
52 | 37 | ||
53 | self.calculateThroughput = function(dataAmount, startTime, endTime) { | 38 | self.calculateThroughput = function(dataAmount, startTime, endTime) { |
54 | return Math.round(dataAmount/(endTime-startTime)*1000)*8; | 39 | return Math.round(dataAmount / (endTime - startTime) * 1000) * 8; |
55 | } | 40 | } |
56 | 41 | ||
57 | self.onSegmentLoadComplete = function(response) { | 42 | self.onSegmentLoadComplete = function(response) { |
58 | self.responseTimestamp = new Date().getTime(); | 43 | var output; |
44 | |||
45 | self.responseTimestamp = +new Date(); | ||
59 | 46 | ||
60 | var output = self.parseSegment(response); | 47 | output = self.parseSegment(response); |
61 | 48 | ||
62 | if(self.onDataCallback != undefined) | 49 | if (self.onDataCallback !== undefined) { |
63 | { | ||
64 | self.onDataCallback(output); | 50 | self.onDataCallback(output); |
65 | } | 51 | } |
66 | }; | 52 | }; |
67 | 53 | ||
68 | self.onSegmentLoadError = function(err) { | 54 | self.onSegmentLoadError = function(error) { |
69 | if(err) | 55 | if (error) { |
70 | { | 56 | console.log(error.message); |
71 | console.log(err.message); | ||
72 | } | 57 | } |
73 | 58 | ||
74 | if(self.onErrorCallback != undefined) | 59 | if (self.onErrorCallback !== undefined) { |
75 | { | 60 | onErrorCallback(error); |
76 | onErrorCallback((err != undefined) ? err : null); | ||
77 | } | 61 | } |
78 | }; | 62 | }; |
79 | } | 63 | } | ... | ... |
... | @@ -249,14 +249,12 @@ | ... | @@ -249,14 +249,12 @@ |
249 | 249 | ||
250 | test('should create my parser', function () { | 250 | test('should create my parser', function () { |
251 | ok(m3u8parser != undefined); | 251 | ok(m3u8parser != undefined); |
252 | } | 252 | }); |
253 | ); | ||
254 | 253 | ||
255 | test('should successfully parse manifest data', function () { | 254 | test('should successfully parse manifest data', function () { |
256 | var parsedData = m3u8parser.parse(window.playlistData); | 255 | var parsedData = m3u8parser.parse(window.playlistData); |
257 | ok(parsedData); | 256 | ok(parsedData); |
258 | } | 257 | }); |
259 | ); | ||
260 | 258 | ||
261 | test('test for expected results', function () { | 259 | test('test for expected results', function () { |
262 | var data = m3u8parser.parse(window.playlistData); | 260 | var data = m3u8parser.parse(window.playlistData); |
... | @@ -272,8 +270,7 @@ | ... | @@ -272,8 +270,7 @@ |
272 | equal(data.mediaSequence, 0, 'MEDIA SEQUENCE is correct'); | 270 | equal(data.mediaSequence, 0, 'MEDIA SEQUENCE is correct'); |
273 | equal(data.totalDuration, -1, "ZEN TOTAL DURATION is unknown as expected"); | 271 | equal(data.totalDuration, -1, "ZEN TOTAL DURATION is unknown as expected"); |
274 | equal(data.hasEndTag, true, 'should have ENDLIST tag'); | 272 | equal(data.hasEndTag, true, 'should have ENDLIST tag'); |
275 | } | 273 | }); |
276 | ); | ||
277 | 274 | ||
278 | module('brightcove playlist', { | 275 | module('brightcove playlist', { |
279 | setup: function () { | 276 | setup: function () { |
... | @@ -299,7 +296,6 @@ | ... | @@ -299,7 +296,6 @@ |
299 | manifestController = new window.videojs.hls.ManifestController(); | 296 | manifestController = new window.videojs.hls.ManifestController(); |
300 | this.vjsget = vjs.get; | 297 | this.vjsget = vjs.get; |
301 | vjs.get = function (url, success, error) { | 298 | vjs.get = function (url, success, error) { |
302 | console.log(url); | ||
303 | success(window.brightcove_playlist_data); | 299 | success(window.brightcove_playlist_data); |
304 | }; | 300 | }; |
305 | }, | 301 | }, |
... | @@ -316,29 +312,22 @@ | ... | @@ -316,29 +312,22 @@ |
316 | var data = manifestController.parseManifest(window.brightcove_playlist_data); | 312 | var data = manifestController.parseManifest(window.brightcove_playlist_data); |
317 | 313 | ||
318 | ok(data); | 314 | ok(data); |
319 | |||
320 | equal(data.playlistItems.length, 4, 'Has correct rendition count'); | 315 | equal(data.playlistItems.length, 4, 'Has correct rendition count'); |
321 | equal(data.playlistItems[0].bandwidth, 240000, 'First rendition index bandwidth is correct'); | 316 | equal(data.playlistItems[0].bandwidth, 240000, 'First rendition index bandwidth is correct'); |
322 | equal(data.playlistItems[0]["program-id"], 1, 'First rendition index program-id is correct'); | 317 | equal(data.playlistItems[0]["program-id"], 1, 'First rendition index program-id is correct'); |
323 | equal(data.playlistItems[0].resolution.width, 396, 'First rendition index resolution width is correct'); | 318 | equal(data.playlistItems[0].resolution.width, 396, 'First rendition index resolution width is correct'); |
324 | equal(data.playlistItems[0].resolution.height, 224, 'First rendition index resolution height is correct'); | 319 | equal(data.playlistItems[0].resolution.height, 224, 'First rendition index resolution height is correct'); |
325 | }) | 320 | }); |
326 | 321 | ||
327 | test('should get a manifest from hermes', function () { | 322 | test('should get a manifest from hermes', function () { |
328 | var hermesUrl = "http://localhost:7070/test/basic-playback/brightcove/16x9-master.m3u8"; | 323 | manifestController.loadManifest('http://example.com/16x9-master.m3u8', |
329 | 324 | function(responseData) { | |
330 | manifestController.loadManifest( | 325 | ok(responseData); |
331 | hermesUrl, | 326 | }, |
332 | function (responseData) { | 327 | function(errorData) { |
333 | ok(true); | 328 | ok(false, 'does not error'); |
334 | }, | 329 | }, |
335 | function (errorData) { | 330 | function(updateData) {}); |
336 | console.log('got error data'); | ||
337 | }, | ||
338 | function (updateData) { | ||
339 | console.log('got update data'); | ||
340 | } | ||
341 | ) | ||
342 | }); | 331 | }); |
343 | 332 | ||
344 | module('segment controller', { | 333 | module('segment controller', { |
... | @@ -355,33 +344,11 @@ | ... | @@ -355,33 +344,11 @@ |
355 | } | 344 | } |
356 | }); | 345 | }); |
357 | 346 | ||
358 | test('should get a segment data', function () { | ||
359 | ok(true); | ||
360 | var hermesUrl = "http://localhost:7070/test/ts-files/brightcove/s-1.ts"; | ||
361 | |||
362 | segmentController.loadSegment( | ||
363 | hermesUrl, | ||
364 | function (responseData) { | ||
365 | console.log('got response from segment controller'); | ||
366 | ok(true); | ||
367 | |||
368 | }, | ||
369 | function (errorData) { | ||
370 | console.log('got error data'); | ||
371 | }, | ||
372 | function (updateData) { | ||
373 | console.log('got update data'); | ||
374 | } | ||
375 | ) | ||
376 | } | ||
377 | ) | ||
378 | |||
379 | test('bandwidth calulation test', function () { | 347 | test('bandwidth calulation test', function () { |
380 | var multiSecondData = segmentController.calculateThroughput(10000, 1000, 2000); | 348 | var |
381 | var subSecondData = segmentController.calculateThroughput(10000, 1000, 1500); | 349 | multiSecondData = segmentController.calculateThroughput(10000, 1000, 2000), |
350 | subSecondData = segmentController.calculateThroughput(10000, 1000, 1500); | ||
382 | equal(multiSecondData, 80000, 'MULTI-Second bits per second calculation'); | 351 | equal(multiSecondData, 80000, 'MULTI-Second bits per second calculation'); |
383 | equal(subSecondData, 160000, 'SUB-Second bits per second calculation'); | 352 | equal(subSecondData, 160000, 'SUB-Second bits per second calculation'); |
384 | 353 | }); | |
385 | }) | ||
386 | |||
387 | })(this); | 354 | })(this); | ... | ... |
-
Please register or sign in to post a comment