Fix chrome bug .. hopefully

This commit is contained in:
Tamius Han 2021-01-30 12:16:37 +01:00
parent 9a0c0ba810
commit 5bd2952437
3 changed files with 69 additions and 0 deletions

View File

@ -269,6 +269,8 @@ class Resizer {
this.zoom.applyZoom(stretchFactors);
this.stretcher.chromeBugMitigation(stretchFactors);
var translate = this.computeOffsets(stretchFactors);
this.applyCss(stretchFactors, translate);
}

View File

@ -180,6 +180,30 @@ class Scaler {
this.logger.log('info', 'scaler', "[Scaler::calculateCrop] Crop factor calculated — ", videoDimensions.xFactor);
// Workaround for Chrome/Edge issue where zooming too much results in video being stretched incorrectly
/**
* Bug description if the following are true:
* * user is using Chrome or Edge (but surprisingly not Opera)
* * user is using hardware acceleration
* * user is using a noVideo card
* * user is in full screen mode
* Then the video will do Stretch.Basic no matter what you put in `transform: scale(x,y)`.
*
* Because this issue happens regardless of how you upscale the video (doesn't matter if you use transform:scale
* or width+height or anything else), the aspect ratio needs to be limited _before_ applying arCorrectionFactor
* (note that arCorrectionFactor is usually <= 1, as it conpensates for zooming that height=[>100%] on <video>
* style attribute does).
*
* This method is also repeated in calculate stretch method.
*/
if (BrowserDetect.anyChromium && this.conf.player?.isFullScreen && this.conf.player?.dimensions?.fullscreen) {
const maxSafeAr = (window.innerWidth * 0.995) / window.innerHeight;
videoDimensions.xFactor = Math.min(videoDimensions.xFactor, maxSafeAr);
videoDimensions.yFactor = Math.min(videoDimensions.yFactor, maxSafeAr);
}
// correct the factors
videoDimensions.xFactor *= arCorrectionFactor;
videoDimensions.yFactor *= arCorrectionFactor;

View File

@ -230,6 +230,49 @@ squeezeFactor: ${squeezeFactor}`, '\nvideo', this.conf.video);
return stretchFactors;
}
/**
* Ensure that <video> element is never both taller-ish and wider-ish than the screen, while in fullscreen
* on Chromium-based browsers.
*
* Workaround for Chrome/Edge issue where zooming too much results in video being stretched incorrectly.
*
* Bug description if the following are true:
* * user is using Chrome or Edge (but surprisingly not Opera)
* * user is using hardware acceleration
* * user is using a noVideo card
* * user is in full screen mode
* * the video is both roughly taller and roughly wider than the monitor
* Then the video will do Stretch.Basic no matter what you put in `transform: scale(x,y)`.
*
* In practice, the issue appears slightly _before_ the last condition is met (video needs to be ~3434 px wide
* in order for this bug to trigger on my 3440x1440 display).
*
* Because this issue happens regardless of how you upscale the video (doesn't matter if you use transform:scale
* or width+height or anything else), the aspect ratio needs to be limited _before_ applying arCorrectionFactor
* (note that arCorrectionFactor is usually <= 1, as it conpensates for zooming that height=[>100%] on <video>
* style attribute does).
*/
chromeBugMitigation(stretchFactors) {
if (BrowserDetect.anyChromium && this.conf.player?.isFullScreen && this.conf.player?.dimensions?.fullscreen) {
const playerAr = playerArOverride || this.conf.player.dimensions.width / this.conf.player.dimensions.height;
const streamAr = this.conf.video.videoWidth / this.conf.video.videoHeight;
let maxSafeAr;
if (playerAr >= (streamAr * 1.1)) {
maxSafeAr = (window.innerWidth * 0.997) / window.innerHeight;
} else if (playerAr < (streamAr * 0.95)) {
maxSafeAr = window.innerWidth / (window.innerHeight * 0.997);
} else {
// in some cases, we tolerate minor stretch to avoid tiny black bars
return;
}
stretchFactors.xFactor = Math.min(stretchFactors.xFactor, maxSafeAr);
stretchFactors.yFactor = Math.min(stretchFactors.yFactor, maxSafeAr);
}
}
}
export default Stretcher;