annotate johndyer-mediaelement-13fa20a/src/js/me-mediaelements.js @ 25:4a4bd554b4c1 tip

Closing this sub branch.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Mon, 25 Mar 2013 14:02:54 +0000
parents 032bc65ebafc
children
rev   line source
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 };