@vkontakte/videoplayer-core 2.0.158-dev.fdf6110f.0 → 2.0.159-dev.0948a7cb.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 (31) hide show
  1. package/es2015.cjs +79 -75
  2. package/es2015.esm.js +81 -77
  3. package/esnext.cjs +77 -73
  4. package/esnext.esm.js +77 -73
  5. package/evergreen.esm.js +77 -73
  6. package/package.json +2 -2
  7. package/types/player/Player.d.ts +1 -0
  8. package/types/player/types.d.ts +5 -1
  9. package/types/providers/DashProvider/baseDashProvider.d.ts +3 -1
  10. package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +2 -1
  11. package/types/providers/DashProviderVirtual/lib/buffer/types.d.ts +6 -1
  12. package/types/providers/DashProviderVirtual/lib/buffer/virtualBuffer/baseVirtualBufferManager.d.ts +4 -4
  13. package/types/providers/DashProviderVirtual/lib/player/basePlayer.d.ts +3 -2
  14. package/types/providers/ProviderContainer/index.d.ts +1 -0
  15. package/types/providers/utils/Abr/abrController.d.ts +2 -2
  16. package/types/providers/utils/Abr/rules/audio/audioThroughputRule.d.ts +2 -2
  17. package/types/providers/utils/Abr/rules/audio/minAudioForVideoRule.d.ts +3 -2
  18. package/types/providers/utils/Abr/rules/audioRuleFactory.d.ts +7 -0
  19. package/types/providers/utils/Abr/rules/baseRule.d.ts +2 -2
  20. package/types/providers/utils/Abr/rules/video/bufferRule.d.ts +3 -2
  21. package/types/providers/utils/Abr/rules/video/failedVideoTrackRule.d.ts +13 -0
  22. package/types/providers/utils/Abr/rules/video/fitsContainerRule.d.ts +3 -3
  23. package/types/providers/utils/Abr/rules/video/lowerLimitRule.d.ts +3 -3
  24. package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +3 -3
  25. package/types/providers/utils/Abr/rules/video/throughputRule.d.ts +3 -3
  26. package/types/providers/utils/Abr/rules/video/upperLimitRule.d.ts +3 -3
  27. package/types/providers/utils/Abr/rules/videoRuleFactory.d.ts +6 -0
  28. package/types/providers/utils/Abr/types.d.ts +15 -13
  29. package/types/providers/utils/Abr/utils.d.ts +2 -1
  30. package/types/utils/autoSelectTrack.d.ts +4 -3
  31. package/types/utils/tuningConfig.d.ts +8 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer-core",
3
- "version": "2.0.158-dev.fdf6110f.0",
3
+ "version": "2.0.159-dev.0948a7cb.0",
4
4
  "author": "vk.com",
5
5
  "description": "Videoplayer core library based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -42,6 +42,6 @@
42
42
  "**/*.d.ts"
43
43
  ],
44
44
  "dependencies": {
45
- "@vkontakte/videoplayer-shared": "1.0.87-dev.fdf6110f.0"
45
+ "@vkontakte/videoplayer-shared": "1.0.88-dev.0948a7cb.0"
46
46
  }
47
47
  }
@@ -107,6 +107,7 @@ export default class Player implements IPlayer {
107
107
  */
108
108
  releaseCamera(): this;
109
109
  getExactTime(): Seconds;
110
+ getExactLiveTime(): Seconds;
110
111
  getAllLogs(): ILogEntry[];
111
112
  private getScene3D;
112
113
  private setIntrinsicVideoSize;
@@ -71,7 +71,11 @@ export interface IPlayer {
71
71
  * Возвращает наиболее точное время воспроизведения.
72
72
  * Может быть точнее, чем `info.position$` в промежутках между timeupdate
73
73
  */
74
- getExactTime(): number;
74
+ getExactTime(): Seconds;
75
+ /**
76
+ * Возвращает наиболее точное время воспроизведения трансляции.
77
+ */
78
+ getExactLiveTime(): Seconds;
75
79
  /**
76
80
  * Возвращает все логи с момента инициализации плеера
77
81
  */
@@ -6,7 +6,7 @@ import type { IProvider, IProviderParams } from "../types";
6
6
  import type { IObservableVideo } from "../utils/HTMLVideoElement/observable";
7
7
  import { TrackHistory } from "../../utils/autoSelectTrack";
8
8
  import type { IStateMachine } from "../../utils/StateMachine/types";
9
- import type { ISubscription, ITracer, Milliseconds } from "@vkontakte/videoplayer-shared";
9
+ import type { ISubscription, ITracer, Milliseconds, Nullable } from "@vkontakte/videoplayer-shared";
10
10
  import { Player } from "./lib/player";
11
11
  import { Scene3D } from "../../utils/3d/Scene3D";
12
12
  import DroppedFramesManager from "../utils/HTMLVideoElement/DroppedFramesManager";
@@ -17,6 +17,7 @@ import { ElementSizeManager } from "../utils/HTMLVideoElement/ElementSizeManager
17
17
  type IParams = IProviderParams<IDashURLSource> & {
18
18
  sourceHls?: IHLSSource;
19
19
  forceVideoCodec?: VideoCodec;
20
+ failedVideoTrack?: Nullable<IVideoTrack>;
20
21
  };
21
22
  export default abstract class BaseDashProvider implements IProvider {
22
23
  scene3D: Scene3D | undefined;
@@ -33,6 +34,7 @@ export default abstract class BaseDashProvider implements IProvider {
33
34
  protected stallsManager: StallsManager;
34
35
  protected elementSizeManager: ElementSizeManager;
35
36
  protected abrManager: AbrManager;
37
+ protected failedVideoTrack: Nullable<IVideoTrack>;
36
38
  protected videoTracksMap: Map<IVideoTrack, {
37
39
  stream: Stream;
38
40
  representation: Representation;
@@ -6,7 +6,7 @@ import type { IProvider, IProviderParams } from "../types";
6
6
  import type { IObservableVideo } from "../utils/HTMLVideoElement/observable";
7
7
  import { TrackHistory } from "../../utils/autoSelectTrack";
8
8
  import type { IStateMachine } from "../../utils/StateMachine/types";
9
- import type { ISubscription, ITracer, Milliseconds } from "@vkontakte/videoplayer-shared";
9
+ import type { ISubscription, ITracer, Milliseconds, Nullable } from "@vkontakte/videoplayer-shared";
10
10
  import { Scene3D } from "../../utils/3d/Scene3D";
11
11
  import DroppedFramesManager from "../utils/HTMLVideoElement/DroppedFramesManager";
12
12
  import TextTrackManager from "../utils/HTMLVideoElement/TextTrackManager";
@@ -17,6 +17,7 @@ import { AbrManager } from "../utils/Abr/abrManager";
17
17
  type IParams = IProviderParams<IDashURLSource> & {
18
18
  sourceHls?: IHLSSource;
19
19
  forceVideoCodec?: VideoCodec;
20
+ failedVideoTrack?: Nullable<IVideoTrack>;
20
21
  };
21
22
  export default abstract class BaseDashProvider implements IProvider {
22
23
  scene3D: Scene3D | undefined;
@@ -3,6 +3,11 @@ import type { CommonInit, Manifest, Representation, Segment } from "../../../uti
3
3
  import type { Fetcher } from "../fetcher";
4
4
  import type { ITuningConfig } from "../../../../utils/tuningConfig";
5
5
  export type TRepresentationSwitchMode = "lazy" | "force";
6
+ export declare enum SwithRepresentationMode {
7
+ Lazy = "lazy",
8
+ Default = "default",
9
+ Force = "force"
10
+ }
6
11
  export interface Dependencies {
7
12
  fetcher: Fetcher;
8
13
  tuning: ITuningConfig;
@@ -23,7 +28,7 @@ export interface IVirtualBufferManager<T extends Segment = Segment> {
23
28
  prepareSeek(): Promise<void>;
24
29
  seek(position: Milliseconds): Promise<void>;
25
30
  maintain(currentPosition?: Milliseconds | undefined): Promise<void>;
26
- switchTo(newRepresentationId: Representation["id"], isAuto: boolean | undefined): Promise<void | undefined>;
31
+ switchTo(newRepresentationId: Representation["id"], mode: SwithRepresentationMode): Promise<void | undefined>;
27
32
  getForwardBufferRepresentations(currentPosition?: Milliseconds): Map<Representation["id"], T[]>;
28
33
  getForwardPlaybackBufferDuration(currentPosition?: Milliseconds): Milliseconds;
29
34
  getPlaybackBufferState(): IRange<Milliseconds> | null;
@@ -5,7 +5,7 @@ import type { ITuningConfig } from "../../../../../utils/tuningConfig";
5
5
  import type { Byte, IError, IRange, ISubject, IValueSubject, Milliseconds, Seconds } from "@vkontakte/videoplayer-shared";
6
6
  import { abortable, Subscription } from "@vkontakte/videoplayer-shared";
7
7
  import type { NativeBufferManager } from "../nativeBufferManager";
8
- import type { Dependencies, IBufferPlaybackQueueItem, ISomeDataLoadedCallbackParams, IVirtualBufferManager } from "../types";
8
+ import { SwithRepresentationMode, type Dependencies, type IBufferPlaybackQueueItem, type ISomeDataLoadedCallbackParams, type IVirtualBufferManager } from "../types";
9
9
  export declare abstract class BaseVirtualBufferManager<T extends Segment> implements IVirtualBufferManager<T> {
10
10
  error$: ISubject<IError>;
11
11
  playingRepresentation$: IValueSubject<Representation["id"] | undefined>;
@@ -57,11 +57,11 @@ export declare abstract class BaseVirtualBufferManager<T extends Segment> implem
57
57
  protected abstract onSomeDataLoaded(data: ISomeDataLoadedCallbackParams<T>): Promise<void>;
58
58
  protected abstract updateRepresentationBaseUrl(representation: Representation, newBaseUrl: string): void;
59
59
  startWith: ReturnType<typeof abortable<[Representation["id"]]>>;
60
- switchTo(newRepresentationId: Representation["id"], isAuto: boolean | undefined): Promise<void>;
61
- protected getSwitchWithAbort(): ReturnType<typeof abortable<[Representation["id"], boolean | undefined], void>>;
60
+ switchTo(newRepresentationId: Representation["id"], mode?: SwithRepresentationMode): Promise<void>;
61
+ protected getSwitchWithAbort(): ReturnType<typeof abortable<[Representation["id"], SwithRepresentationMode], void>>;
62
62
  switchToOld: ReturnType<typeof abortable<[Representation["id"], boolean | undefined], void>>;
63
63
  prepareSeek(): Promise<void>;
64
- seek(position: Milliseconds): Promise<void>;
64
+ seek(position: Milliseconds | undefined): Promise<void>;
65
65
  maintain(currentPosition?: Milliseconds | undefined): Promise<void>;
66
66
  getForwardBufferRepresentations(currentPosition?: Milliseconds | undefined): Map<Representation["id"], T[]>;
67
67
  getForwardPlaybackBufferDuration(currentPosition?: Milliseconds | undefined): Milliseconds;
@@ -8,7 +8,7 @@ import type { ITuningConfig } from "../../../../utils/tuningConfig";
8
8
  import type { IError, IRange, ISubject, ISubscription, ITracer, IValueSubject, Milliseconds, Nullable, Seconds } from "@vkontakte/videoplayer-shared";
9
9
  import { abortable, Subject, Subscription, SubscriptionRemovable } from "@vkontakte/videoplayer-shared";
10
10
  import { Fetcher } from "../fetcher";
11
- import type { Dependencies, IVirtualBufferManager } from "../buffer/types";
11
+ import type { Dependencies, IVirtualBufferManager, SwithRepresentationMode } from "../buffer/types";
12
12
  import type { Params } from "./types";
13
13
  import { State } from "./types";
14
14
  import { NativeBufferManager } from "../buffer/nativeBufferManager";
@@ -20,6 +20,7 @@ export declare abstract class BasePlayer {
20
20
  protected tuning: ITuningConfig;
21
21
  protected tracer: ITracer;
22
22
  protected forceVideoCodec?: VideoCodec;
23
+ protected stallTimeInWaitingExitAttemptMade: Milliseconds;
23
24
  protected videoBufferManager: IVirtualBufferManager | null;
24
25
  protected audioBufferManager: IVirtualBufferManager | null;
25
26
  protected bufferManagers: IVirtualBufferManager[];
@@ -76,7 +77,7 @@ export declare abstract class BasePlayer {
76
77
  initRepresentations: ReturnType<typeof abortable<[Representation["id"], Representation["id"] | undefined, IHLSSource | undefined]>>;
77
78
  initManifest(element: HTMLVideoElement, manifestBaseUrlString: string, offset: number): Promise<void>;
78
79
  initBuffer(): void;
79
- switchRepresentation(kind: StreamKind, id: Representation["id"], isAuto?: boolean): Promise<void>;
80
+ switchRepresentation(kind: StreamKind, id: Representation["id"], mode: SwithRepresentationMode): Promise<void>;
80
81
  seek(requestedPosition: Milliseconds, forcePrecise?: boolean): Promise<void>;
81
82
  warmUpMediaSourceIfNeeded(position?: Milliseconds | undefined): void;
82
83
  getForwardBufferRepresentations(kind: Exclude<StreamKind, StreamKind.TEXT>): Map<Representation["id"], Segment[]> | undefined;
@@ -30,6 +30,7 @@ export default class ProviderContainer implements IProviderContainer {
30
30
  private tracer;
31
31
  private params;
32
32
  private failoverIndex;
33
+ private currentFailedVideoTrack;
33
34
  private volumeMultiplierManager;
34
35
  constructor(params: IParams);
35
36
  init(): void;
@@ -1,4 +1,4 @@
1
- import type { IAbrController, IAbrRule, IBaseAbrControllerContext } from "./types";
1
+ import type { IAbrController, IAbrRule, IBaseAbrControllerContext, IInitAbrManagerContext } from "./types";
2
2
  import type { IBaseTrack } from "../../../player/types";
3
3
  export default class AbrController<
4
4
  T extends IBaseTrack,
@@ -7,7 +7,7 @@ export default class AbrController<
7
7
  private history;
8
8
  private rules;
9
9
  private context;
10
- init(rules: IAbrRule<T, C>[]): void;
10
+ init(rules: IAbrRule<T, C>[], initContext: IInitAbrManagerContext): void;
11
11
  destroy(): void;
12
12
  updateContext(context: C): void;
13
13
  autoSelectTrack(): T;
@@ -1,9 +1,9 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IAudioAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IAudioTrack, IVideoTrack } from "../../../../../player/types";
3
3
  import { LimitAboveRule } from "../limitAboveRule";
4
- import type { Kbps } from "@vkontakte/videoplayer-shared";
4
+ import type { Kbps, Nullable } from "@vkontakte/videoplayer-shared";
5
5
  import type { ITuningConfig } from "../../../../../utils/tuningConfig";
6
- type AudioThroughputLogsArgs = [forwardBufferHealth: number | undefined, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig];
6
+ type AudioThroughputLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig];
7
7
  export declare class AudioThroughputRule extends LimitAboveRule<IAudioTrack, IAudioAbrContext, AudioThroughputLogsArgs> implements IAbrRule<IAudioTrack, IAudioAbrContext> {
8
8
  constructor(confidence: RuleConfidence);
9
9
  execute(context: IAudioAbrContext): IAbrRuleResolution<IAudioTrack>;
@@ -2,10 +2,11 @@ import type { IAbrRule, IAbrRuleResolution, IAudioAbrContext, RuleConfidence } f
2
2
  import type { IAudioTrack, IVideoTrack } from "../../../../../player/types";
3
3
  import { LimitBelowRule } from "../limitBelowRule";
4
4
  import type { ITuningConfig } from "../../../../../utils/tuningConfig";
5
- type MinAudioForVideoLogsArgs = [lastVideoTrackSelected: IVideoTrack | undefined, tuning: ITuningConfig];
5
+ import type { Nullable } from "@vkontakte/videoplayer-shared";
6
+ type MinAudioForVideoLogsArgs = [lastVideoTrackSelected: Nullable<IVideoTrack>, tuning: ITuningConfig];
6
7
  export declare class MinAudioForVideoRule extends LimitBelowRule<IAudioTrack, IAudioAbrContext, MinAudioForVideoLogsArgs> implements IAbrRule<IAudioTrack, IAudioAbrContext> {
7
8
  constructor(confidence: RuleConfidence);
8
9
  execute(context: IAudioAbrContext): IAbrRuleResolution<IAudioTrack>;
9
- protected createLogMessage(selectedTrack: IVideoTrack, lastVideoTrackSelected: IVideoTrack | undefined, tuning: ITuningConfig): string;
10
+ protected createLogMessage(selectedTrack: IVideoTrack, lastVideoTrackSelected: Nullable<IVideoTrack>, tuning: ITuningConfig): string;
10
11
  }
11
12
  export {};
@@ -0,0 +1,7 @@
1
+ import { AudioRuleName } from "../types";
2
+ import type { IAbrRule, IAudioAbrContext } from "../types";
3
+ import { RuleConfidence } from "../types";
4
+ import type { IAudioTrack } from "../../../../player/types";
5
+ export declare class AudioRuleFactory {
6
+ static createRule(ruleName: AudioRuleName, confidence?: RuleConfidence): IAbrRule<IAudioTrack, IAudioAbrContext>;
7
+ }
@@ -1,4 +1,4 @@
1
- import type { IAbrRule, IAbrRuleResolution, IBaseAbrControllerContext, RuleConfidence, RuleType } from "../types";
1
+ import type { IAbrRule, IAbrRuleResolution, IBaseAbrControllerContext, IInitAbrManagerContext, RuleConfidence, RuleType } from "../types";
2
2
  import type { IBaseTrack } from "../../../../player/types";
3
3
  import { Subscription } from "@vkontakte/videoplayer-shared";
4
4
  export declare abstract class BaseRule<
@@ -11,7 +11,7 @@ export declare abstract class BaseRule<
11
11
  protected type: RuleType;
12
12
  protected name: string;
13
13
  constructor(confidence: RuleConfidence);
14
- init(): void;
14
+ init(_initContext: IInitAbrManagerContext): void;
15
15
  destroy(): void;
16
16
  abstract execute(context: C): IAbrRuleResolution<T>;
17
17
  protected createResolution(selectedTrack: T, ...params: LogsArgs): IAbrRuleResolution<T>;
@@ -1,11 +1,12 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
+ import type { Nullable } from "@vkontakte/videoplayer-shared";
3
4
  import { LimitAboveRule } from "../limitAboveRule";
4
5
  import type { ITuningConfig } from "../../../../../utils/tuningConfig";
5
- type BufferRuleLogsArgs = [currentVideoTrack: IVideoTrack | undefined, lastVideoTrackSelected: IVideoTrack | undefined, forwardBufferHealth: number | undefined, abrTuning: ITuningConfig["autoTrackSelection"]];
6
+ type BufferRuleLogsArgs = [currentVideoTrack: Nullable<IVideoTrack>, lastVideoTrackSelected: Nullable<IVideoTrack>, forwardBufferHealth: Nullable<number>, abrTuning: ITuningConfig["autoTrackSelection"]];
6
7
  export declare class BufferRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, BufferRuleLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
7
8
  constructor(confidence: RuleConfidence);
8
9
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
9
- protected createLogMessage(selectedTrack: IVideoTrack, currentVideoTrack: IVideoTrack | undefined, lastVideoTrackSelected: IVideoTrack | undefined, forwardBufferHealth: number | undefined, abrTuning: ITuningConfig["autoTrackSelection"]): string;
10
+ protected createLogMessage(selectedTrack: IVideoTrack, currentVideoTrack: Nullable<IVideoTrack>, lastVideoTrackSelected: Nullable<IVideoTrack>, forwardBufferHealth: Nullable<number>, abrTuning: ITuningConfig["autoTrackSelection"]): string;
10
11
  }
11
12
  export {};
@@ -0,0 +1,13 @@
1
+ import type { IAbrRule, IAbrRuleResolution, IInitAbrManagerContext, IVideoAbrContext, RuleConfidence } from "../../types";
2
+ import type { IVideoTrack } from "../../../../../player/types";
3
+ import type { Nullable } from "@vkontakte/videoplayer-shared";
4
+ import { LimitAboveRule } from "../limitAboveRule";
5
+ type FailedVideoTracLogsArgs = [banTrack: Nullable<IVideoTrack>];
6
+ export declare class FailedVideoTrackRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, FailedVideoTracLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
7
+ protected banTrack: Nullable<IVideoTrack>;
8
+ constructor(confidence: RuleConfidence);
9
+ init(initContext: IInitAbrManagerContext): void;
10
+ execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
11
+ protected createLogMessage(selectedTrack: IVideoTrack, banTrack: Nullable<IVideoTrack>): string;
12
+ }
13
+ export {};
@@ -1,14 +1,14 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
- import type { IRectangle } from "@vkontakte/videoplayer-shared";
3
+ import type { IRectangle, Nullable } from "@vkontakte/videoplayer-shared";
4
4
  import { LimitAboveRule } from "../limitAboveRule";
5
5
  import type { ITuningConfig } from "../../../../../utils/tuningConfig";
6
6
  type IContainerSizeLimit = IRectangle;
7
- type FitsContainerLogsArgs = [containerSizeLimit: IContainerSizeLimit | undefined, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]];
7
+ type FitsContainerLogsArgs = [containerSizeLimit: Nullable<IContainerSizeLimit>, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]];
8
8
  export declare class FitsContainerRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, FitsContainerLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
9
9
  constructor(confidence: RuleConfidence);
10
10
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
11
- protected createLogMessage(selectedTrack: IVideoTrack, containerSizeLimit: IContainerSizeLimit | undefined, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]): string;
11
+ protected createLogMessage(selectedTrack: IVideoTrack, containerSizeLimit: Nullable<IContainerSizeLimit>, containerSizeFactor: number, abrTuning: ITuningConfig["autoTrackSelection"]): string;
12
12
  private getContainerSizeLimit;
13
13
  }
14
14
  export {};
@@ -1,12 +1,12 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
- import type { QualityLimits } from "@vkontakte/videoplayer-shared";
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
- type LowerLimitLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: ExactVideoQuality | undefined, highestAvailableQuality: ExactVideoQuality | undefined, limits: QualityLimits];
6
+ type LowerLimitLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, limits: QualityLimits];
7
7
  export declare class LowerLimitRule extends LimitBelowRule<IVideoTrack, IVideoAbrContext, LowerLimitLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
8
8
  constructor(confidence: RuleConfidence);
9
9
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
10
- protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: ExactVideoQuality | undefined, highestAvailableQuality: ExactVideoQuality | undefined, limits: QualityLimits): string;
10
+ protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, limits: QualityLimits): string;
11
11
  }
12
12
  export {};
@@ -1,9 +1,9 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
- import type { Kbps } from "@vkontakte/videoplayer-shared";
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 StallLogsArgs = [forwardBufferHealth: number | undefined, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig];
6
+ type StallLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig];
7
7
  export declare class StallsRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, StallLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
8
8
  private severeStallOccurred;
9
9
  private qualityRestrictionTimer;
@@ -12,7 +12,7 @@ export declare class StallsRule extends LimitAboveRule<IVideoTrack, IVideoAbrCon
12
12
  private predictedThroughputWithoutData;
13
13
  constructor(confidence: RuleConfidence);
14
14
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
15
- protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: number | undefined, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig): string;
15
+ protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, tuning: ITuningConfig): string;
16
16
  private updateStallQualityLimits;
17
17
  }
18
18
  export {};
@@ -1,12 +1,12 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
- import type { Kbps } from "@vkontakte/videoplayer-shared";
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: number | undefined, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig];
6
+ type ThroughputLogsArgs = [forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig];
7
7
  export declare class ThroughputRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, ThroughputLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
8
8
  constructor(confidence: RuleConfidence);
9
9
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
10
- protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: number | undefined, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig): string;
10
+ protected createLogMessage(selectedTrack: IVideoTrack, forwardBufferHealth: Nullable<number>, playbackRate: number, reserve: Kbps, playbackRateFactor: number, bitrateFactor: number, estimatedThroughput: Kbps, tuning: ITuningConfig): string;
11
11
  }
12
12
  export {};
@@ -1,12 +1,12 @@
1
1
  import type { IAbrRule, IAbrRuleResolution, IVideoAbrContext, RuleConfidence } from "../../types";
2
2
  import type { IVideoTrack } from "../../../../../player/types";
3
- import type { QualityLimits, VideoQuality } from "@vkontakte/videoplayer-shared";
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: ExactVideoQuality | undefined, highestAvailableQuality: ExactVideoQuality | undefined, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality];
6
+ type UpperLimitsLogsArgs = [limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality];
7
7
  export declare class UpperLimitsRule extends LimitAboveRule<IVideoTrack, IVideoAbrContext, UpperLimitsLogsArgs> implements IAbrRule<IVideoTrack, IVideoAbrContext> {
8
8
  constructor(confidence: RuleConfidence);
9
9
  execute(context: IVideoAbrContext): IAbrRuleResolution<IVideoTrack>;
10
- protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: ExactVideoQuality | undefined, highestAvailableQuality: ExactVideoQuality | undefined, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality): string;
10
+ protected createLogMessage(selectedTrack: IVideoTrack, limitsAreInvalid: boolean, lowestAvailableQuality: Nullable<ExactVideoQuality>, highestAvailableQuality: Nullable<ExactVideoQuality>, visible: boolean, limits: QualityLimits, backgroundVideoQualityLimit: VideoQuality): string;
11
11
  }
12
12
  export {};
@@ -0,0 +1,6 @@
1
+ import type { IVideoTrack } from "../../../../player/types";
2
+ import type { IAbrRule, IVideoAbrContext } from "../types";
3
+ import { RuleConfidence, VideoRuleName } from "../types";
4
+ export declare class VideoRuleFactory {
5
+ static createRule(ruleName: VideoRuleName, confidence?: RuleConfidence): IAbrRule<IVideoTrack, IVideoAbrContext>;
6
+ }
@@ -1,5 +1,5 @@
1
1
  import type { IAudioTrack, IBaseTrack, IVideoTrack } from "../../../player/types";
2
- import type { IComponentLogger, IObservable, IRectangle, IValueSubject, Kbps, Milliseconds, QualityLimits } from "@vkontakte/videoplayer-shared";
2
+ import type { 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";
@@ -12,6 +12,7 @@ export declare enum RuleConfidence {
12
12
  export declare enum VideoRuleName {
13
13
  Buffer = "buffer_rule",
14
14
  FitsContainer = "fits_container_rule",
15
+ FailedVideoTrack = "failed_video_track_rule",
15
16
  Stalls = "stalls_rule",
16
17
  LowerLimit = "lower_limit_rule",
17
18
  UpperLimit = "upper_limit_rule",
@@ -29,12 +30,12 @@ export interface IUpdatableAbrManagerContext {
29
30
  isAuto: boolean;
30
31
  videoTracks: IVideoTrack[];
31
32
  audioTracks: IAudioTrack[];
32
- currentVideoTrack: IVideoTrack | undefined;
33
- desiredVideoTrack: IVideoTrack | undefined;
33
+ currentVideoTrack: Nullable<IVideoTrack>;
34
+ desiredVideoTrack: Nullable<IVideoTrack>;
34
35
  limits: QualityLimits;
35
36
  forwardBufferHealth?: number;
36
- forwardVideoBufferRepresentations: Map<Representation["id"], Segment[]> | undefined;
37
- forwardAudioBufferRepresentations: Map<Representation["id"], Segment[]> | undefined;
37
+ forwardVideoBufferRepresentations: Nullable<Map<Representation["id"], Segment[]>>;
38
+ forwardAudioBufferRepresentations: Nullable<Map<Representation["id"], Segment[]>>;
38
39
  }
39
40
  export interface IInitAbrManagerContext {
40
41
  tuning: ITuningConfig;
@@ -44,6 +45,7 @@ export interface IInitAbrManagerContext {
44
45
  throughput$: IValueSubject<Kbps>;
45
46
  rtt$: IValueSubject<Milliseconds>;
46
47
  element: HTMLVideoElement;
48
+ failedVideoTrack: Nullable<IVideoTrack>;
47
49
  abrLogger: IComponentLogger;
48
50
  panelSize?: IRectangle;
49
51
  }
@@ -72,30 +74,30 @@ export interface IAbrRule<
72
74
  T extends IBaseTrack,
73
75
  C extends IBaseAbrControllerContext
74
76
  > {
75
- init(): void;
77
+ init(initContext: IInitAbrManagerContext): void;
76
78
  destroy(): void;
77
79
  execute(context: C): IAbrRuleResolution<T>;
78
80
  }
79
81
  export interface IAbrController<T extends IBaseTrack> {
80
- init(rules: IAbrRule<T, IBaseAbrControllerContext>[]): void;
82
+ init(rules: IAbrRule<T, IBaseAbrControllerContext>[], initContext: IInitAbrManagerContext): void;
81
83
  destroy(): void;
82
84
  updateContext(context: IBaseAbrControllerContext): void;
83
85
  autoSelectTrack(): T;
84
86
  }
85
87
  export interface IBaseAbrControllerContext extends IVideoTracksContext {
86
- currentVideoTrack: IVideoTrack | undefined;
87
- lastVideoTrackSelected: IVideoTrack | undefined;
88
+ currentVideoTrack: Nullable<IVideoTrack>;
89
+ lastVideoTrackSelected: Nullable<IVideoTrack>;
88
90
  tuning: ITuningConfig;
89
91
  abrLogger: IComponentLogger;
90
92
  estimatedThroughput: Kbps;
91
93
  reserve: Kbps;
92
- forwardBufferHealth: number | undefined;
94
+ forwardBufferHealth: Nullable<number>;
93
95
  playbackRate: number;
94
96
  }
95
97
  export interface IVideoAbrContext extends IBaseAbrControllerContext {
96
- container: IRectangle | undefined;
97
- panelSize: IRectangle | undefined;
98
- forwardBufferRepresentations: Map<Representation["id"], Segment[]> | undefined;
98
+ container: Nullable<IRectangle>;
99
+ panelSize: Nullable<IRectangle>;
100
+ forwardBufferRepresentations: Nullable<Map<Representation["id"], Segment[]>>;
99
101
  limits: QualityLimits;
100
102
  visible: boolean;
101
103
  severeStallOccurred: boolean;
@@ -1,3 +1,4 @@
1
+ import type { Nullable } from "@vkontakte/videoplayer-shared";
1
2
  import type { IAudioTrack, IBaseTrack, IVideoTrack } from "../../../player/types";
2
3
  export declare enum CompareTrack {
3
4
  Descending = -1,
@@ -10,4 +11,4 @@ export declare const getTrackComparator: <T extends IBaseTrack>(compareTrack: Co
10
11
  export declare const isLowerTrack: <T extends IBaseTrack>(track1: T, track2: T) => boolean;
11
12
  export declare const logBase: (base: number, x: number) => number;
12
13
  export declare const bitrateFactorFromBufferLevel: (forwardBufferHealth: number, emptyFactor: number, fullFactor: number) => number;
13
- export declare const getMinPossibleAudioForVideo: (videoTrack: IVideoTrack | undefined, sortedVideoTracksAsc: IVideoTrack[], sortedAudioTracksAsc: IAudioTrack[], minVideoAudioRatio: number) => IAudioTrack | undefined;
14
+ export declare const getMinPossibleAudioForVideo: (videoTrack: Nullable<IVideoTrack>, sortedVideoTracksAsc: IVideoTrack[], sortedAudioTracksAsc: IAudioTrack[], minVideoAudioRatio: number) => IAudioTrack | undefined;
@@ -1,5 +1,5 @@
1
1
  import type { ITuningConfig } from "./tuningConfig";
2
- import type { Kbps, Milliseconds, IRectangle, QualityLimits, IComponentLogger } from "@vkontakte/videoplayer-shared";
2
+ import type { Kbps, Milliseconds, IRectangle, QualityLimits, IComponentLogger, Nullable } from "@vkontakte/videoplayer-shared";
3
3
  import { type ExactVideoQuality } from "@vkontakte/videoplayer-shared";
4
4
  import type { IAudioTrack, IBaseTrack, IVideoTrack } from "../player/types";
5
5
  interface IConstraints<T extends IBaseTrack> {
@@ -11,6 +11,7 @@ interface IConstraints<T extends IBaseTrack> {
11
11
  playbackRate?: number;
12
12
  forwardBufferHealth?: number;
13
13
  current?: T;
14
+ failedVideoTrack?: Nullable<T>;
14
15
  visible?: boolean;
15
16
  history?: TrackHistory<T>;
16
17
  droppedVideoMaxQualityLimit?: ExactVideoQuality;
@@ -29,8 +30,8 @@ export declare class TrackHistory<T extends IBaseTrack> {
29
30
  export declare const defaultEmptyArrayErrorMessage = "Assertion \"ABR Tracks is empty array\" failed";
30
31
  export declare const getMinPossibleAudioForVideoOld: (videoTrack: IVideoTrack, videoTracks: IVideoTrack[], audioTracks: IAudioTrack[], minVideoAudioRatio: number) => IAudioTrack | undefined;
31
32
  export declare const getMinPossibleAudioForVideoNew: (videoTrack: IVideoTrack, videoTracks: IVideoTrack[], audioTracks: IAudioTrack[], minVideoAudioRatio: number) => IAudioTrack | undefined;
32
- export declare const autoSelectVideoTrackNew: (videoTracks: IVideoTrack[], { container, estimatedThroughput, tuning, limits, reserve, forwardBufferHealth, playbackRate, current, history, visible, droppedVideoMaxQualityLimit, stallsVideoMaxQualityLimit, stallsPredictedThroughput, abrLogger, panelSize }: IConstraints<IVideoTrack>) => IVideoTrack;
33
- export declare const autoSelectVideoTrackOld: (videoTracks: IVideoTrack[], { container, estimatedThroughput, tuning, limits, reserve, forwardBufferHealth, playbackRate, current, history, visible, droppedVideoMaxQualityLimit, stallsVideoMaxQualityLimit, stallsPredictedThroughput, abrLogger, panelSize }: IConstraints<IVideoTrack>) => IVideoTrack;
33
+ export declare const autoSelectVideoTrackNew: (videoTracks: IVideoTrack[], { container, estimatedThroughput, tuning, limits, reserve, forwardBufferHealth, playbackRate, current, failedVideoTrack, history, visible, droppedVideoMaxQualityLimit, stallsVideoMaxQualityLimit, stallsPredictedThroughput, abrLogger, panelSize }: IConstraints<IVideoTrack>) => IVideoTrack;
34
+ export declare const autoSelectVideoTrackOld: (videoTracks: IVideoTrack[], { container, estimatedThroughput, tuning, limits, reserve, forwardBufferHealth, playbackRate, current, failedVideoTrack, history, visible, droppedVideoMaxQualityLimit, stallsVideoMaxQualityLimit, stallsPredictedThroughput, abrLogger, panelSize }: IConstraints<IVideoTrack>) => IVideoTrack;
34
35
  export declare const autoSelectAudioTrackForVideoOld: (selectedVideoTrack: IVideoTrack, videoTracks: IVideoTrack[], audioTracks: IAudioTrack[], { estimatedThroughput, tuning, playbackRate, forwardBufferHealth, history, abrLogger, stallsPredictedThroughput }: IConstraints<IAudioTrack>) => IAudioTrack | undefined;
35
36
  export declare const autoSelectAudioTrackForVideoNew: (selectedVideoTrack: IVideoTrack, videoTracks: IVideoTrack[], audioTracks: IAudioTrack[], { estimatedThroughput, tuning, playbackRate, forwardBufferHealth, history, abrLogger, stallsPredictedThroughput }: IConstraints<IAudioTrack>) => IAudioTrack | undefined;
36
37
  export {};
@@ -4,6 +4,7 @@ import { AndroidPreferredFormat } from "../enums/AndroidPreferredFormat";
4
4
  import { IOSPreferredFormat } from "../enums/IOSPreferredFormat";
5
5
  import type { Byte, Milliseconds, RecursivePartial, Seconds } from "@vkontakte/videoplayer-shared";
6
6
  import { type ExactVideoQuality, VideoQuality } from "@vkontakte/videoplayer-shared";
7
+ import { AudioRuleName, VideoRuleName } from "../providers/utils/Abr/types";
7
8
  export type ITuningConfig = {
8
9
  /** @deprecated */
9
10
  configName?: string[];
@@ -119,8 +120,10 @@ export type ITuningConfig = {
119
120
  representationSwitchForwardBufferGap: Milliseconds;
120
121
  crashOnStallTimeout: Milliseconds;
121
122
  crashOnStallTWithoutDataTimeout: Milliseconds;
123
+ restoreBufferBeforeCrashTimeout: Milliseconds;
122
124
  enableSubSegmentBufferFeeding: boolean;
123
125
  bufferEmptinessTolerance: Milliseconds;
126
+ virtualBufferEmptinessTolerance: Milliseconds;
124
127
  useNewRepresentationSwitch: boolean;
125
128
  useDelayedRepresentationSwitch: boolean;
126
129
  useSmartRepresentationSwitch: boolean;
@@ -147,9 +150,13 @@ export type ITuningConfig = {
147
150
  minSafeBufferToPlay: Milliseconds;
148
151
  useBufferHoldingOnlyOnStall: boolean;
149
152
  useAbortResetNativeBufferMutex: boolean;
150
- useNewStallExitPolicy: boolean;
151
153
  useNewAbr: boolean;
154
+ abrVideoRules: VideoRuleName[];
155
+ abrAudioRules: AudioRuleName[];
152
156
  useDynamicBirtateRule: boolean;
157
+ useNewFailoverLogic: boolean;
158
+ useFailoverHostsOnAllProviderCrash: boolean;
159
+ videoTrackBanAfterProviderFail: Milliseconds;
153
160
  videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodec][];
154
161
  };
155
162
  dashCmafLive: {