@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.
Files changed (52) hide show
  1. package/es2015.cjs +62 -34
  2. package/es2015.esm.js +73 -45
  3. package/esnext.cjs +62 -34
  4. package/esnext.esm.js +67 -39
  5. package/evergreen.esm.js +62 -34
  6. package/package.json +2 -2
  7. package/types/player/types.d.ts +1 -0
  8. package/types/providers/DashProvider/baseDashProvider.d.ts +3 -2
  9. package/types/providers/DashProvider/lib/buffer.d.ts +5 -1
  10. package/types/providers/DashProvider/lib/player.d.ts +9 -1
  11. package/types/providers/DashProvider/lib/utils.d.ts +1 -1
  12. package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +3 -2
  13. package/types/providers/DashProviderVirtual/lib/buffer/nativeBufferManager.d.ts +2 -1
  14. package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +6 -1
  15. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +5 -2
  16. package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +9 -2
  17. package/types/providers/DashProviderVirtual/lib/player/livePlayer.d.ts +1 -1
  18. package/types/providers/DashProviderVirtual/lib/player/player.d.ts +1 -1
  19. package/types/providers/DashProviderVirtual/lib/player/types.d.ts +2 -1
  20. package/types/providers/DashProviderVirtual/lib/utils.d.ts +2 -2
  21. package/types/providers/HlsProvider/index.d.ts +1 -1
  22. package/types/providers/MpegProvider/index.d.ts +1 -1
  23. package/types/providers/ProviderContainer/index.d.ts +1 -0
  24. package/types/providers/types.d.ts +1 -0
  25. package/types/providers/utils/Abr/abrController.d.ts +7 -4
  26. package/types/providers/utils/Abr/abrManager.d.ts +2 -0
  27. package/types/providers/utils/Abr/controllers/abrPhaseController.d.ts +17 -0
  28. package/types/providers/utils/Abr/rules/audio/audioThroughputRule.d.ts +3 -2
  29. package/types/providers/utils/Abr/rules/audio/minAudioForVideoRule.d.ts +3 -2
  30. package/types/providers/utils/Abr/rules/audioRuleFactory.d.ts +2 -2
  31. package/types/providers/utils/Abr/rules/baseRule.d.ts +9 -5
  32. package/types/providers/utils/Abr/rules/limitAboveRule.d.ts +3 -2
  33. package/types/providers/utils/Abr/rules/limitBelowRule.d.ts +3 -2
  34. package/types/providers/utils/Abr/rules/video/abandonRequestRule.d.ts +12 -0
  35. package/types/providers/utils/Abr/rules/video/bolaRule.d.ts +31 -0
  36. package/types/providers/utils/Abr/rules/video/bufferRule.d.ts +7 -2
  37. package/types/providers/utils/Abr/rules/video/failedVideoTrackRule.d.ts +4 -3
  38. package/types/providers/utils/Abr/rules/video/fitsContainerRule.d.ts +3 -2
  39. package/types/providers/utils/Abr/rules/video/insufficientBufferRule.d.ts +15 -0
  40. package/types/providers/utils/Abr/rules/video/lowerLimitRule.d.ts +3 -2
  41. package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +3 -2
  42. package/types/providers/utils/Abr/rules/video/throughputRule.d.ts +5 -4
  43. package/types/providers/utils/Abr/rules/video/upperLimitRule.d.ts +62 -4
  44. package/types/providers/utils/Abr/rules/videoRuleFactory.d.ts +3 -2
  45. package/types/providers/utils/Abr/types.d.ts +31 -5
  46. package/types/providers/utils/Abr/utils.d.ts +2 -1
  47. package/types/providers/utils/parsers/types.d.ts +1 -0
  48. package/types/utils/ThroughputEstimator.d.ts +4 -1
  49. package/types/utils/dashMaxTvVideoQuality.d.ts +7 -0
  50. package/types/utils/smoothedValue/baseSmoothedValue.d.ts +1 -0
  51. package/types/utils/smoothedValue/types.d.ts +1 -0
  52. package/types/utils/tuningConfig.d.ts +59 -0
@@ -1,12 +1,13 @@
1
- import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
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(confidence: RuleConfidence);
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, RuleConfidence } from "../../types";
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(confidence: RuleConfidence);
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, RuleConfidence } from "../../types";
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(confidence: RuleConfidence);
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, RuleConfidence } from "../../types";
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
- type ThroughputLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig];
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(confidence: RuleConfidence);
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, RuleConfidence } from "../../types";
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 UpperLimitsLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality];
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(confidence: RuleConfidence);
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 { RuleConfidence, VideoRuleName } from "../types";
3
+ import { VideoRuleName } from "../types";
4
+ import { type RulePhaseConfig } from "../controllers/abrPhaseController";
4
5
  export declare class VideoRuleFactory {
5
- static createRule(ruleName: VideoRuleName, confidence?: RuleConfidence): IAbrRule<IVideoTrack, IVideoAbrContext>;
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
- init(initContext: IInitAbrManagerContext): void;
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: IInitAbrManagerContext): void;
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
@@ -116,6 +116,7 @@ export interface Stream {
116
116
  label?: string;
117
117
  codecs: string;
118
118
  mime: string;
119
+ channels?: number;
119
120
  representations: Representation[];
120
121
  }
121
122
  export interface Manifest {
@@ -20,6 +20,9 @@ declare class ThroughputEstimator {
20
20
  addRawThroughput(rate: Kbps): void;
21
21
  addRawRtt(time: Milliseconds): void;
22
22
  private sanityCheck;
23
- private static load;
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;
@@ -22,5 +22,6 @@ export interface IEmaTopExtremumParams extends IParams {
22
22
  export interface ISmoothedValue {
23
23
  smoothed$: IValueSubject<number>;
24
24
  debounced$: IValueSubject<number>;
25
+ varianceCoefficient$: IValueSubject<number>;
25
26
  next(value: number): void;
26
27
  }
@@ -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;