forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			148 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			148 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.js;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import js.Browser;
							 | 
						||
| 
								 | 
							
								import js.html.ErrorEvent;
							 | 
						||
| 
								 | 
							
								import js.html.Event;
							 | 
						||
| 
								 | 
							
								import js.html.MediaError;
							 | 
						||
| 
								 | 
							
								import js.html.VideoElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using StringTools;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Video extends kha.Video {
							 | 
						||
| 
								 | 
							
									public var element: VideoElement;
							 | 
						||
| 
								 | 
							
									public var texture: Image;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var filenames: Array<String>;
							 | 
						||
| 
								 | 
							
									var done: kha.Video->Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function new() {
							 | 
						||
| 
								 | 
							
										super();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function fromElement(element: js.html.VideoElement): Video {
							 | 
						||
| 
								 | 
							
										var video = new Video();
							 | 
						||
| 
								 | 
							
										video.element = element;
							 | 
						||
| 
								 | 
							
										if (SystemImpl.gl != null)
							 | 
						||
| 
								 | 
							
											video.texture = Image.fromVideo(video);
							 | 
						||
| 
								 | 
							
										return video;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function fromFile(filenames: Array<String>, done: kha.Video->Void): Void {
							 | 
						||
| 
								 | 
							
										var video = new Video();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										video.done = done;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										video.element = cast Browser.document.createElement("video");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										video.filenames = [];
							 | 
						||
| 
								 | 
							
										for (filename in filenames) {
							 | 
						||
| 
								 | 
							
											if (video.element.canPlayType("video/webm") != "" && filename.endsWith(".webm"))
							 | 
						||
| 
								 | 
							
												video.filenames.push(filename);
							 | 
						||
| 
								 | 
							
											#if !kha_debug_html5
							 | 
						||
| 
								 | 
							
											if (video.element.canPlayType("video/mp4") != "" && filename.endsWith(".mp4"))
							 | 
						||
| 
								 | 
							
												video.filenames.push(filename);
							 | 
						||
| 
								 | 
							
											#end
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										video.element.addEventListener("error", video.errorListener, false);
							 | 
						||
| 
								 | 
							
										video.element.addEventListener("canplaythrough", video.canPlayThroughListener, false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										video.element.preload = "auto";
							 | 
						||
| 
								 | 
							
										video.element.src = video.filenames[0];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function width(): Int {
							 | 
						||
| 
								 | 
							
										return element.videoWidth;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function height(): Int {
							 | 
						||
| 
								 | 
							
										return element.videoHeight;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function play(loop: Bool = false): Void {
							 | 
						||
| 
								 | 
							
										try {
							 | 
						||
| 
								 | 
							
											element.loop = loop;
							 | 
						||
| 
								 | 
							
											element.play();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										catch (e:Dynamic) {
							 | 
						||
| 
								 | 
							
											trace(e);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function pause(): Void {
							 | 
						||
| 
								 | 
							
										try {
							 | 
						||
| 
								 | 
							
											element.pause();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										catch (e:Dynamic) {
							 | 
						||
| 
								 | 
							
											trace(e);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function stop(): Void {
							 | 
						||
| 
								 | 
							
										try {
							 | 
						||
| 
								 | 
							
											element.pause();
							 | 
						||
| 
								 | 
							
											element.currentTime = 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										catch (e:Dynamic) {
							 | 
						||
| 
								 | 
							
											trace(e);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function getCurrentPos(): Int {
							 | 
						||
| 
								 | 
							
										return Math.ceil(element.currentTime * 1000); // Miliseconds
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override function get_position(): Int {
							 | 
						||
| 
								 | 
							
										return Math.ceil(element.currentTime * 1000);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override function set_position(value: Int): Int {
							 | 
						||
| 
								 | 
							
										element.currentTime = value / 1000;
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function getVolume(): Float {
							 | 
						||
| 
								 | 
							
										return element.volume;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function setVolume(volume: Float): Void {
							 | 
						||
| 
								 | 
							
										element.volume = volume;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									override public function getLength(): Int {
							 | 
						||
| 
								 | 
							
										if (Math.isFinite(element.duration)) {
							 | 
						||
| 
								 | 
							
											return Math.floor(element.duration * 1000); // Miliseconds
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											return -1;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function errorListener(eventInfo: ErrorEvent): Void {
							 | 
						||
| 
								 | 
							
										if (element.error.code == MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
							 | 
						||
| 
								 | 
							
											for (i in 0...filenames.length - 1) {
							 | 
						||
| 
								 | 
							
												if (element.src == filenames[i]) {
							 | 
						||
| 
								 | 
							
													// try loading with next extension:
							 | 
						||
| 
								 | 
							
													element.src = filenames[i + 1];
							 | 
						||
| 
								 | 
							
													return;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										trace("Error loading " + element.src);
							 | 
						||
| 
								 | 
							
										finishAsset();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function canPlayThroughListener(eventInfo: Event): Void {
							 | 
						||
| 
								 | 
							
										finishAsset();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function finishAsset() {
							 | 
						||
| 
								 | 
							
										element.removeEventListener("error", errorListener, false);
							 | 
						||
| 
								 | 
							
										element.removeEventListener("canplaythrough", canPlayThroughListener, false);
							 | 
						||
| 
								 | 
							
										if (SystemImpl.gl != null)
							 | 
						||
| 
								 | 
							
											texture = Image.fromVideo(this);
							 | 
						||
| 
								 | 
							
										done(this);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |