@vkontakte/videoplayer-core 2.0.161 → 2.0.162-beta.1

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 (48) hide show
  1. package/es2015.cjs +60 -34
  2. package/es2015.esm.js +71 -45
  3. package/esnext.cjs +60 -34
  4. package/esnext.esm.js +60 -34
  5. package/evergreen.esm.js +60 -34
  6. package/package.json +2 -2
  7. package/types/index.d.ts +3 -2
  8. package/types/player/types.d.ts +13 -2
  9. package/types/providers/DashProvider/baseDashProvider.d.ts +3 -2
  10. package/types/providers/DashProvider/lib/buffer.d.ts +4 -1
  11. package/types/providers/DashProvider/lib/player.d.ts +6 -1
  12. package/types/providers/DashProvider/lib/utils.d.ts +1 -1
  13. package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +3 -2
  14. package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +4 -0
  15. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +3 -0
  16. package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +4 -0
  17. package/types/providers/DashProviderVirtual/lib/player/types.d.ts +2 -1
  18. package/types/providers/DashProviderVirtual/lib/utils.d.ts +2 -2
  19. package/types/providers/ProviderContainer/index.d.ts +2 -0
  20. package/types/providers/ProviderContainer/utils/formatsSupport.d.ts +10 -3
  21. package/types/providers/utils/Abr/abrController.d.ts +7 -4
  22. package/types/providers/utils/Abr/abrManager.d.ts +2 -0
  23. package/types/providers/utils/Abr/controllers/abrPhaseController.d.ts +17 -0
  24. package/types/providers/utils/Abr/rules/audio/audioThroughputRule.d.ts +3 -2
  25. package/types/providers/utils/Abr/rules/audio/minAudioForVideoRule.d.ts +3 -2
  26. package/types/providers/utils/Abr/rules/audioRuleFactory.d.ts +2 -2
  27. package/types/providers/utils/Abr/rules/baseRule.d.ts +9 -5
  28. package/types/providers/utils/Abr/rules/limitAboveRule.d.ts +3 -2
  29. package/types/providers/utils/Abr/rules/limitBelowRule.d.ts +3 -2
  30. package/types/providers/utils/Abr/rules/video/abandonRequestRule.d.ts +12 -0
  31. package/types/providers/utils/Abr/rules/video/bolaRule.d.ts +31 -0
  32. package/types/providers/utils/Abr/rules/video/bufferRule.d.ts +7 -2
  33. package/types/providers/utils/Abr/rules/video/failedVideoTrackRule.d.ts +4 -3
  34. package/types/providers/utils/Abr/rules/video/fitsContainerRule.d.ts +3 -2
  35. package/types/providers/utils/Abr/rules/video/insufficientBufferRule.d.ts +15 -0
  36. package/types/providers/utils/Abr/rules/video/lowerLimitRule.d.ts +3 -2
  37. package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +3 -2
  38. package/types/providers/utils/Abr/rules/video/throughputRule.d.ts +5 -4
  39. package/types/providers/utils/Abr/rules/video/upperLimitRule.d.ts +3 -2
  40. package/types/providers/utils/Abr/rules/videoRuleFactory.d.ts +3 -2
  41. package/types/providers/utils/Abr/types.d.ts +31 -5
  42. package/types/providers/utils/Abr/utils.d.ts +2 -1
  43. package/types/providers/utils/parsers/types.d.ts +1 -0
  44. package/types/utils/ThroughputEstimator.d.ts +1 -0
  45. package/types/utils/dashMaxTvVideoQuality.d.ts +7 -0
  46. package/types/utils/smoothedValue/baseSmoothedValue.d.ts +1 -0
  47. package/types/utils/smoothedValue/types.d.ts +1 -0
  48. package/types/utils/tuningConfig.d.ts +41 -2
@@ -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,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 { Nullable, QualityLimits, VideoQuality } from "@vkontakte/videoplayer-shared";
4
4
  import { type ExactVideoQuality } from "@vkontakte/videoplayer-shared";
5
5
  import { LimitAboveRule } from "../limitAboveRule";
6
+ import type { RulePhaseConfig } from "../../controllers/abrPhaseController";
6
7
  type UpperLimitsLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality, effectiveType: string | undefined, connectionDataQualityLimit: ExactVideoQuality | undefined];
7
8
  /**
8
9
  * Правило верхнего ограничения качества в авто-ABR. Из списка `videoTracksDesc`
@@ -60,7 +61,7 @@ type UpperLimitsLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: N
60
61
  * `LowerLimitRule` (поле `limits.min` здесь не используется).
61
62
  */
62
63
  export declare class UpperLimitsRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, UpperLimitsLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
63
- constructor(confidence: RuleConfidence);
64
+ constructor(phaseConfig: RulePhaseConfig);
64
65
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
65
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;
66
67
  private getConnection;
@@ -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,7 @@ declare class ThroughputEstimator {
20
20
  addRawThroughput(rate: Kbps): void;
21
21
  addRawRtt(time: Milliseconds): void;
22
22
  private sanityCheck;
23
+ get throughputVariance$(): IValueSubject<number>;
23
24
  private static loadStored;
24
25
  private static writeStored;
25
26
  private static validateStored;
@@ -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
  }
@@ -1,4 +1,4 @@
1
- import type { VideoCodec, VideoFormat } from "../player/types";
1
+ import type { VideoCodecName, VideoFormat } from "../player/types";
2
2
  import { WebmCodecStrategy } from "../enums/WebmCodecStrategy";
3
3
  import { AndroidPreferredFormat } from "../enums/AndroidPreferredFormat";
4
4
  import { IOSPreferredFormat } from "../enums/IOSPreferredFormat";
@@ -36,6 +36,7 @@ export type ITuningConfig = {
36
36
  initialThroughput: Kbps;
37
37
  measureNonSegmentRequests: boolean;
38
38
  smallSampleMinDuration: Milliseconds;
39
+ cacheThresholdSize: Milliseconds;
39
40
  rttPenaltyRequestSize: Byte;
40
41
  streamMinSampleSize: Byte;
41
42
  streamMinSampleTime: Milliseconds;
@@ -174,6 +175,7 @@ export type ITuningConfig = {
174
175
  useBufferHoldingOnlyOnStall: boolean;
175
176
  useAbortResetNativeBufferMutex: boolean;
176
177
  useNewAbr: boolean;
178
+ useAbrPhases: boolean;
177
179
  abrVideoRules: VideoRuleName[];
178
180
  abrAudioRules: AudioRuleName[];
179
181
  useDynamicBirtateRule: boolean;
@@ -183,8 +185,33 @@ export type ITuningConfig = {
183
185
  saveData3gQualityLimit: ExactVideoQuality;
184
186
  saveData2gQualityLimit: ExactVideoQuality;
185
187
  useConnectionDataUpperLimit: boolean;
186
- videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodec][];
188
+ abandon: {
189
+ minElapsedMs: Milliseconds;
190
+ bufferSafetyFactor: number;
191
+ minLoadedFraction: number;
192
+ minBufferToActivateMs: Milliseconds;
193
+ };
194
+ bola: {
195
+ bufferTargetMs: Milliseconds;
196
+ minBufferMs: Milliseconds;
197
+ minBufferPerBitrateLevelMs: Milliseconds;
198
+ placeholderBufferDecay: number;
199
+ fallbackSegmentDurationMs: Milliseconds;
200
+ finiteThresholdMs: Milliseconds;
201
+ adaptiveBufferTargetK: number;
202
+ adaptiveBufferTargetMaxMs: Milliseconds;
203
+ trimDetectThresholdMs: Milliseconds;
204
+ antiCascadeDownshift: boolean;
205
+ };
206
+ insufficientBuffer: {
207
+ thresholdMs: Milliseconds;
208
+ gracePeriodAfterPlaybackResetMs: Milliseconds;
209
+ budgetFactor: number;
210
+ fallbackSegmentDurationMs: Milliseconds;
211
+ };
212
+ videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodecName][];
187
213
  filterOnDemandQualityList: boolean;
214
+ dashMaxTvVideoQuality: boolean;
188
215
  };
189
216
  dashCmafLive: {
190
217
  externalStopControl: boolean;
@@ -260,7 +287,17 @@ export type ITuningConfig = {
260
287
  useDelayedPlaybackHangupWithData: boolean;
261
288
  playbackHangupNoDataThreshold: Milliseconds;
262
289
  endGapTolerance: Milliseconds;
290
+ /**
291
+ * Время после перехода в состояние buffering, когда мы считаем что происходит stall
292
+ */
263
293
  stallIgnoreThreshold: Milliseconds;
294
+ /**
295
+ * Стратегия записи столлов
296
+ * verbose - записываем всё
297
+ * exclude-threshold - записываем столлы длинее stallIgnoreThreshold, но вычитаем длину stallIgnoreThreshold
298
+ * include-threshold - записываем столлы длинее stallIgnoreThreshold
299
+ */
300
+ stallHandlingStrategy: "verbose" | "exclude-threshold" | "include-threshold";
264
301
  gapWatchdogInterval: Milliseconds;
265
302
  requestQuick: boolean;
266
303
  /** @deprecated HLS.js удалён, флаг ничего не делает */
@@ -370,6 +407,8 @@ export type ITuningConfig = {
370
407
  hls: {
371
408
  filterOnDemandQualityList: boolean;
372
409
  };
410
+ /** отключает субтитры в ядре */
411
+ disableSubtitles: boolean;
373
412
  /**
374
413
  * Устанавливаем длительность видео на основе последнего сегмента.
375
414
  */