ultrawidify/src/ext/lib/video-transform/Scaler.js

146 lines
5.2 KiB
JavaScript
Raw Normal View History

import Debug from '../../conf/Debug';
2019-03-10 23:27:50 +01:00
import AspectRatio from '../../../common/enums/aspect-ratio.enum';
// računa velikost videa za približevanje/oddaljevanje
// does video size calculations for zooming/cropping
class Scaler {
// internal variables
// functions
2018-05-18 23:26:20 +02:00
constructor(videoData) {
this.conf = videoData;
}
2019-03-10 23:27:50 +01:00
modeToAr(ar){
if (ar.ratio) {
return ar.ratio;
}
// Skrbi za "stare" možnosti, kot na primer "na širino zaslona", "na višino zaslona" in "ponastavi".
// Približevanje opuščeno.
2019-03-10 23:27:50 +01:00
// handles "legacy" options, such as 'fit to widht', 'fit to height' and AspectRatio.Reset. No zoom tho
var ratioOut;
if (!this.conf.video) {
if(Debug.debug){
console.log("[Scaler.js::modeToAr] No video??",this.conf.video, "killing videoData");
}
2018-05-18 23:26:20 +02:00
this.conf.destroy();
return null;
}
if(! this.conf.player.dimensions ){
2019-03-10 23:27:50 +01:00
ratioOut = screen.width / screen.height;
}
else {
2019-03-10 23:27:50 +01:00
ratioOut = this.conf.player.dimensions.width / this.conf.player.dimensions.height;
}
2018-08-20 22:45:43 +02:00
// POMEMBNO: lastAr je potrebno nastaviti šele po tem, ko kličemo _res_setAr(). _res_setAr() predvideva,
// da želimo nastaviti statično (type: 'static') razmerje stranic — tudi, če funkcijo kličemo tu oz. v ArDetect.
//
2018-08-20 22:45:43 +02:00
// IMPORTANT NOTE: lastAr needs to be set after _res_setAr() is called, as _res_setAr() assumes we're
// setting a static aspect ratio (even if the function is called from here or ArDetect).
var fileAr = this.conf.video.videoWidth / this.conf.video.videoHeight;
2019-03-10 23:27:50 +01:00
if (ar.type === AspectRatio.FitWidth){
ratioOut > fileAr ? ratioOut : fileAr
ar.ratio = ratioOut;
return ratioOut;
}
2019-03-10 23:27:50 +01:00
else if(ar.type === AspectRatio.FitHeight){
ratioOut < fileAr ? ratioOut : fileAr
ar.ratio = ratioOut;
return ratioOut;
}
2019-03-10 23:27:50 +01:00
else if(ar.type === AspectRatio.Reset){
if(Debug.debug){
console.log("[Scaler.js::modeToAr] Using original aspect ratio -", fileAr)
}
2019-03-10 23:27:50 +01:00
ar.ar = fileAr;
return fileAr;
}
return null;
}
2019-03-10 23:27:50 +01:00
calculateCrop(ar) {
if(!this.conf.video || this.conf.video.videoWidth == 0 || this.conf.video.videoHeight == 0){
if(Debug.debug)
2018-05-18 23:26:20 +02:00
console.log("[Scaler::calculateCrop] ERROR — no video detected.");
this.conf.destroy();
return {error: "no_video"};
}
2019-03-10 23:27:50 +01:00
if (ar.type === AspectRatio.Reset){
return {xFactor: 1, yFactor: 1}
}
// handle fuckie-wuckies
2019-04-25 22:02:10 +02:00
if (! ar.ratio){
if(Debug.debug)
2019-04-25 22:02:10 +02:00
console.log("[Scaler::calculateCrop] no ar?", ar.ratio, " -- we were given this mode:", ar);
return {error: "no_ar", ratio: ar.ratio};
}
if(Debug.debug)
2019-04-25 22:02:10 +02:00
console.log("[Scaler::calculateCrop] trying to set ar. args are: ar->",ar.ratio,"; this.conf.player.dimensions->",this.conf.player.dimensions.width, "×", this.conf.player.dimensions.height, "| obj:", this.conf.player.dimensions);
if( (! this.conf.player.dimensions) || this.conf.player.dimensions.width === 0 || this.conf.player.dimensions.height === 0 ){
if(Debug.debug)
console.log("[Scaler::calculateCrop] ERROR — no (or invalid) this.conf.player.dimensions:",this.conf.player.dimensions);
return {error: "this.conf.player.dimensions_error"};
}
// zdaj lahko končno začnemo računati novo velikost videa
// we can finally start computing required video dimensions now:
// Dejansko razmerje stranic datoteke/<video> značke
// Actual aspect ratio of the file/<video> tag
var fileAr = this.conf.video.videoWidth / this.conf.video.videoHeight;
var playerAr = this.conf.player.dimensions.width / this.conf.player.dimensions.height;
2019-04-25 22:02:10 +02:00
if(ar.type === AspectRatio.Initial || !ar.ratio)
ar.ratio = fileAr;
if(Debug.debug)
2019-04-25 22:02:10 +02:00
console.log("[Scaler::calculateCrop] ar is " ,ar.ratio, ", file ar is", fileAr, ", this.conf.player.dimensions are ", this.conf.player.dimensions.width, "×", this.conf.player.dimensions.height, "| obj:", this.conf.player.dimensions);
var videoDimensions = {
xFactor: 1,
yFactor: 1,
actualWidth: 0, // width of the video (excluding pillarbox) when <video> tag height is equal to width
actualHeight: 0, // height of the video (excluding letterbox) when <video> tag height is equal to height
}
// if(Debug.debug){
// console.log("[Scaler::calculateCrop] Player dimensions?", this.conf.player.dimensions.width, "×", this.conf.player.dimensions.height, "| obj:", this.conf.player.dimensions);
// }
2019-04-25 22:02:10 +02:00
if( fileAr < ar.ratio ){
// imamo letterbox zgoraj in spodaj -> spremenimo velikost videa (a nikoli širše od ekrana)
// letterbox -> change video size (but never to wider than monitor width)
2019-04-25 22:02:10 +02:00
videoDimensions.xFactor = Math.min(ar.ratio, playerAr) / fileAr;
videoDimensions.yFactor = videoDimensions.xFactor;
}
else {
2019-04-25 22:02:10 +02:00
videoDimensions.xFactor = fileAr / Math.min(ar.ratio, playerAr);
videoDimensions.yFactor = videoDimensions.xFactor;
}
if(Debug.debug){
console.log("[Scaler::calculateCrop] Crop factor calculated — ", videoDimensions.xFactor);
}
return videoDimensions;
}
}
export default Scaler;