var THREE = require('three');
/**
* Provide basic functionality to display video as texture.
* VideoTexture is used for creating and updating a video projected onto a Three.js texture
*
* @class
* @param {Object} containerIn - Container to create the renderer on.
* @author Alan Wu
* @return {VideoHandler}
*/
exports.VideoHandler = function(srcIn) {
var _this = this;
this.video = undefined;
this.videoTexture = undefined;
var src = srcIn;
var lastTime = 0;
var lastUpdate = 0;
var frameRate = 30;
var videoPlaneLoadedFlag = false;
var lastPlayPos = 0;
var currentPlayPos = 0;
var bufferingDetected = false;
var checkBuffering = function(delta, playAnimation) {
currentPlayPos = _this.video.currentTime;
// checking offset should be at most the check interval
// but allow for some margin
var offset = delta - 0.02;
// if no buffering is currently detected,
// and the position does not seem to increase
// and the _this.video isn't manually paused...
if (!bufferingDetected && (currentPlayPos < (lastPlayPos + offset)) &&
!_this.video.paused) {
bufferingDetected = true;
}
// if we were buffering but the _this.video has advanced,
// then there is no buffering
if (bufferingDetected && (currentPlayPos > (lastPlayPos + offset)) &&
!_this.video.paused) {
bufferingDetected = false;
}
lastPlayPos = currentPlayPos;
}
var initialise = function(){
if (document) {
_this.video = document.createElement( 'video' );
_this.video.crossOrigin = "anonymous";
_this.video.src = src;
_this.video.load();
_this.video.loop = true;
}
}
this.setMorphTime = function(time, duration){
var actualTime = time / duration * _this.video.duration;
_this.video.currentTime = actualTime;
}
// videoPlaneLoaded connects the video to the video texture once it has loaded
this.getVideoDuration = function() {
return _this.video.duration;
}
this.createCanvasVideoTexture = function(){
_this.videoTexture = new THREE.VideoTexture( _this.video );
_this.videoTexture.minFilter = THREE.LinearFilter;
_this.videoTexture.magFilter = THREE.LinearFilter;
_this.videoTexture.format = THREE.RGBFormat;
_this.video.currentTime = 0;
return _this.videoTexture;
}
this.getCurrentTime = function(duration) {
if (_this.video)
return duration * (_this.video.currentTime / _this.video.duration);
else
return 0;
}
this.isReadyToPlay = function(){
// video.readyState 3 means we have data to load for the current time and foreseeable future
if (_this.video && _this.video.readyState >= 3){
return true;
}
return false;
}
//this should be handle by scene... check the sync at
initialise();
}