]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix HLS buffer
authorChocobozzz <me@florianbigard.com>
Tue, 22 Feb 2022 12:44:12 +0000 (13:44 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 22 Feb 2022 12:44:12 +0000 (13:44 +0100)
client/src/assets/player/p2p-media-loader/segment-url-builder.ts
client/src/assets/player/peertube-player-options-builder.ts

index 5ddc81ff6d55528987cc7ad7a086e2381dc5f5f4..9d324078a517d5c2b8ab2c30888cc29721ae794c 100644 (file)
@@ -1,10 +1,10 @@
 import { Segment } from '@peertube/p2p-media-loader-core'
 import { RedundancyUrlManager } from './redundancy-url-manager'
 
-function segmentUrlBuilderFactory (redundancyUrlManager: RedundancyUrlManager, requiredSegmentsPriority: number) {
+function segmentUrlBuilderFactory (redundancyUrlManager: RedundancyUrlManager, useOriginPriority: number) {
   return function segmentBuilder (segment: Segment) {
     // Don't use redundancy for high priority segments
-    if (segment.priority <= requiredSegmentsPriority) return segment.url
+    if (segment.priority <= useOriginPriority) return segment.url
 
     return redundancyUrlManager.buildUrl(segment.url)
   }
index 901f6cd3bbc5f480fba6edea1ecbae290a4e1e97..71be5ccff34a6b9a7826183f3d802f5de40ad32e 100644 (file)
@@ -19,6 +19,7 @@ import {
   VideoJSPluginOptions
 } from './peertube-videojs-typings'
 import { buildVideoOrPlaylistEmbed, getRtcConfig, isIOS, isSafari } from './utils'
+import { HybridLoaderSettings } from '@peertube/p2p-media-loader-core'
 
 export type PlayerMode = 'webtorrent' | 'p2p-media-loader'
 
@@ -198,9 +199,6 @@ export class PeertubePlayerOptionsBuilder {
     const p2pMediaLoaderOptions = this.options.p2pMediaLoader
     const commonOptions = this.options.common
 
-    const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
-                                                 .filter(t => t.startsWith('ws'))
-
     const redundancyUrlManager = new RedundancyUrlManager(this.options.p2pMediaLoader.redundancyBaseUrls)
 
     const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
@@ -210,23 +208,8 @@ export class PeertubePlayerOptionsBuilder {
       src: p2pMediaLoaderOptions.playlistUrl
     }
 
-    let consumeOnly = false
-    if ((navigator as any)?.connection?.type === 'cellular') {
-      console.log('We are on a cellular connection: disabling seeding.')
-      consumeOnly = true
-    }
-
     const p2pMediaLoaderConfig: HlsJsEngineSettings = {
-      loader: {
-        trackerAnnounce,
-        segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive),
-        rtcConfig: getRtcConfig(),
-        requiredSegmentsPriority: 1,
-        simultaneousHttpDownloads: 1,
-        segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1),
-        useP2P: commonOptions.p2pEnabled,
-        consumeOnly
-      },
+      loader: this.getP2PMediaLoaderOptions(redundancyUrlManager),
       segments: {
         swarmId: p2pMediaLoaderOptions.playlistUrl
       }
@@ -256,6 +239,46 @@ export class PeertubePlayerOptionsBuilder {
     return toAssign
   }
 
+  private getP2PMediaLoaderOptions (redundancyUrlManager: RedundancyUrlManager): Partial<HybridLoaderSettings> {
+    let consumeOnly = false
+    if ((navigator as any)?.connection?.type === 'cellular') {
+      console.log('We are on a cellular connection: disabling seeding.')
+      consumeOnly = true
+    }
+
+    const trackerAnnounce = this.options.p2pMediaLoader.trackerAnnounce
+                                                 .filter(t => t.startsWith('ws'))
+
+    const specificLiveOrVODOptions = this.options.common.isLive
+      ? { // Live
+        requiredSegmentsPriority: 1
+      }
+      : { // VOD
+        requiredSegmentsPriority: 3,
+
+        cachedSegmentExpiration: 86400000,
+        cachedSegmentsCount: 100,
+
+        httpDownloadMaxPriority: 9,
+        httpDownloadProbability: 0.06,
+        httpDownloadProbabilitySkipIfNoPeers: true,
+
+        p2pDownloadMaxPriority: 50
+      }
+
+    return {
+      trackerAnnounce,
+      segmentValidator: segmentValidatorFactory(this.options.p2pMediaLoader.segmentsSha256Url, this.options.common.isLive),
+      rtcConfig: getRtcConfig(),
+      simultaneousHttpDownloads: 1,
+      segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1),
+      useP2P: this.options.common.p2pEnabled,
+      consumeOnly,
+
+      ...specificLiveOrVODOptions
+    }
+  }
+
   private getHLSOptions (p2pMediaLoaderConfig: HlsJsEngineSettings) {
     const base = {
       capLevelToPlayerSize: true,