gyorgy@0
|
1
|
gyorgy@0
|
2 /*
|
gyorgy@0
|
3 extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
|
gyorgy@0
|
4 */
|
gyorgy@0
|
5 mejs.HtmlMediaElement = {
|
gyorgy@0
|
6 pluginType: 'native',
|
gyorgy@0
|
7 isFullScreen: false,
|
gyorgy@0
|
8
|
gyorgy@0
|
9 setCurrentTime: function (time) {
|
gyorgy@0
|
10 this.currentTime = time;
|
gyorgy@0
|
11 },
|
gyorgy@0
|
12
|
gyorgy@0
|
13 setMuted: function (muted) {
|
gyorgy@0
|
14 this.muted = muted;
|
gyorgy@0
|
15 },
|
gyorgy@0
|
16
|
gyorgy@0
|
17 setVolume: function (volume) {
|
gyorgy@0
|
18 this.volume = volume;
|
gyorgy@0
|
19 },
|
gyorgy@0
|
20
|
gyorgy@0
|
21 // for parity with the plugin versions
|
gyorgy@0
|
22 stop: function () {
|
gyorgy@0
|
23 this.pause();
|
gyorgy@0
|
24 },
|
gyorgy@0
|
25
|
gyorgy@0
|
26 // This can be a url string
|
gyorgy@0
|
27 // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
|
gyorgy@0
|
28 setSrc: function (url) {
|
gyorgy@0
|
29 if (typeof url == 'string') {
|
gyorgy@0
|
30 this.src = url;
|
gyorgy@0
|
31 } else {
|
gyorgy@0
|
32 var i, media;
|
gyorgy@0
|
33
|
gyorgy@0
|
34 for (i=0; i<url.length; i++) {
|
gyorgy@0
|
35 media = url[i];
|
gyorgy@0
|
36 if (this.canPlayType(media.type)) {
|
gyorgy@0
|
37 this.src = media.src;
|
gyorgy@0
|
38 }
|
gyorgy@0
|
39 }
|
gyorgy@0
|
40 }
|
gyorgy@0
|
41 },
|
gyorgy@0
|
42
|
gyorgy@0
|
43 setVideoSize: function (width, height) {
|
gyorgy@0
|
44 this.width = width;
|
gyorgy@0
|
45 this.height = height;
|
gyorgy@0
|
46 }
|
gyorgy@0
|
47 };
|
gyorgy@0
|
48
|
gyorgy@0
|
49 /*
|
gyorgy@0
|
50 Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember]
|
gyorgy@0
|
51 */
|
gyorgy@0
|
52 mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) {
|
gyorgy@0
|
53 this.id = pluginid;
|
gyorgy@0
|
54 this.pluginType = pluginType;
|
gyorgy@0
|
55 this.src = mediaUrl;
|
gyorgy@0
|
56 this.events = {};
|
gyorgy@0
|
57 };
|
gyorgy@0
|
58
|
gyorgy@0
|
59 // JavaScript values and ExternalInterface methods that match HTML5 video properties methods
|
gyorgy@0
|
60 // http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html
|
gyorgy@0
|
61 // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
|
gyorgy@0
|
62 mejs.PluginMediaElement.prototype = {
|
gyorgy@0
|
63
|
gyorgy@0
|
64 // special
|
gyorgy@0
|
65 pluginElement: null,
|
gyorgy@0
|
66 pluginType: '',
|
gyorgy@0
|
67 isFullScreen: false,
|
gyorgy@0
|
68
|
gyorgy@0
|
69 // not implemented :(
|
gyorgy@0
|
70 playbackRate: -1,
|
gyorgy@0
|
71 defaultPlaybackRate: -1,
|
gyorgy@0
|
72 seekable: [],
|
gyorgy@0
|
73 played: [],
|
gyorgy@0
|
74
|
gyorgy@0
|
75 // HTML5 read-only properties
|
gyorgy@0
|
76 paused: true,
|
gyorgy@0
|
77 ended: false,
|
gyorgy@0
|
78 seeking: false,
|
gyorgy@0
|
79 duration: 0,
|
gyorgy@0
|
80 error: null,
|
gyorgy@0
|
81
|
gyorgy@0
|
82 // HTML5 get/set properties, but only set (updated by event handlers)
|
gyorgy@0
|
83 muted: false,
|
gyorgy@0
|
84 volume: 1,
|
gyorgy@0
|
85 currentTime: 0,
|
gyorgy@0
|
86
|
gyorgy@0
|
87 // HTML5 methods
|
gyorgy@0
|
88 play: function () {
|
gyorgy@0
|
89 if (this.pluginApi != null) {
|
gyorgy@0
|
90 this.pluginApi.playMedia();
|
gyorgy@0
|
91 this.paused = false;
|
gyorgy@0
|
92 }
|
gyorgy@0
|
93 },
|
gyorgy@0
|
94 load: function () {
|
gyorgy@0
|
95 if (this.pluginApi != null) {
|
gyorgy@0
|
96 this.pluginApi.loadMedia();
|
gyorgy@0
|
97 this.paused = false;
|
gyorgy@0
|
98 }
|
gyorgy@0
|
99 },
|
gyorgy@0
|
100 pause: function () {
|
gyorgy@0
|
101 if (this.pluginApi != null) {
|
gyorgy@0
|
102 this.pluginApi.pauseMedia();
|
gyorgy@0
|
103 this.paused = true;
|
gyorgy@0
|
104 }
|
gyorgy@0
|
105 },
|
gyorgy@0
|
106 stop: function () {
|
gyorgy@0
|
107 if (this.pluginApi != null) {
|
gyorgy@0
|
108 this.pluginApi.stopMedia();
|
gyorgy@0
|
109 this.paused = true;
|
gyorgy@0
|
110 }
|
gyorgy@0
|
111 },
|
gyorgy@0
|
112 canPlayType: function(type) {
|
gyorgy@0
|
113 var i,
|
gyorgy@0
|
114 j,
|
gyorgy@0
|
115 pluginInfo,
|
gyorgy@0
|
116 pluginVersions = mejs.plugins[this.pluginType];
|
gyorgy@0
|
117
|
gyorgy@0
|
118 for (i=0; i<pluginVersions.length; i++) {
|
gyorgy@0
|
119 pluginInfo = pluginVersions[i];
|
gyorgy@0
|
120
|
gyorgy@0
|
121 // test if user has the correct plugin version
|
gyorgy@0
|
122 if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) {
|
gyorgy@0
|
123
|
gyorgy@0
|
124 // test for plugin playback types
|
gyorgy@0
|
125 for (j=0; j<pluginInfo.types.length; j++) {
|
gyorgy@0
|
126 // find plugin that can play the type
|
gyorgy@0
|
127 if (type == pluginInfo.types[j]) {
|
gyorgy@0
|
128 return true;
|
gyorgy@0
|
129 }
|
gyorgy@0
|
130 }
|
gyorgy@0
|
131 }
|
gyorgy@0
|
132 }
|
gyorgy@0
|
133
|
gyorgy@0
|
134 return false;
|
gyorgy@0
|
135 },
|
gyorgy@0
|
136
|
gyorgy@0
|
137 // custom methods since not all JavaScript implementations support get/set
|
gyorgy@0
|
138
|
gyorgy@0
|
139 // This can be a url string
|
gyorgy@0
|
140 // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
|
gyorgy@0
|
141 setSrc: function (url) {
|
gyorgy@0
|
142 if (typeof url == 'string') {
|
gyorgy@0
|
143 this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url));
|
gyorgy@0
|
144 this.src = mejs.Utility.absolutizeUrl(url);
|
gyorgy@0
|
145 } else {
|
gyorgy@0
|
146 var i, media;
|
gyorgy@0
|
147
|
gyorgy@0
|
148 for (i=0; i<url.length; i++) {
|
gyorgy@0
|
149 media = url[i];
|
gyorgy@0
|
150 if (this.canPlayType(media.type)) {
|
gyorgy@0
|
151 this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src));
|
gyorgy@0
|
152 this.src = mejs.Utility.absolutizeUrl(url);
|
gyorgy@0
|
153 }
|
gyorgy@0
|
154 }
|
gyorgy@0
|
155 }
|
gyorgy@0
|
156
|
gyorgy@0
|
157 },
|
gyorgy@0
|
158 setCurrentTime: function (time) {
|
gyorgy@0
|
159 if (this.pluginApi != null) {
|
gyorgy@0
|
160 this.pluginApi.setCurrentTime(time);
|
gyorgy@0
|
161 this.currentTime = time;
|
gyorgy@0
|
162 }
|
gyorgy@0
|
163 },
|
gyorgy@0
|
164 setVolume: function (volume) {
|
gyorgy@0
|
165 if (this.pluginApi != null) {
|
gyorgy@0
|
166 this.pluginApi.setVolume(volume);
|
gyorgy@0
|
167 this.volume = volume;
|
gyorgy@0
|
168 }
|
gyorgy@0
|
169 },
|
gyorgy@0
|
170 setMuted: function (muted) {
|
gyorgy@0
|
171 if (this.pluginApi != null) {
|
gyorgy@0
|
172 this.pluginApi.setMuted(muted);
|
gyorgy@0
|
173 this.muted = muted;
|
gyorgy@0
|
174 }
|
gyorgy@0
|
175 },
|
gyorgy@0
|
176
|
gyorgy@0
|
177 // additional non-HTML5 methods
|
gyorgy@0
|
178 setVideoSize: function (width, height) {
|
gyorgy@0
|
179 if ( this.pluginElement.style) {
|
gyorgy@0
|
180 this.pluginElement.style.width = width + 'px';
|
gyorgy@0
|
181 this.pluginElement.style.height = height + 'px';
|
gyorgy@0
|
182 }
|
gyorgy@0
|
183 if (this.pluginApi != null) {
|
gyorgy@0
|
184 this.pluginApi.setVideoSize(width, height);
|
gyorgy@0
|
185 }
|
gyorgy@0
|
186 },
|
gyorgy@0
|
187
|
gyorgy@0
|
188 setFullscreen: function (fullscreen) {
|
gyorgy@0
|
189 if (this.pluginApi != null) {
|
gyorgy@0
|
190 this.pluginApi.setFullscreen(fullscreen);
|
gyorgy@0
|
191 }
|
gyorgy@0
|
192 },
|
gyorgy@0
|
193
|
gyorgy@0
|
194 // start: fake events
|
gyorgy@0
|
195 addEventListener: function (eventName, callback, bubble) {
|
gyorgy@0
|
196 this.events[eventName] = this.events[eventName] || [];
|
gyorgy@0
|
197 this.events[eventName].push(callback);
|
gyorgy@0
|
198 },
|
gyorgy@0
|
199 removeEventListener: function (eventName, callback) {
|
gyorgy@0
|
200 if (!eventName) { this.events = {}; return true; }
|
gyorgy@0
|
201 var callbacks = this.events[eventName];
|
gyorgy@0
|
202 if (!callbacks) return true;
|
gyorgy@0
|
203 if (!callback) { this.events[eventName] = []; return true; }
|
gyorgy@0
|
204 for (i = 0; i < callbacks.length; i++) {
|
gyorgy@0
|
205 if (callbacks[i] === callback) {
|
gyorgy@0
|
206 this.events[eventName].splice(i, 1);
|
gyorgy@0
|
207 return true;
|
gyorgy@0
|
208 }
|
gyorgy@0
|
209 }
|
gyorgy@0
|
210 return false;
|
gyorgy@0
|
211 },
|
gyorgy@0
|
212 dispatchEvent: function (eventName) {
|
gyorgy@0
|
213 var i,
|
gyorgy@0
|
214 args,
|
gyorgy@0
|
215 callbacks = this.events[eventName];
|
gyorgy@0
|
216
|
gyorgy@0
|
217 if (callbacks) {
|
gyorgy@0
|
218 args = Array.prototype.slice.call(arguments, 1);
|
gyorgy@0
|
219 for (i = 0; i < callbacks.length; i++) {
|
gyorgy@0
|
220 callbacks[i].apply(null, args);
|
gyorgy@0
|
221 }
|
gyorgy@0
|
222 }
|
gyorgy@0
|
223 }
|
gyorgy@0
|
224 // end: fake events
|
gyorgy@0
|
225 };
|