diff options
-rw-r--r-- | client/src/assets/player/peertube-videojs-plugin.ts | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts index 936fb2577..57c894ee6 100644 --- a/client/src/assets/player/peertube-videojs-plugin.ts +++ b/client/src/assets/player/peertube-videojs-plugin.ts | |||
@@ -367,19 +367,34 @@ class PeerTubePlugin extends Plugin { | |||
367 | 367 | ||
368 | if (!averageDownloadSpeed) averageDownloadSpeed = this.getAndSaveActualDownloadSpeed() | 368 | if (!averageDownloadSpeed) averageDownloadSpeed = this.getAndSaveActualDownloadSpeed() |
369 | 369 | ||
370 | // Filter videos we can play according to our screen resolution and bandwidth | 370 | // Limit resolution according to player height |
371 | const filteredFiles = this.videoFiles.filter(f => f.resolution.id <= this.playerElement.width) | 371 | const playerHeight = this.playerElement.offsetHeight as number |
372 | .filter(f => { | 372 | |
373 | const fileBitrate = (f.size / this.videoDuration) | 373 | // We take the first resolution just above the player height |
374 | let threshold = fileBitrate | 374 | // Example: player height is 530px, we want the 720p file instead of 480p |
375 | 375 | let maxResolution = this.videoFiles[0].resolution.id | |
376 | // If this is for a higher resolution or an initial load: add a margin | 376 | for (let i = this.videoFiles.length - 1; i >= 0; i--) { |
377 | if (!this.currentVideoFile || f.resolution.id > this.currentVideoFile.resolution.id) { | 377 | const resolutionId = this.videoFiles[i].resolution.id |
378 | threshold += ((fileBitrate * this.CONSTANTS.AUTO_QUALITY_THRESHOLD_PERCENT) / 100) | 378 | if (resolutionId >= playerHeight) { |
379 | maxResolution = resolutionId | ||
380 | break | ||
379 | } | 381 | } |
382 | } | ||
380 | 383 | ||
381 | return averageDownloadSpeed > threshold | 384 | // Filter videos we can play according to our screen resolution and bandwidth |
382 | }) | 385 | const filteredFiles = this.videoFiles |
386 | .filter(f => f.resolution.id <= maxResolution) | ||
387 | .filter(f => { | ||
388 | const fileBitrate = (f.size / this.videoDuration) | ||
389 | let threshold = fileBitrate | ||
390 | |||
391 | // If this is for a higher resolution or an initial load: add a margin | ||
392 | if (!this.currentVideoFile || f.resolution.id > this.currentVideoFile.resolution.id) { | ||
393 | threshold += ((fileBitrate * this.CONSTANTS.AUTO_QUALITY_THRESHOLD_PERCENT) / 100) | ||
394 | } | ||
395 | |||
396 | return averageDownloadSpeed > threshold | ||
397 | }) | ||
383 | 398 | ||
384 | // If the download speed is too bad, return the lowest resolution we have | 399 | // If the download speed is too bad, return the lowest resolution we have |
385 | if (filteredFiles.length === 0) return videoFileMinByResolution(this.videoFiles) | 400 | if (filteredFiles.length === 0) return videoFileMinByResolution(this.videoFiles) |