@vkontakte/videoplayer-core 2.0.161-dev.eddfe39b7.0 → 2.0.162-dev.3fab5a629.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es2015.cjs +62 -34
- package/es2015.esm.js +73 -45
- package/esnext.cjs +62 -34
- package/esnext.esm.js +67 -39
- package/evergreen.esm.js +62 -34
- package/package.json +2 -2
- package/types/player/types.d.ts +1 -0
- package/types/providers/DashProvider/baseDashProvider.d.ts +3 -2
- package/types/providers/DashProvider/lib/buffer.d.ts +5 -1
- package/types/providers/DashProvider/lib/player.d.ts +9 -1
- package/types/providers/DashProvider/lib/utils.d.ts +1 -1
- package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +3 -2
- package/types/providers/DashProviderVirtual/lib/buffer/nativeBufferManager.d.ts +2 -1
- package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +6 -1
- package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +5 -2
- package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +9 -2
- package/types/providers/DashProviderVirtual/lib/player/livePlayer.d.ts +1 -1
- package/types/providers/DashProviderVirtual/lib/player/player.d.ts +1 -1
- package/types/providers/DashProviderVirtual/lib/player/types.d.ts +2 -1
- package/types/providers/DashProviderVirtual/lib/utils.d.ts +2 -2
- package/types/providers/HlsProvider/index.d.ts +1 -1
- package/types/providers/MpegProvider/index.d.ts +1 -1
- package/types/providers/ProviderContainer/index.d.ts +1 -0
- package/types/providers/types.d.ts +1 -0
- package/types/providers/utils/Abr/abrController.d.ts +7 -4
- package/types/providers/utils/Abr/abrManager.d.ts +2 -0
- package/types/providers/utils/Abr/controllers/abrPhaseController.d.ts +17 -0
- package/types/providers/utils/Abr/rules/audio/audioThroughputRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/audio/minAudioForVideoRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/audioRuleFactory.d.ts +2 -2
- package/types/providers/utils/Abr/rules/baseRule.d.ts +9 -5
- package/types/providers/utils/Abr/rules/limitAboveRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/limitBelowRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/video/abandonRequestRule.d.ts +12 -0
- package/types/providers/utils/Abr/rules/video/bolaRule.d.ts +31 -0
- package/types/providers/utils/Abr/rules/video/bufferRule.d.ts +7 -2
- package/types/providers/utils/Abr/rules/video/failedVideoTrackRule.d.ts +4 -3
- package/types/providers/utils/Abr/rules/video/fitsContainerRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/video/insufficientBufferRule.d.ts +15 -0
- package/types/providers/utils/Abr/rules/video/lowerLimitRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +3 -2
- package/types/providers/utils/Abr/rules/video/throughputRule.d.ts +5 -4
- package/types/providers/utils/Abr/rules/video/upperLimitRule.d.ts +62 -4
- package/types/providers/utils/Abr/rules/videoRuleFactory.d.ts +3 -2
- package/types/providers/utils/Abr/types.d.ts +31 -5
- package/types/providers/utils/Abr/utils.d.ts +2 -1
- package/types/providers/utils/parsers/types.d.ts +1 -0
- package/types/utils/ThroughputEstimator.d.ts +4 -1
- package/types/utils/dashMaxTvVideoQuality.d.ts +7 -0
- package/types/utils/smoothedValue/baseSmoothedValue.d.ts +1 -0
- package/types/utils/smoothedValue/types.d.ts +1 -0
- package/types/utils/tuningConfig.d.ts +59 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext } from "../../types";
|
|
2
2
|
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
3
|
import type { IRectangle, Nullable } from "@vkontakte/videoplayer-shared";
|
|
4
4
|
import { LimitAboveRule } from "../limitAboveRule";
|
|
5
5
|
import type { ITuningConfig } from "../../../../../utils/tuningConfig";
|
|
6
|
+
import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
6
7
|
type IContainerSizeLimit = IRectangle;
|
|
7
8
|
type FitsContainerLogsArgs = [containerSizeLimit: Nullable<IContainerSizeLimit>, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]];
|
|
8
9
|
export declare class FitsContainerRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, FitsContainerLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
9
|
-
constructor(
|
|
10
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
10
11
|
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
11
12
|
protected createLogMessage(selectedTrack: IVideoTrack, containerSizeLimit: Nullable<IContainerSizeLimit>, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]): string;
|
|
12
13
|
private getContainerSizeLimit;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IRuleInitContext, IVideoAbrContext } from "../../types";
|
|
2
|
+
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
|
+
import type { Milliseconds } from "@vkontakte/videoplayer-shared";
|
|
4
|
+
import { LimitAboveRule } from "../limitAboveRule";
|
|
5
|
+
import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
6
|
+
type LogsArgs = [forwardBufferDuration: Milliseconds | undefined, thresholdMs: Milliseconds, triggered: boolean, suppressedByGrace: boolean];
|
|
7
|
+
export declare class InsufficientBufferRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, LogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
8
|
+
private lastPlaybackResetAtMs;
|
|
9
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
10
|
+
init(initContext: IRuleInitContext): void;
|
|
11
|
+
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
12
|
+
private selectThroughputAwareFallback;
|
|
13
|
+
protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferDuration: Milliseconds | undefined, thresholdMs: Milliseconds, triggered: boolean, suppressedByGrace: boolean): string;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext } from "../../types";
|
|
2
2
|
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
3
|
import type { Nullable, QualityLimits } from "@vkontakte/videoplayer-shared";
|
|
4
4
|
import { type ExactVideoQuality } from "@vkontakte/videoplayer-shared";
|
|
5
5
|
import { LimitBelowRule } from "../limitBelowRule";
|
|
6
|
+
import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
6
7
|
type LowerLimitLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, limits: QualityLimits];
|
|
7
8
|
export declare class LowerLimitRule extends LimitBelowRule<IVideoTrack, IVideoAbrContext, LowerLimitLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
8
|
-
constructor(
|
|
9
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
9
10
|
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
10
11
|
protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, limits: QualityLimits): string;
|
|
11
12
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext } from "../../types";
|
|
2
2
|
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
3
|
import type { Kbps, Nullable } from "@vkontakte/videoplayer-shared";
|
|
4
4
|
import { LimitAboveRule } from "../limitAboveRule";
|
|
5
5
|
import type { ITuningConfig } from "../../../../../utils/tuningConfig";
|
|
6
|
+
import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
6
7
|
type StallLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig];
|
|
7
8
|
export declare class StallsRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, StallLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
8
9
|
private severeStallOccurred;
|
|
@@ -10,7 +11,7 @@ export declare class StallsRule extends LimitAboveRule<IVideoTrack, IVideoAbrCon
|
|
|
10
11
|
private lastStallDurationRestriction;
|
|
11
12
|
private maxQualityLimitOnStall;
|
|
12
13
|
private predictedThroughputWithoutData;
|
|
13
|
-
constructor(
|
|
14
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
14
15
|
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
15
16
|
protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig): string;
|
|
16
17
|
private updateStallQualityLimits;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext } from "../../types";
|
|
2
2
|
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
3
|
import type { Kbps, Nullable } from "@vkontakte/videoplayer-shared";
|
|
4
4
|
import { LimitAboveRule } from "../limitAboveRule";
|
|
5
5
|
import type { ITuningConfig } from "../../../../../utils/tuningConfig";
|
|
6
|
-
|
|
6
|
+
import { AbrPhase, type RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
7
|
+
type ThroughputLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, phase: AbrPhase | undefined, tuning: ITuningConfig];
|
|
7
8
|
export declare class ThroughputRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, ThroughputLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
8
|
-
constructor(
|
|
9
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
9
10
|
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
10
|
-
protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig): string;
|
|
11
|
+
protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, phase: AbrPhase | undefined, tuning: ITuningConfig): string;
|
|
11
12
|
}
|
|
12
13
|
export {};
|
|
@@ -1,12 +1,70 @@
|
|
|
1
|
-
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext
|
|
1
|
+
import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext } from "../../types";
|
|
2
2
|
import type { IVideoTrack } from "../../../../../player/types";
|
|
3
3
|
import type { Nullable, QualityLimits, VideoQuality } from "@vkontakte/videoplayer-shared";
|
|
4
4
|
import { type ExactVideoQuality } from "@vkontakte/videoplayer-shared";
|
|
5
5
|
import { LimitAboveRule } from "../limitAboveRule";
|
|
6
|
-
type
|
|
6
|
+
import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
|
|
7
|
+
type UpperLimitsLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality, effectiveType: string | undefined, connectionDataQualityLimit: ExactVideoQuality | undefined];
|
|
8
|
+
/**
|
|
9
|
+
* Правило верхнего ограничения качества в авто-ABR. Из списка `videoTracksDesc`
|
|
10
|
+
* (отсортирован от высшего к низшему) выбирает самый высокий трек, который
|
|
11
|
+
* одновременно удовлетворяет ВСЕМ активным лимитам сверху. Если подходящего
|
|
12
|
+
* нет — возвращает минимально доступный трек (graceful fallback).
|
|
13
|
+
*
|
|
14
|
+
* Источники лимитов сверху (действуют совместно, победитель — самый строгий):
|
|
15
|
+
*
|
|
16
|
+
* 1. `context.limits.max` — явный пользовательский/интеграционный лимит.
|
|
17
|
+
* Приходит из публичного API `Player.setAutoQualityLimits({ max, min })`
|
|
18
|
+
* (см. `packages/core/src/player/Player.ts`). Слой UI/интеграция пробрасывает
|
|
19
|
+
* его в `desiredState.autoVideoTrackLimits` → `AbrManager.updateContext({ limits })`
|
|
20
|
+
* → `IVideoAbrContext.limits`. `undefined` в `limits` или `limits.max` снимает
|
|
21
|
+
* лимит. Значение типа `ExactVideoQuality` (например, '720p'), трактуется
|
|
22
|
+
* включительно (`<=`). Если лимиты невалидны (min > max, либо min выше
|
|
23
|
+
* highestAvailable, либо max ниже lowestAvailable) — см. `areLimitsInvalid` —
|
|
24
|
+
* лимит игнорируется целиком, чтобы не заблокировать воспроизведение.
|
|
25
|
+
*
|
|
26
|
+
* Реальные кейсы:
|
|
27
|
+
* - Пользователь в настройках плеера выбрал пресет «Экономия трафика»
|
|
28
|
+
* (`PredefinedQualityLimits.TRAFFIC_SAVING`) — хост передаёт
|
|
29
|
+
* `{ max: tuning.autoTrackSelection.trafficSavingLimit }` (Q_480P).
|
|
30
|
+
* - Хост-приложение (мини-апп ВК, лента) ограничивает качество для
|
|
31
|
+
* превью/фонового воспроизведения.
|
|
32
|
+
* - A/B-эксперимент или бизнес-правило режет качество для конкретной
|
|
33
|
+
* категории видео / региона / тарифа.
|
|
34
|
+
*
|
|
35
|
+
* 2. `tuning.autoTrackSelection.backgroundVideoQualityLimit` — применяется
|
|
36
|
+
* только когда `context.visible === false` (плеер вне viewport, по данным
|
|
37
|
+
* `elementVisible$` из `observeElementVisibility`, порог — `activeVideoAreaThreshold`).
|
|
38
|
+
*
|
|
39
|
+
* Реальные кейсы: автовоспроизведение в ленте при прокрутке мимо плеера,
|
|
40
|
+
* PiP/мини-плеер в фоне, неактивная вкладка.
|
|
41
|
+
*
|
|
42
|
+
* 3. `effectiveType` из Network Information API (`navigator.connection`).
|
|
43
|
+
* Активируется `tuning.dash.useConnectionDataUpperLimit`.
|
|
44
|
+
* Приоритет разрешения в `connectionDataQualityLimit`:
|
|
45
|
+
* a. `effectiveType ∈ {'2g', 'slow-2g'}` → `tuning.dash.saveData2gQualityLimit`
|
|
46
|
+
* (Q_360P) — жёсткий лимит на очень слабой сети.
|
|
47
|
+
* b. `effectiveType === '3g'` → `tuning.dash.saveData3gQualityLimit` (Q_480P).
|
|
48
|
+
* c. Иначе — без ограничения.
|
|
49
|
+
*
|
|
50
|
+
* Network Information API доступен только в Chromium (Android, десктоп Chrome/Edge/
|
|
51
|
+
* Opera/Samsung Internet, Android WebView). В Firefox, Safari и Chrome iOS
|
|
52
|
+
* (WebKit) `navigator.connection === undefined` — этот источник лимита
|
|
53
|
+
* неактивен, правило работает только по п.1 и п.2.
|
|
54
|
+
*
|
|
55
|
+
* Реальные кейсы: пользователь в метро / зоне слабого сигнала, пользователь
|
|
56
|
+
* на edge/3G-тарифе.
|
|
57
|
+
*
|
|
58
|
+
* Все три источника комбинируются операцией AND: трек проходит, если
|
|
59
|
+
* `fitsLimits && fitsBackgroundVideoQualityLimit && fitsSaveDataLimit`. Поэтому
|
|
60
|
+
* итоговый потолок = минимум из активных. Нижнюю границу закрывает
|
|
61
|
+
* `LowerLimitRule` (поле `limits.min` здесь не используется).
|
|
62
|
+
*/
|
|
7
63
|
export declare class UpperLimitsRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, UpperLimitsLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
|
|
8
|
-
constructor(
|
|
64
|
+
constructor(phaseConfig: RulePhaseConfig);
|
|
9
65
|
execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
|
|
10
|
-
protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality): string;
|
|
66
|
+
protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality, effectiveType: string | undefined, connectionDataQualityLimit: ExactVideoQuality | undefined): string;
|
|
67
|
+
private getConnection;
|
|
68
|
+
private resolveConnectionDataQualityLimit;
|
|
11
69
|
}
|
|
12
70
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IVideoTrack } from "../../../../player/types";
|
|
2
2
|
import type { IAbrRule, IVideoAbrContext } from "../types";
|
|
3
|
-
import {
|
|
3
|
+
import { VideoRuleName } from "../types";
|
|
4
|
+
import { type RulePhaseConfig } from "../controllers/abrPhaseController";
|
|
4
5
|
export declare class VideoRuleFactory {
|
|
5
|
-
static createRule(ruleName: VideoRuleName,
|
|
6
|
+
static createRule(ruleName: VideoRuleName, phaseConfig?: RulePhaseConfig): IAbrRule<IVideoTrack, IVideoAbrContext>;
|
|
6
7
|
}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import type { IAudioTrack, IBaseTrack, IVideoTrack } from "../../../player/types";
|
|
2
|
-
import type { IComponentLogger, IObservable, IRectangle, IValueSubject, Kbps, Milliseconds, Nullable, QualityLimits } from "@vkontakte/videoplayer-shared";
|
|
2
|
+
import type { Byte, IComponentLogger, IObservable, IRectangle, IValueSubject, Kbps, Milliseconds, Nullable, QualityLimits } from "@vkontakte/videoplayer-shared";
|
|
3
3
|
import type { ITuningConfig } from "../../../utils/tuningConfig";
|
|
4
4
|
import type { Representation, Segment } from "../parsers/types";
|
|
5
5
|
import type { ElementSizeManager } from "../HTMLVideoElement/ElementSizeManager";
|
|
6
6
|
import type { IObservableVideo } from "../HTMLVideoElement/observable";
|
|
7
|
+
import type { AbrPhase } from "./controllers/abrPhaseController";
|
|
7
8
|
export declare enum RuleConfidence {
|
|
8
9
|
Low = 0,
|
|
9
10
|
Normal = 1,
|
|
10
11
|
High = 2
|
|
11
12
|
}
|
|
12
13
|
export declare enum VideoRuleName {
|
|
14
|
+
/** @deprecated Заменено на `Bola` + `InsufficientBuffer` в фазовой архитектуре ABR. */
|
|
13
15
|
Buffer = "buffer_rule",
|
|
16
|
+
Bola = "bola_rule",
|
|
14
17
|
FitsContainer = "fits_container_rule",
|
|
15
18
|
FailedVideoTrack = "failed_video_track_rule",
|
|
16
19
|
Stalls = "stalls_rule",
|
|
17
20
|
LowerLimit = "lower_limit_rule",
|
|
18
21
|
UpperLimit = "upper_limit_rule",
|
|
19
|
-
Throughput = "throughput_rule"
|
|
22
|
+
Throughput = "throughput_rule",
|
|
23
|
+
AbandonRequest = "abandon_request_rule",
|
|
24
|
+
InsufficientBuffer = "insufficient_buffer_rule"
|
|
20
25
|
}
|
|
21
26
|
export declare enum AudioRuleName {
|
|
22
27
|
MinAudioForVideo = "min_audio_for_video_rule",
|
|
@@ -36,6 +41,11 @@ export interface IUpdatableAbrManagerContext {
|
|
|
36
41
|
forwardBufferHealth?: number;
|
|
37
42
|
forwardVideoBufferRepresentations: Nullable<Map<Representation["id"], Segment[]>>;
|
|
38
43
|
forwardAudioBufferRepresentations: Nullable<Map<Representation["id"], Segment[]>>;
|
|
44
|
+
forwardBufferDuration?: Milliseconds;
|
|
45
|
+
videoSegmentLoadProgress?: VideoSegmentLoadProgress;
|
|
46
|
+
isLive?: boolean;
|
|
47
|
+
remainingDurationMs?: Milliseconds;
|
|
48
|
+
mpdSegmentDurationMs?: Milliseconds;
|
|
39
49
|
}
|
|
40
50
|
export interface IInitAbrManagerContext {
|
|
41
51
|
tuning: ITuningConfig;
|
|
@@ -44,6 +54,7 @@ export interface IInitAbrManagerContext {
|
|
|
44
54
|
videoLastDataObtainedTimestamp$: IValueSubject<Milliseconds>;
|
|
45
55
|
throughput$: IValueSubject<Kbps>;
|
|
46
56
|
rtt$: IValueSubject<Milliseconds>;
|
|
57
|
+
throughputVariance$?: IValueSubject<number>;
|
|
47
58
|
element: HTMLVideoElement;
|
|
48
59
|
failedVideoTrack: Nullable<IVideoTrack>;
|
|
49
60
|
abrLogger: IComponentLogger;
|
|
@@ -70,19 +81,21 @@ export interface IAbrRuleResolution<T extends IBaseTrack> {
|
|
|
70
81
|
name: string;
|
|
71
82
|
logMessage: string;
|
|
72
83
|
}
|
|
84
|
+
export interface IRuleInitContext extends IInitAbrManagerContext {}
|
|
73
85
|
export interface IAbrRule<
|
|
74
86
|
T extends IBaseTrack,
|
|
75
87
|
C extends IBaseAbrControllerContext
|
|
76
88
|
> {
|
|
77
|
-
|
|
89
|
+
readonly activePhases: ReadonlySet<AbrPhase>;
|
|
90
|
+
init(initContext: IRuleInitContext): void;
|
|
78
91
|
destroy(): void;
|
|
79
92
|
execute(context: C): IAbrRuleResolution<T>;
|
|
80
93
|
}
|
|
81
94
|
export interface IAbrController<T extends IBaseTrack> {
|
|
82
|
-
init(rules: IAbrRule<T, IBaseAbrControllerContext>[], initContext:
|
|
95
|
+
init(rules: IAbrRule<T, IBaseAbrControllerContext>[], initContext: IRuleInitContext): void;
|
|
83
96
|
destroy(): void;
|
|
84
97
|
updateContext(context: IBaseAbrControllerContext): void;
|
|
85
|
-
autoSelectTrack(): T;
|
|
98
|
+
autoSelectTrack(rules?: IAbrRule<T, IBaseAbrControllerContext>[]): T;
|
|
86
99
|
}
|
|
87
100
|
export interface IBaseAbrControllerContext extends IVideoTracksContext {
|
|
88
101
|
currentVideoTrack: Nullable<IVideoTrack>;
|
|
@@ -92,8 +105,16 @@ export interface IBaseAbrControllerContext extends IVideoTracksContext {
|
|
|
92
105
|
estimatedThroughput: Kbps;
|
|
93
106
|
reserve: Kbps;
|
|
94
107
|
forwardBufferHealth: Nullable<number>;
|
|
108
|
+
forwardBufferDuration: Milliseconds | undefined;
|
|
95
109
|
playbackRate: number;
|
|
110
|
+
throughputVariance: number;
|
|
96
111
|
}
|
|
112
|
+
export type VideoSegmentLoadProgress = {
|
|
113
|
+
startedAtMs: Milliseconds;
|
|
114
|
+
loadedBytes: Byte;
|
|
115
|
+
totalBytes: Byte | undefined;
|
|
116
|
+
segmentDurationMs: Milliseconds;
|
|
117
|
+
};
|
|
97
118
|
export interface IVideoAbrContext extends IBaseAbrControllerContext {
|
|
98
119
|
container: Nullable<IRectangle>;
|
|
99
120
|
panelSize: Nullable<IRectangle>;
|
|
@@ -102,6 +123,11 @@ export interface IVideoAbrContext extends IBaseAbrControllerContext {
|
|
|
102
123
|
visible: boolean;
|
|
103
124
|
severeStallOccurred: boolean;
|
|
104
125
|
lastStallDuration: Milliseconds;
|
|
126
|
+
videoSegmentLoadProgress?: VideoSegmentLoadProgress;
|
|
127
|
+
remainingDurationMs: Milliseconds | undefined;
|
|
128
|
+
isLive: boolean;
|
|
129
|
+
mpdSegmentDurationMs: Milliseconds | undefined;
|
|
130
|
+
phase?: AbrPhase;
|
|
105
131
|
}
|
|
106
132
|
export type IAudioAbrContext = IBaseAbrControllerContext & IAudioTracksContext;
|
|
107
133
|
export declare const isAudioAbrContext: (context: IBaseAbrControllerContext) => context is IAudioAbrContext;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { Nullable } from "@vkontakte/videoplayer-shared";
|
|
1
|
+
import type { Milliseconds, Nullable } from "@vkontakte/videoplayer-shared";
|
|
2
2
|
import type { IAudioTrack, IBaseTrack, IVideoTrack } from "../../../player/types";
|
|
3
|
+
export declare const bufferToPlaybackMs: (contentMs: Milliseconds | undefined, playbackRate: number) => Milliseconds;
|
|
3
4
|
export declare enum CompareTrack {
|
|
4
5
|
Descending = -1,
|
|
5
6
|
Ascending = 1
|
|
@@ -20,6 +20,9 @@ declare class ThroughputEstimator {
|
|
|
20
20
|
addRawThroughput(rate: Kbps): void;
|
|
21
21
|
addRawRtt(time: Milliseconds): void;
|
|
22
22
|
private sanityCheck;
|
|
23
|
-
|
|
23
|
+
get throughputVariance$(): IValueSubject<number>;
|
|
24
|
+
private static loadStored;
|
|
25
|
+
private static writeStored;
|
|
26
|
+
private static validateStored;
|
|
24
27
|
}
|
|
25
28
|
export default ThroughputEstimator;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { VideoFormat } from "../player/types";
|
|
2
|
+
import type { Manifest } from "../providers/utils/parsers/types";
|
|
3
|
+
import type { ExactVideoQuality, IError } from "@vkontakte/videoplayer-shared";
|
|
4
|
+
import { VideoQuality } from "@vkontakte/videoplayer-shared";
|
|
5
|
+
export declare const getDashMaxTvVideoQuality: (e: IError, videoFormat?: VideoFormat, currentQuality?: VideoQuality) => ExactVideoQuality | null;
|
|
6
|
+
/** @mutates streams.video */
|
|
7
|
+
export declare const markDashMaxTvVideoQuality: (streams: Manifest["streams"], dashMaxTvVideoQuality: ExactVideoQuality) => void;
|
|
@@ -12,6 +12,7 @@ export declare abstract class BaseSmoothedValue implements ISmoothedValue {
|
|
|
12
12
|
protected params: IParams;
|
|
13
13
|
smoothed$: IValueSubject<number>;
|
|
14
14
|
debounced$: IValueSubject<number>;
|
|
15
|
+
varianceCoefficient$: IValueSubject<number>;
|
|
15
16
|
constructor(params: IParams);
|
|
16
17
|
protected abstract updateSmoothedValue(value: number): void;
|
|
17
18
|
next(value: number): void;
|
|
@@ -45,6 +45,24 @@ export type ITuningConfig = {
|
|
|
45
45
|
continuesByteSequenceInterval: Milliseconds;
|
|
46
46
|
maxLastEvaluationTimeout: Milliseconds;
|
|
47
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* TTL + проверка типа сети для кешированного throughput из localStorage.
|
|
50
|
+
* При включении: если сохранённое значение старше storedThroughputTtlMs
|
|
51
|
+
* или тип сети изменился (Wi-Fi→3G) — значение отбрасывается.
|
|
52
|
+
* Предотвращает старт в 4K при переходе с Wi-Fi на мобильную сеть.
|
|
53
|
+
*
|
|
54
|
+
* При OFF (дефолт): читаем/пишем как до фикса — plain number в legacy-ключ
|
|
55
|
+
* one_video_*. Это даёт безопасный rollback JS-версии без потери данных.
|
|
56
|
+
* При ON: новый формат (JSON с timestamp+networkType) → новый ключ vk_uvp_*.
|
|
57
|
+
*/
|
|
58
|
+
useThroughputTtl: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Срок жизни кешированного throughput (мс). По умолчанию 4 часа.
|
|
61
|
+
* После истечения TTL значение из localStorage игнорируется —
|
|
62
|
+
* используется browser estimation или initialThroughput.
|
|
63
|
+
* Применимо только при useThroughputTtl=true.
|
|
64
|
+
*/
|
|
65
|
+
storedThroughputTtlMs: Milliseconds;
|
|
48
66
|
};
|
|
49
67
|
autoTrackSelection: {
|
|
50
68
|
bitrateFactorAtEmptyBuffer: number;
|
|
@@ -130,6 +148,8 @@ export type ITuningConfig = {
|
|
|
130
148
|
useNewRepresentationSwitch: boolean;
|
|
131
149
|
useDelayedRepresentationSwitch: boolean;
|
|
132
150
|
useSmartRepresentationSwitch: boolean;
|
|
151
|
+
seekStallExitPolicy: boolean;
|
|
152
|
+
mutexStallExitPolicy: boolean;
|
|
133
153
|
useFetchPriorityHints: boolean;
|
|
134
154
|
useAbortMSEFix: boolean;
|
|
135
155
|
enableBaseUrlSupport: boolean;
|
|
@@ -154,14 +174,43 @@ export type ITuningConfig = {
|
|
|
154
174
|
useBufferHoldingOnlyOnStall: boolean;
|
|
155
175
|
useAbortResetNativeBufferMutex: boolean;
|
|
156
176
|
useNewAbr: boolean;
|
|
177
|
+
useAbrPhases: boolean;
|
|
157
178
|
abrVideoRules: VideoRuleName[];
|
|
158
179
|
abrAudioRules: AudioRuleName[];
|
|
159
180
|
useDynamicBirtateRule: boolean;
|
|
160
181
|
useNewFailoverLogic: boolean;
|
|
161
182
|
useFailoverHostsOnAllProviderCrash: boolean;
|
|
162
183
|
videoTrackBanAfterProviderFail: Milliseconds;
|
|
184
|
+
saveData3gQualityLimit: ExactVideoQuality;
|
|
185
|
+
saveData2gQualityLimit: ExactVideoQuality;
|
|
186
|
+
useConnectionDataUpperLimit: boolean;
|
|
187
|
+
abandon: {
|
|
188
|
+
minElapsedMs: Milliseconds;
|
|
189
|
+
bufferSafetyFactor: number;
|
|
190
|
+
minLoadedFraction: number;
|
|
191
|
+
minBufferToActivateMs: Milliseconds;
|
|
192
|
+
};
|
|
193
|
+
bola: {
|
|
194
|
+
bufferTargetMs: Milliseconds;
|
|
195
|
+
minBufferMs: Milliseconds;
|
|
196
|
+
minBufferPerBitrateLevelMs: Milliseconds;
|
|
197
|
+
placeholderBufferDecay: number;
|
|
198
|
+
fallbackSegmentDurationMs: Milliseconds;
|
|
199
|
+
finiteThresholdMs: Milliseconds;
|
|
200
|
+
adaptiveBufferTargetK: number;
|
|
201
|
+
adaptiveBufferTargetMaxMs: Milliseconds;
|
|
202
|
+
trimDetectThresholdMs: Milliseconds;
|
|
203
|
+
antiCascadeDownshift: boolean;
|
|
204
|
+
};
|
|
205
|
+
insufficientBuffer: {
|
|
206
|
+
thresholdMs: Milliseconds;
|
|
207
|
+
gracePeriodAfterPlaybackResetMs: Milliseconds;
|
|
208
|
+
budgetFactor: number;
|
|
209
|
+
fallbackSegmentDurationMs: Milliseconds;
|
|
210
|
+
};
|
|
163
211
|
videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodec][];
|
|
164
212
|
filterOnDemandQualityList: boolean;
|
|
213
|
+
dashMaxTvVideoQuality: boolean;
|
|
165
214
|
};
|
|
166
215
|
dashCmafLive: {
|
|
167
216
|
externalStopControl: boolean;
|
|
@@ -340,9 +389,19 @@ export type ITuningConfig = {
|
|
|
340
389
|
* Очищаем кэш урлов при падение провайдера.
|
|
341
390
|
*/
|
|
342
391
|
dropUrlCacheWhenProviderCrashed?: boolean;
|
|
392
|
+
/**
|
|
393
|
+
* При смене/реините провайдера игнорируем результат того, смогло видео заиграть или нет.
|
|
394
|
+
*/
|
|
395
|
+
ignoreForcePlayResultWhenProviderChanged?: boolean;
|
|
343
396
|
hls: {
|
|
344
397
|
filterOnDemandQualityList: boolean;
|
|
345
398
|
};
|
|
399
|
+
/** отключает субтитры в ядре */
|
|
400
|
+
disableSubtitles: boolean;
|
|
401
|
+
/**
|
|
402
|
+
* Устанавливаем длительность видео на основе последнего сегмента.
|
|
403
|
+
*/
|
|
404
|
+
useDurationFromSegments: boolean;
|
|
346
405
|
};
|
|
347
406
|
export type IOptionalTuningConfig = RecursivePartial<ITuningConfig>;
|
|
348
407
|
export declare const fillDefault: (partial: IOptionalTuningConfig) => ITuningConfig;
|