@vkontakte/videoplayer-core 2.0.171-dev.ed76c949d.0 → 2.0.171

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 +161 -49
  2. package/es2015.esm.js +160 -48
  3. package/esnext.cjs +158 -46
  4. package/esnext.esm.js +158 -46
  5. package/evergreen.esm.js +158 -46
  6. package/package.json +2 -2
  7. package/types/player/Player.d.ts +0 -1
  8. package/types/providers/DashLiveProvider/utils/LiveDashPlayer.d.ts +9 -3
  9. package/types/providers/DashProvider/baseDashProvider.d.ts +4 -1
  10. package/types/providers/DashProvider/lib/sourceBufferTaskQueue.d.ts +2 -1
  11. package/types/providers/DashProviderVirtual/baseDashProvider.d.ts +3 -1
  12. package/types/providers/DashProviderVirtual/lib/buffer/nativeBufferManager.d.ts +1 -1
  13. package/types/providers/DashProviderVirtual/lib/buffer/sourceBufferTaskQueue.d.ts +2 -1
  14. package/types/providers/ProviderContainer/Mayday/heuristics/HangupHeuristic.d.ts +23 -0
  15. package/types/providers/ProviderContainer/Mayday/index.d.ts +1 -2
  16. package/types/providers/ProviderContainer/Mayday/types.d.ts +0 -1
  17. package/types/providers/ProviderContainer/index.d.ts +1 -0
  18. package/types/providers/ProviderContainer/utils/formatsSupport.d.ts +1 -0
  19. package/types/providers/ProviderContainer/utils/playbackHangup.d.ts +2 -6
  20. package/types/providers/utils/Abr/abrController.d.ts +1 -4
  21. package/types/providers/utils/Abr/abrManager.d.ts +0 -1
  22. package/types/providers/utils/Abr/controllers/stallsController.d.ts +1 -8
  23. package/types/providers/utils/Abr/rules/audio/audioThroughputRule.d.ts +2 -2
  24. package/types/providers/utils/Abr/rules/audio/minAudioForVideoRule.d.ts +2 -2
  25. package/types/providers/utils/Abr/rules/baseRule.d.ts +2 -2
  26. package/types/providers/utils/Abr/rules/video/abandonRequestRule.d.ts +2 -2
  27. package/types/providers/utils/Abr/rules/video/bolaRule.d.ts +2 -2
  28. package/types/providers/utils/Abr/rules/video/bufferRule.d.ts +2 -2
  29. package/types/providers/utils/Abr/rules/video/downloadTimeRule.d.ts +15 -0
  30. package/types/providers/utils/Abr/rules/video/failedVideoTrackRule.d.ts +14 -0
  31. package/types/providers/utils/Abr/rules/video/fitsContainerRule.d.ts +2 -2
  32. package/types/providers/utils/Abr/rules/video/insufficientBufferRule.d.ts +2 -2
  33. package/types/providers/utils/Abr/rules/video/lowerLimitRule.d.ts +2 -2
  34. package/types/providers/utils/Abr/rules/video/stallsRule.d.ts +2 -6
  35. package/types/providers/utils/Abr/rules/video/throughputRule.d.ts +2 -2
  36. package/types/providers/utils/Abr/rules/video/tvDisabledVideoTrackRule.d.ts +2 -2
  37. package/types/providers/utils/Abr/rules/video/upperLimitRule.d.ts +2 -2
  38. package/types/providers/utils/Abr/types.d.ts +8 -6
  39. package/types/providers/utils/Abr/utils.d.ts +3 -1
  40. package/types/providers/utils/HTMLVideoElement/destroy.d.ts +1 -1
  41. package/types/providers/utils/HTMLVideoElement/pool.d.ts +3 -2
  42. package/types/utils/autoSelectTrack.d.ts +4 -3
  43. package/types/utils/buffer/dynamicBufferTarget.d.ts +10 -0
  44. package/types/utils/tuningConfig.d.ts +33 -24
  45. package/types/providers/ProviderContainer/Mayday/GraceTimeout.d.ts +0 -17
  46. package/types/providers/ProviderContainer/Mayday/heuristics/StartupHangupHeuristic.d.ts +0 -46
  47. package/types/providers/ProviderContainer/Mayday/heuristics/TvFetcherErrorHeuristic.d.ts +0 -10
  48. package/types/utils/timers.d.ts +0 -2
@@ -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 {};
@@ -0,0 +1,10 @@
1
+ import type { Kbps, Milliseconds, Nullable } from "@vkontakte/videoplayer-shared";
2
+ import type { ITuningConfig } from "../tuningConfig";
3
+ type DynamicBufferTargetConfig = ITuningConfig["dash"]["dynamicBufferTarget"];
4
+ export interface IDynamicBufferTargetState {
5
+ throughputKbps: Kbps;
6
+ currentBitrateKbps: Nullable<Kbps>;
7
+ baseTargetMs: Milliseconds;
8
+ }
9
+ export declare const computeDynamicBufferTarget: (state: IDynamicBufferTargetState, config: DynamicBufferTargetConfig) => Milliseconds;
10
+ export {};
@@ -2,7 +2,7 @@ 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";
5
- import type { Byte, Kbps, Milliseconds, RecursivePartial, Seconds, TimerModule } from "@vkontakte/videoplayer-shared";
5
+ import type { Byte, Kbps, Milliseconds, RecursivePartial, Seconds } from "@vkontakte/videoplayer-shared";
6
6
  import { type ExactVideoQuality, VideoQuality } from "@vkontakte/videoplayer-shared";
7
7
  import { AudioRuleName, VideoRuleName } from "../providers/utils/Abr/types";
8
8
  export type ITuningConfig = {
@@ -13,23 +13,24 @@ export type ITuningConfig = {
13
13
  playingUnstableThresholdMs: Milliseconds;
14
14
  /** Список имён включённых эвристик. Пустой массив = все эвристики выключены */
15
15
  heuristics: string[];
16
- /** Множитель уменьшения grace-таймаута при каждом поступлении данных в StartupHangupHeuristic */
17
- hangupGraceDecayFactor: number;
18
- /** Минимальный grace-таймаут (мс). При достижении — следующий decay возвращает 0 (немедленный expire) */
19
- hangupGraceMinTimeoutMs: Milliseconds;
20
- /**
21
- * Если true — audible (не muted) хэнгап в hidden-вкладке откладывается до возврата на visible (reinit),
22
- * desired state при этом не меняется.
23
- * Если false — audible хэнгап в hidden-вкладке мониторится: данные перезапускают decay-таймер,
24
- * при ≥3 поступлениях данных без завершения перехода — эскалация в switch_codec/switch_provider.
25
- */
26
- deferAudibleHangupOnHiddenTab: boolean;
27
16
  };
28
17
  /**
18
+ * Если true, внутренний video элемент не будет уничтожаться при реините провайдера
19
+ * и при создании нового экземляра Player.
20
+ * Будет веcти себя аналогично элементу переданному снаружи
21
+ * Для кейса прямого использовани ядра
22
+ */
23
+ keepVideoElement: boolean;
24
+ /**
25
+ * Временный флаг для тестирования очистки video элемента
26
+ * Если true, при очистке будет вызван innerHTML = '' для очистки дочерних элементов трэков
27
+ * В противном случае они размножаются
28
+ */
29
+ clearVideoElementInnerHTML: boolean;
30
+ /**
29
31
  * Включает очистку состояния плеера при вызове метода stop()
30
32
  */
31
33
  allowPlayerReuse: boolean;
32
- useWorkerTimers: TimerModule[];
33
34
  throughputEstimator: {
34
35
  type: "TwoEma" | "EmaAndMa";
35
36
  emaAlphaSlow: number;
@@ -118,7 +119,6 @@ export type ITuningConfig = {
118
119
  activeVideoAreaThreshold: number;
119
120
  trafficSavingLimit: ExactVideoQuality;
120
121
  highQualityLimit: ExactVideoQuality;
121
- lowQualityTelemetryLimit: ExactVideoQuality;
122
122
  };
123
123
  stallsManager: {
124
124
  enabled: boolean;
@@ -159,6 +159,7 @@ export type ITuningConfig = {
159
159
  forwardBufferTargetManual: Milliseconds;
160
160
  forwardBufferTargetPreload: Milliseconds;
161
161
  audioBufferAheadOfVideoMs: Milliseconds;
162
+ useDynamicBufferTarget: boolean;
162
163
  seekBiasInTheEnd: Milliseconds;
163
164
  maxSegmentDurationLeftToSelectNextSegment: Milliseconds;
164
165
  minSafeBufferThreshold: number;
@@ -181,12 +182,14 @@ export type ITuningConfig = {
181
182
  useSmartRepresentationSwitch: boolean;
182
183
  stallForceSeekOncePerStall: boolean;
183
184
  useFetchPriorityHints: boolean;
185
+ useAbortMSEFix: boolean;
184
186
  enableBaseUrlSupport: boolean;
185
187
  maxSegmentRetryCount: number;
186
188
  sourceOpenTimeout: number;
187
189
  vktvAbrThrottle: number;
188
190
  timeupdateEventTickThrottle: number;
189
191
  fetcherBufferOptimisation: boolean;
192
+ codecsPrioritizeEnabled: boolean;
190
193
  usePersistentGaps: boolean;
191
194
  abrThrottle: number;
192
195
  useVideoElementWaitingCurrentTimeReassign: boolean;
@@ -205,7 +208,9 @@ export type ITuningConfig = {
205
208
  abrVideoRules: VideoRuleName[];
206
209
  abrAudioRules: AudioRuleName[];
207
210
  useDynamicBirtateRule: boolean;
211
+ useNewFailoverLogic: boolean;
208
212
  useFailoverHostsOnAllProviderCrash: boolean;
213
+ videoTrackBanAfterProviderFail: Milliseconds;
209
214
  saveData3gQualityLimit: ExactVideoQuality;
210
215
  saveData2gQualityLimit: ExactVideoQuality;
211
216
  useConnectionDataUpperLimit: boolean;
@@ -233,14 +238,26 @@ export type ITuningConfig = {
233
238
  budgetFactor: number;
234
239
  fallbackSegmentDurationMs: Milliseconds;
235
240
  };
241
+ dynamicBufferTarget: {
242
+ maxMs: Milliseconds;
243
+ optimisticHeadroomLow: number;
244
+ optimisticHeadroomHigh: number;
245
+ weakThroughputLowKbps: Kbps;
246
+ weakThroughputHighKbps: Kbps;
247
+ maxFactor: number;
248
+ };
236
249
  videoStreamRepresentaionsFilter: [VideoQuality, number, VideoCodecName][];
237
250
  filterOnDemandQualityList: boolean;
238
251
  dashMaxTvVideoQuality: boolean;
239
252
  checkRepresentationCanPlayType: Extract<CanPlayTypeResult, "maybe" | "probably"> | false;
240
253
  preloadFirstSegment: boolean;
241
254
  maxQualityForFirstSegmentPreload: ExactVideoQuality;
242
- /** Включает отправку телеметрии трейсера (resume) при превышении stall watchdog */
243
- tracerResumeOnUnexpectedStall: boolean;
255
+ downloadTime: {
256
+ minLookaheadSegments: number;
257
+ safetyFactor: number;
258
+ bootstrapBufferMs: Milliseconds;
259
+ demandTolerance: number;
260
+ };
244
261
  };
245
262
  dashCmafLive: {
246
263
  externalStopControl: boolean;
@@ -437,14 +454,6 @@ export type ITuningConfig = {
437
454
  useDurationFromSegments: boolean;
438
455
  /** включен режим проигрывания только аудио (без видео) */
439
456
  audioOnly: boolean;
440
- /**
441
- * Переводить провайдер в READY по loadedmetadata вместо canplay.
442
- * canplay означает, что видео уже может играться, что избыточно для READY —
443
- * достаточно получить манифест (loadedmetadata).
444
- * Применяется только когда желаемое состояние — READY (preload): при автоплее
445
- * провайдер по-прежнему ждёт canplay, чтобы play() не вызывался до появления данных.
446
- */
447
- readyOnLoadedMetadata: boolean;
448
457
  };
449
458
  export type IOptionalTuningConfig = RecursivePartial<ITuningConfig>;
450
459
  export declare const fillDefault: (partial: IOptionalTuningConfig) => ITuningConfig;
@@ -1,17 +0,0 @@
1
- import type { Milliseconds } from "@vkontakte/videoplayer-shared";
2
- /**
3
- * Декрементный grace-таймаут: каждый вызов `decay()` уменьшает оставшееся время.
4
- *
5
- * После создания `current` возвращает начальное значение.
6
- * Каждый вызов `decay()` умножает `remaining` на `decayFactor`, но не меньше `minTimeout`.
7
- * Когда `remaining` достигает `minTimeout` — следующий `decay()` возвращает 0 (expire).
8
- */
9
- export declare class GraceTimeout {
10
- private remaining;
11
- private readonly decayFactor;
12
- private readonly minTimeout;
13
- constructor(initialTimeout: Milliseconds, decayFactor: number, minTimeout: Milliseconds);
14
- get current(): Milliseconds;
15
- decay(): Milliseconds;
16
- reset(initialTimeout: Milliseconds): void;
17
- }
@@ -1,46 +0,0 @@
1
- import { Subject } from "@vkontakte/videoplayer-shared";
2
- import type { IError } from "@vkontakte/videoplayer-shared";
3
- import type { IHeuristicDeps, IMaydayEvent } from "../types";
4
- import type { IAsyncHeuristic, HeuristicResult } from "./IHeuristic";
5
- /**
6
- * Эвристика зависания перехода stopped-*.
7
- *
8
- * В зависимости от видимости вкладки и наличия звука выбирает стратегию
9
- * и эмитит одну из рекомендаций:
10
- *
11
- * Visible-вкладка: grace-таймаут с уменьшением таймаута на поступление данных.
12
- * — данные поступают → таймер продлевается.
13
- * — grace истёк без прогресса → emit switch_codec (или switch_provider).
14
- *
15
- * Hidden-вкладка (audible): та же grace-модель с таймаутом (таймеры в воркере не тротлятся).
16
- * — данные поступают → таймер продлевается.
17
- * — grace истёк без прогресса → emit switch_codec.
18
- *
19
- * Hidden-вкладка (muted/deferred): молча ждём возврата на visible, desired state не трогаем.
20
- * — вкладка стала visible → emit reinit (полный реинит сам восстановит воспроизведение).
21
- * — переход всё-таки завершился в фоне (видео заиграло) → отмена, reinit не нужен.
22
- */
23
- export declare class StartupHangupHeuristic implements IAsyncHeuristic {
24
- private deps;
25
- static readonly heuristicName = "StartupHangupHeuristic";
26
- readonly type = "async";
27
- readonly recommendation$: Subject<IMaydayEvent>;
28
- private timerId;
29
- private subscription;
30
- private error;
31
- private grace;
32
- private hangupStartedAt;
33
- private dataArrivals;
34
- private hiddenWaitActive;
35
- constructor(deps: IHeuristicDeps);
36
- analyze(error: IError): HeuristicResult;
37
- private startMonitoring;
38
- private waitForVisible;
39
- private restartTimer;
40
- private recommendSwitch;
41
- private isTabHidden;
42
- private logOutcome;
43
- private cancel;
44
- reset(): void;
45
- destroy(): void;
46
- }
@@ -1,10 +0,0 @@
1
- import type { IError } from "@vkontakte/videoplayer-shared";
2
- import type { IHeuristicDeps } from "../types";
3
- import type { ISyncHeuristic, HeuristicResult } from "./IHeuristic";
4
- export declare class TvFetcherErrorHeuristic implements ISyncHeuristic {
5
- private _deps;
6
- static readonly heuristicName = "TvFetcherErrorHeuristic";
7
- readonly type = "sync";
8
- constructor(_deps: IHeuristicDeps);
9
- analyze(error: IError): HeuristicResult;
10
- }
@@ -1,2 +0,0 @@
1
- import type { ITimers } from "@vkontakte/videoplayer-shared";
2
- export declare const timers: ITimers;