UP-Viagg-io/Viagg-io/Assets/Packages/AVProVideo/Runtime/Plugins/WebGL/AVProVideo.jslib

1017 lines
25 KiB
Plaintext
Raw Normal View History

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);