Skip to content

Commit

Permalink
Fix HLS buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
Chocobozzz committed Feb 22, 2022
1 parent 89e3de8 commit ac5f679
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
Original file line number Diff line number Diff line change
@@ -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)
}
Expand Down
61 changes: 42 additions & 19 deletions client/src/assets/player/peertube-player-options-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down Expand Up @@ -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 = {
Expand All @@ -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
}
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit ac5f679

Please sign in to comment.