| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017 | 
							- var AVProVideoWebGL =
 
- {
 
- 	/*isNumber: function (item) {
 
- 		return typeof(item) === "number" && !isNaN(item);
 
- 	},
 
- 	assert: function (equality, message) {
 
- 		if (!equality)
 
- 			console.log(message);
 
- 	},*/
 
- 	count: 0,
 
- 	players: [],
 
- 	isSafari: function() {
 
- 		return navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && navigator.userAgent.indexOf('CriOS') == -1 && navigator.userAgent.indexOf('FxiOS') == -1;
 
- 	},
 
- 	is_iOS: function() {
 
- 		return [
 
- 			'iPad Simulator',
 
- 			'iPhone Simulator',
 
- 			'iPod Simulator',
 
- 			'iPad',
 
- 			'iPhone',
 
- 			'iPod'
 
- 		].includes(navigator.platform)
 
- 		// iPad on iOS 13 detection
 
- 		|| (navigator.userAgent.includes("Mac") && "ontouchend" in document);
 
- 	},
 
- 	hasPlayer__deps: ["players"],
 
- 	hasPlayer: function (videoIndex)
 
- 	{
 
- 		if (videoIndex)
 
- 		{
 
- 			if (videoIndex == -1)
 
- 			{
 
- 				return false;
 
- 			}
 
- 			if (_players)
 
- 			{
 
- 				if (_players[videoIndex])
 
- 				{
 
- 					return true;
 
- 				}
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			if (_players)
 
- 			{
 
- 				if (_players.length > 0) 
 
- 				{
 
- 					return true;
 
- 				}
 
- 			}
 
- 		}
 
- 		return false;
 
- 	},
 
- 	AVPPlayerInsertVideoElement__deps: ["count", "players", "isSafari", "is_iOS"],
 
- 	AVPPlayerInsertVideoElement: function (path, idValues, externalLibrary)
 
- 	{
 
- 		if (!path) { return false; }
 
- 		// NOTE: When loading from the indexedDB (Application.persistentDataPath), 
 
- 		//       URL.createObjectURL() must be used get a valid URL.  See:
 
- 		//       http://www.misfitgeek.com/html5-off-line-storing-and-retrieving-videos-with-indexeddb/
 
- 		path = Pointer_stringify(path);
 
- 		_count++;
 
- 		var vid = document.createElement("video");
 
- 		var useNativeSrcPath = true;
 
- 		var hls = null;
 
- 		if (externalLibrary == 1)
 
- 		{
 
- 			useNativeSrcPath = false;
 
- 			var player = dashjs.MediaPlayer().create();
 
- 			player.initialize(vid, path, true);
 
- 		}
 
- 		else if (externalLibrary == 2 && !(_is_iOS() || _isSafari()))
 
- 		{
 
- 			useNativeSrcPath = false;
 
- 			hls = new Hls();
 
- 			hls.loadSource(path);
 
- 			hls.attachMedia(vid);
 
- 			hls.on(Hls.Events.MANIFEST_PARSED, function()
 
- 			{
 
- 				//video.play();
 
- 			});
 
- 		}
 
- 		else if (externalLibrary == 3)
 
- 		{
 
- 			//useNativeSrcPath = false;
 
- 		}
 
- 		// Some sources say that this is the proper way to catch errors...
 
- 		/*vid.addEventListener('error', function(event) {
 
- 			console.log("Error: " + event);
 
- 		}, true);*/
 
- 		var hasSetCanPlay = false;
 
- 		var playerIndex;
 
- 		var id = _count;
 
- 		
 
- 		var vidData = {
 
- 			id: id,
 
- 			video: vid,
 
- 			ready: false,
 
- 			hasMetadata: false,
 
- 			isStalled: false,
 
- 			buffering: false,
 
- 			lastErrorCode: 0,
 
- 			hlsjs: hls
 
- 		};
 
- 		_players.push(vidData);
 
- 		playerIndex = (_players.length > 0) ? _players.length - 1 : 0;
 
- 		/*const frameCounterCallback = function (timeNow, metadata) {
 
- 			console.log("got a frame! " + metadata.presentedFrames + " " +  metadata.presentationTime);
 
- 			vid.requestVideoFrameCallback(frameCounterCallback);
 
- 		};
 
- 		if (HTMLVideoElement.prototype.requestVideoFrameCallback)
 
- 		{
 
- 			console.log("has frame callback support");
 
- 			vid.requestVideoFrameCallback(frameCounterCallback);
 
- 		}*/
 
- 		vid.oncanplay = function()
 
- 		{
 
- 			if (!hasSetCanPlay) 
 
- 			{
 
- 				hasSetCanPlay = true;
 
- 				vidData.ready = true;
 
- 			}
 
- 		};
 
- 		vid.onloadedmetadata = function()
 
- 		{
 
- 			vidData.hasMetadata = true;
 
- 		};
 
- 		vid.oncanplaythrough = function()
 
- 		{
 
- 			vidData.buffering = false;
 
- 		};
 
- 		vid.onplaying = function()
 
- 		{
 
- 			vidData.buffering = false;
 
- 			vidData.isStalled = false;
 
- 			//console.log("PLAYING");
 
- 		};
 
- 		vid.onwaiting = function()
 
- 		{
 
- 			vidData.buffering = true;
 
- 			//console.log("WAITING");
 
- 		};
 
- 		vid.onstalled = function()
 
- 		{
 
- 			vidData.isStalled = true;
 
- 			//console.log("STALLED");
 
- 		}
 
- 		/*vid.onpause = function() {
 
- 		};*/
 
- 		vid.onended = function()
 
- 		{
 
- 			vidData.buffering = false;
 
- 			vidData.isStalled = false;
 
- 			//console.log("ENDED");
 
- 		};
 
- 		vid.ontimeupdate = function()
 
- 		{
 
- 			vidData.buffering = false;
 
- 			vidData.isStalled = false;
 
- 			//console.log("vid current time: ", this.currentTime);
 
- 		};
 
- 		vid.onerror = function(texture)
 
- 		{
 
- 			var err = "unknown error";
 
- 			switch (vid.error.code) {
 
- 				case 1:
 
- 					err = "video loading aborted";
 
- 					break;
 
- 				case 2:
 
- 					err = "network loading error";
 
- 					break;
 
- 				case 3:
 
- 					err = "video decoding failed / corrupted data or unsupported codec";
 
- 					break;
 
- 				case 4:
 
- 					err = "video not supported";
 
- 					break;
 
- 			}
 
- 			vidData.lastErrorCode = vid.error.code;
 
- 			console.log("Error: " + err + " (errorcode=" + vid.error.code + ")", "color:red;");
 
- 		};
 
- 		vid.crossOrigin = "anonymous";
 
- 		vid.preload = 'auto';
 
- 		vid.autoplay = false;
 
- 		if (_is_iOS())
 
- 		{
 
- 			vid.autoplay = true;
 
- 			vid.playsInline = true;
 
- 		}
 
- 		if (useNativeSrcPath)
 
- 		{
 
- 			vid.src = path;
 
- 		}
 
- 		HEAP32[(idValues>>2)] = playerIndex;
 
- 		HEAP32[(idValues>>2)+1] = id;
 
- 		return true;
 
- 	},
 
- 	AVPPlayerGetLastError__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetLastError: function(playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		var ret = _players[playerIndex].lastErrorCode
 
- 		_players[playerIndex].lastErrorCode = 0;
 
- 		return ret;
 
- 	},
 
- 	
 
- 	AVPPlayerCreateVideoTexture__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerCreateVideoTexture: function (textureId)
 
- 	{
 
- 		const texture = GLctx.createTexture();
 
- 		GL.textures[textureId] = texture;
 
- 		//console.log("creating textureId " +textureId + " : " + GL.textures[textureId]);
 
- 		GLctx.bindTexture(GLctx.TEXTURE_2D, texture);
 
- 	},
 
- 	AVPPlayerDestroyVideoTexture__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerDestroyVideoTexture: function (textureId)
 
- 	{
 
- 		GLctx.deleteTexture(GL.textures[textureId]);
 
- 	},
 
- 	AVPPlayerFetchVideoTexture__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerFetchVideoTexture: function (playerIndex, textureId, init)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		//console.log("updating textureId " +textureId + " : " + GL.textures[textureId]);
 
- 		GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[textureId]);
 
- 		//GLctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
 
- 		if (!init)
 
- 		{
 
- 			//GLctx.texImage2D(GLctx.TEXTURE_2D, 0, GLctx.RGBA, GLctx.RGBA, GLctx.UNSIGNED_BYTE, _players[playerIndex].video);
 
- 			GLctx.texSubImage2D(GLctx.TEXTURE_2D, 0, 0, 0, GLctx.RGBA, GLctx.UNSIGNED_BYTE, _players[playerIndex].video);
 
- 		}
 
- 		else
 
- 		{
 
- 			GLctx.texImage2D(GLctx.TEXTURE_2D, 0, GLctx.RGBA, GLctx.RGBA, GLctx.UNSIGNED_BYTE, _players[playerIndex].video);
 
- 		}
 
- 		
 
- 		//NB: This line causes the texture to not show unless something else is rendered (not sure why)
 
- 		//GLctx.bindTexture(GLctx.TEXTURE_2D, null);
 
- 		GLctx.texParameteri(GLctx.TEXTURE_2D, GLctx.TEXTURE_WRAP_S, GLctx.CLAMP_TO_EDGE);
 
- 		GLctx.texParameteri(GLctx.TEXTURE_2D, GLctx.TEXTURE_WRAP_T, GLctx.CLAMP_TO_EDGE);
 
- 		GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, false);
 
- 	},
 
- 	AVPPlayerUpdatePlayerIndex__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerUpdatePlayerIndex: function (id)
 
- 	{
 
- 		var result = -1;
 
- 		if (!_hasPlayer()) { return result;	}
 
- 		_players.forEach(function (currentVid, index)
 
- 		{
 
- 			if (currentVid != null && currentVid.id == id)
 
- 			{
 
- 				result = index;
 
- 			}
 
- 		});
 
- 		return result;
 
- 	},
 
- 	AVPPlayerWidth__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerWidth: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		return _players[playerIndex].video.videoWidth;
 
- 	},
 
- 	AVPPlayerHeight__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerHeight: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		return _players[playerIndex].video.videoHeight;
 
- 	},
 
- 	AVPPlayerReady__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerReady: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		if (_players)
 
- 		{
 
- 			if (_players.length > 0)
 
- 			{
 
- 				if (_players[playerIndex])
 
- 				{
 
- 					return _players[playerIndex].ready;
 
- 				}
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			return false;
 
- 		}
 
- 		//return _players[playerIndex].video.readyState >= _players[playerIndex].video.HAVE_CURRENT_DATA;
 
- 	},
 
- 	AVPPlayerClose__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerClose: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		var vid = _players[playerIndex].video;
 
- 		// Setting 'src' to an empty string results in the onerror handler being invoked and producing log noise on Chrome.
 
- 		// Removing the src attribute and invoking load is a recommended best practice in the HTML Standard.
 
- 		// See https://html.spec.whatwg.org/multipage/media.html#best-practices-for-authors-using-media-elements
 
- 		vid.pause();
 
- 		vid.removeAttribute("src"); // Previous: vid.src = "";
 
- 		vid.load();
 
- 		if (_players[playerIndex].hlsjs != null)
 
- 		{
 
- 			_players[playerIndex].hlsjs.destroy();
 
- 			_players[playerIndex].hlsjs = null;
 
- 		}
 
- 		_players[playerIndex].video = null;
 
- 		_players[playerIndex] = null;
 
- 		var allEmpty = true;
 
- 		for (i = 0; i < _players.length; i++) {
 
- 			if (_players[i] != null) {
 
- 				allEmpty = false;
 
- 				break;
 
- 			}
 
- 		}
 
- 		if (allEmpty)
 
- 		{
 
- 			_players = [];
 
- 		}
 
- 		//_players = _players.splice(playerIndex, 1);
 
- 		// Remove from DOM
 
- 		//vid.parentNode.removeChild(vid);
 
- 	},
 
- 	AVPPlayerSetLooping__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSetLooping: function (playerIndex, loop)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return; }
 
- 		_players[playerIndex].video.loop = loop;
 
- 	},
 
- 	AVPPlayerIsLooping__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsLooping: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].video.loop;
 
- 	},
 
- 	AVPPlayerHasMetadata__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerHasMetadata: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return (_players[playerIndex].video.readyState >= 1);
 
- 	},
 
- 	AVPPlayerIsPlaying__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsPlaying: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var video = _players[playerIndex].video;
 
- 		return (!video.paused && !video.ended);// || video.seeking || video.readyState < video.HAVE_FUTURE_DATA);
 
- 	},
 
- 	AVPPlayerIsSeeking__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsSeeking: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].video.seeking;
 
- 	},
 
- 	AVPPlayerIsPaused__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsPaused: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		return _players[playerIndex].video.paused;
 
- 	},
 
- 	AVPPlayerIsFinished__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsFinished: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].video.ended;
 
- 	},
 
- 	AVPPlayerIsBuffering__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsBuffering: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		return _players[playerIndex].buffering;
 
- 	},
 
- 	AVPPlayerIsPlaybackStalled__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsPlaybackStalled: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].isStalled;
 
- 	},
 
- 	AVPPlayerPlay__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerPlay: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		// https://webkit.org/blog/7734/auto-play-policy-changes-for-macos/
 
- 		// https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
 
- 		var playPromise = _players[playerIndex].video.play();
 
- 		if (playPromise !== undefined)
 
- 		{
 
- 			playPromise.then(function()
 
- 			{
 
- 				// Automatic playback started!
 
- 				// Show playing UI.
 
- 			})
 
- 			.catch(function(error) 
 
- 			{
 
- 				// Auto-play was prevented
 
- 				// Show paused UI.
 
- 				return false;
 
- 			});
 
- 		}
 
- 		return true;
 
- 	},
 
- 	AVPPlayerPause__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerPause: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		_players[playerIndex].video.pause();
 
- 	},
 
- 	AVPPlayerSeekToTime__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSeekToTime: function (playerIndex, timeSec, fast)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		var vid = _players[playerIndex].video;
 
- 		if (vid.seekable && vid.seekable.length > 0)
 
- 		{
 
- 			var timeNorm = 0.0;
 
- 			if (vid.duration > 0.0)
 
- 			{
 
- 				timeNorm = timeSec / vid.duration;
 
- 			}
 
- 			for (i = 0; i < vid.seekable.length; i++)
 
- 			{
 
- 				if (timeNorm >= vid.seekable.start(i) && timeNorm <= vid.seekable.end(i)) 
 
- 				{
 
- 					if (fast && vid.fastSeek)
 
- 					{
 
- 						vid.fastSeek(timeNorm);
 
- 					}
 
- 					else
 
- 					{
 
- 						vid.currentTime = timeSec;
 
- 					}
 
- 					return;
 
- 				}
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			if (timeSec == 0.0) 
 
- 			{
 
- 				vid.load();
 
- 			}
 
- 			else
 
- 			{
 
- 				vid.currentTime = timeSec;
 
- 			}
 
- 		}
 
- 	},
 
- 	AVPPlayerGetCurrentTime__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetCurrentTime: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return 0.0;	}
 
- 		return _players[playerIndex].video.currentTime;
 
- 	},
 
- 	AVPPlayerGetDuration__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetDuration: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return 0.0;	}
 
- 		return _players[playerIndex].video.duration;
 
- 	},
 
- 	AVPPlayerGetPlaybackRate__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetPlaybackRate: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return 0.0;	}
 
- 		return _players[playerIndex].video.playbackRate;
 
- 	},
 
- 	AVPPlayerSetPlaybackRate__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSetPlaybackRate: function (playerIndex, rate)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		_players[playerIndex].video.playbackRate = rate;
 
- 	},
 
- 	AVPPlayerSetMuted__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSetMuted: function (playerIndex, mute)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return;	}
 
- 		_players[playerIndex].video.muted = mute;
 
- 	},
 
- 	AVPPlayerIsMuted__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerIsMuted: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].video.muted;
 
- 	},
 
- 	AVPPlayerSetVolume__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSetVolume: function (playerIndex, volume)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return;	}
 
- 		_players[playerIndex].video.volume = volume;
 
- 	},
 
- 	AVPPlayerGetVolume__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetVolume: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return 0.0;	}
 
- 		return _players[playerIndex].video.volume;
 
- 	},
 
- 	AVPPlayerHasVideo__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerHasVideo: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var isChrome = !!window.chrome && !!window.chrome.webstore;
 
- 		if (isChrome)
 
- 		{
 
- 			return Boolean(_players[playerIndex].video.webkitVideoDecodedByteCount > 0);
 
- 		}
 
- 		
 
- 		if (_players[playerIndex].video.videoTracks)
 
- 		{
 
- 			return Boolean(_players[playerIndex].video.videoTracks.length > 0);
 
- 		}
 
- 		
 
- 		return true;
 
- 	},
 
- 	AVPPlayerHasAudio__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerHasAudio: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		return _players[playerIndex].video.mozHasAudio || Boolean(_players[playerIndex].video.webkitAudioDecodedByteCount) ||
 
- 				Boolean(_players[playerIndex].video.audioTracks && _players[playerIndex].video.audioTracks.length);
 
- 	},
 
- 	AVPPlayerGetDecodedFrameCount__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetDecodedFrameCount: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		var vid = _players[playerIndex].video;
 
- 		if (vid.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA) { return 0; }
 
- 		var frameCount = 0;
 
- 		if (vid.mozPresentedFrames)
 
- 		{
 
- 			frameCount = vid.mozPresentedFrames;
 
- 		}
 
- 		else if (vid.mozDecodedFrames)
 
- 		{
 
- 			frameCount = vid.mozDecodedFrames;
 
- 		}
 
- 		else if (vid.webkitDecodedFrameCount)
 
- 		{
 
- 			frameCount = vid.webkitDecodedFrameCount;
 
- 		}
 
- 		/*var q = vid.getVideoPlaybackQuality();
 
- 		if (q)
 
- 		{
 
- 			console.log("frames: " + q.totalVideoFrames + " " + q.droppedVideoFrames);
 
- 		}*/
 
- 		return frameCount;
 
- 	},
 
- 	AVPPlayerSupportedDecodedFrameCount__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSupportedDecodedFrameCount: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) {	return false; }
 
- 		var vid = _players[playerIndex].video;
 
- 		if (vid.mozPresentedFrames)
 
- 		{
 
- 			return true;
 
- 		}		
 
- 		else if (vid.mozDecodedFrames)
 
- 		{
 
- 			return true;
 
- 		}
 
- 		else if (vid.webkitDecodedFrameCount)
 
- 		{
 
- 			return true;
 
- 		}
 
- 		return false;
 
- 	},
 
- 	AVPPlayerGetNumBufferedTimeRanges__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetNumBufferedTimeRanges: function(playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		if (_players[playerIndex].video.buffered)
 
- 		{
 
- 			return _players[playerIndex].video.buffered.length;
 
- 		}
 
- 		return 0;
 
- 	},
 
- 	AVPPlayerGetTimeRangeStart__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetTimeRangeStart: function(playerIndex, rangeIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0.0;	}
 
- 		if (_players[playerIndex].video.buffered)
 
- 		{
 
- 			if(rangeIndex >= _players[playerIndex].video.buffered.length)
 
- 			{
 
- 				return 0.0;
 
- 			}
 
- 			return _players[playerIndex].video.buffered.start(rangeIndex);
 
- 		}
 
- 		return 0.0;
 
- 	},
 
- 	AVPPlayerGetTimeRangeEnd__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetTimeRangeEnd: function(playerIndex, rangeIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0.0;	}
 
- 		if (_players[playerIndex].video.buffered)
 
- 		{
 
- 			if(rangeIndex >= _players[playerIndex].video.buffered.length)
 
- 			{
 
- 				return 0.0;
 
- 			}
 
- 			return _players[playerIndex].video.buffered.end(rangeIndex);
 
- 		}
 
- 		return 0.0;
 
- 	},
 
- 	AVPPlayerGetVideoTrackCount__deps: ["players", "hasPlayer", "AVPPlayerHasVideo"],
 
- 	AVPPlayerGetVideoTrackCount: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		var result = 0;
 
- 		var tracks = _players[playerIndex].video.videoTracks;
 
- 		if (tracks)
 
- 		{
 
- 			result = tracks.length;
 
- 		}
 
- 		else
 
- 		{
 
- 			if (_AVPPlayerHasVideo(playerIndex))
 
- 			{
 
- 				result = 1;
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetAudioTrackCount__deps: ["players", "hasPlayer", "AVPPlayerHasAudio"],
 
- 	AVPPlayerGetAudioTrackCount: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		var result = 0;
 
- 		var tracks = _players[playerIndex].video.audioTracks;
 
- 		if (tracks)
 
- 		{
 
- 			result = tracks.length;
 
- 		}
 
- 		else
 
- 		{
 
- 			if (_AVPPlayerHasAudio(playerIndex))
 
- 			{
 
- 				result = 1;
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetTextTrackCount__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerGetTextTrackCount: function (playerIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return 0; }
 
- 		var result = 0;
 
- 		var tracks = _players[playerIndex].video.textTracks;
 
- 		if (tracks)
 
- 		{
 
- 			result = tracks.length;
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerSetActiveVideoTrack__deps: ["players", "hasPlayer"],
 
- 	AVPPlayerSetActiveVideoTrack: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		if (_players[playerIndex].video.videoTracks)
 
- 		{
 
- 			var tracks = _players[playerIndex].video.videoTracks;
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				tracks[trackIndex].selected = true;
 
- 				result = true;
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerSetActiveAudioTrack: ["players", "hasPlayer"],
 
- 	AVPPlayerSetActiveAudioTrack: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		if (_players[playerIndex].video.audioTracks)
 
- 		{
 
- 			var tracks = _players[playerIndex].video.audioTracks;
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				for (i = 0; i < tracks.length; i++)
 
- 				{
 
- 					tracks[i].enabled = (i === trackIndex);
 
- 				}
 
- 				result = true;
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerSetActiveTextTrack: ["players", "hasPlayer"],
 
- 	AVPPlayerSetActiveTextTrack: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		if (_players[playerIndex].video.textTracks)
 
- 		{
 
- 			var tracks = _players[playerIndex].video.textTracks;
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				for (i = 0; i < tracks.length; i++)
 
- 				{
 
- 					tracks[i].mode = (i === trackIndex)?"showing":"disabled";
 
- 				}
 
- 				result = true;
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerStringToBuffer: [],
 
- 	AVPPlayerStringToBuffer: function (text)
 
- 	{
 
- 		// Get size of the string
 
- 		var bufferSize = lengthBytesUTF8(text) + 1;
 
- 		// Allocate memory space
 
- 		var buffer = _malloc(bufferSize);
 
- 		// Copy old data to the new one then return it
 
- 		stringToUTF8(text, buffer, bufferSize);
 
- 		return buffer;
 
- 	},
 
- 	AVPPlayerGetVideoTrackName: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetVideoTrackName: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.videoTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].label);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetAudioTrackName: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetAudioTrackName: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.audioTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].label);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetTextTrackName: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetTextTrackName: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.textTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].label);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetVideoTrackLanguage: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetVideoTrackLanguage: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.videoTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].language);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetAudioTrackLanguage: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetAudioTrackLanguage: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.audioTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].language);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerGetTextTrackLanguage: ["players", "hasPlayer", "AVPPlayerStringToBuffer"],
 
- 	AVPPlayerGetTextTrackLanguage: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = null;
 
- 		var tracks = _players[playerIndex].video.textTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = _AVPPlayerStringToBuffer(tracks[trackIndex].language);
 
- 			}
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerIsVideoTrackActive: ["players", "hasPlayer", "AVPPlayerHasVideo"],
 
- 	AVPPlayerIsVideoTrackActive: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		var tracks = _players[playerIndex].video.videoTracks;
 
- 		if (tracks)
 
- 		{
 
- 			result = (tracks.selectedIndex === trackIndex);
 
- 		}
 
- 		else
 
- 		{
 
- 			result = _AVPPlayerHasVideo(playerIndex);
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerIsAudioTrackActive: ["players", "hasPlayer", "AVPPlayerHasAudio"],
 
- 	AVPPlayerIsAudioTrackActive: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		var tracks = _players[playerIndex].video.audioTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = tracks[trackIndex].enabled;
 
- 			}
 
- 		}
 
- 		else
 
- 		{
 
- 			result = _AVPPlayerHasAudio(playerIndex);
 
- 		}
 
- 		return result;
 
- 	},
 
- 	AVPPlayerIsTextTrackActive: ["players", "hasPlayer"],
 
- 	AVPPlayerIsTextTrackActive: function (playerIndex, trackIndex)
 
- 	{
 
- 		if (!_hasPlayer(playerIndex)) { return false; }
 
- 		var result = false;
 
- 		var tracks = _players[playerIndex].video.textTracks;
 
- 		if (tracks)
 
- 		{
 
- 			if (trackIndex >=0 && trackIndex < tracks.length)
 
- 			{
 
- 				result = (tracks[trackIndex].mode === "showing");
 
- 			}
 
- 		}
 
- 		return result;
 
- 	}
 
- };
 
- autoAddDeps(AVProVideoWebGL, 'count');
 
- autoAddDeps(AVProVideoWebGL, 'players');
 
- autoAddDeps(AVProVideoWebGL, 'hasPlayer');
 
- autoAddDeps(AVProVideoWebGL, 'AVPPlayerHasVideo');
 
- autoAddDeps(AVProVideoWebGL, 'AVPPlayerHasAudio');
 
- autoAddDeps(AVProVideoWebGL, 'AVPPlayerStringToBuffer');
 
- mergeInto(LibraryManager.library, AVProVideoWebGL);
 
 
  |