@vkontakte/videoplayer-core 2.0.168-dev.f65ee4e4e.0 → 2.0.169-dev.2cfd41de6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/videoplayer-core",
3
- "version": "2.0.168-dev.f65ee4e4e.0",
3
+ "version": "2.0.169-dev.2cfd41de6.0",
4
4
  "author": "vk.ru",
5
5
  "description": "Videoplayer core library based on the vk.ru platform",
6
6
  "homepage": "https://vk.ru",
@@ -42,6 +42,6 @@
42
42
  "**/*.d.ts"
43
43
  ],
44
44
  "dependencies": {
45
- "@vkontakte/videoplayer-shared": "1.0.97-dev.f65ee4e4e.0"
45
+ "@vkontakte/videoplayer-shared": "1.0.98-dev.2cfd41de6.0"
46
46
  }
47
47
  }
@@ -0,0 +1,110 @@
1
+ import type { Fetcher, FetchParamsWithUrl, Priority, RepresentationFetchResult } from "../../fetcher";
2
+ import type { CommonInit, ContainerParser, Representation, Segment } from "../../../../utils/parsers/types";
3
+ import { StreamKind } from "../../../../utils/parsers/types";
4
+ import type { ITuningConfig } from "../../../../../utils/tuningConfig";
5
+ import type { Byte, IError, IRange, ISubject, ITracer, IValueSubject, Milliseconds, Seconds } from "@vkontakte/videoplayer-shared";
6
+ import { abortable, Subscription } from "@vkontakte/videoplayer-shared";
7
+ import type { NativeBufferManager } from "../nativeBufferManager";
8
+ import { SwithRepresentationMode, type Dependencies, type IBufferPlaybackQueueItem, type ISomeDataLoadedCallbackParams, type IVirtualBufferManager } from "../types";
9
+ import type { VideoSegmentLoadProgress } from "../../../../utils/Abr/types";
10
+ export declare abstract class BaseVirtualBufferManager<T extends Segment> implements IVirtualBufferManager<T> {
11
+ error$: ISubject<IError>;
12
+ playingRepresentation$: IValueSubject<Representation["id"] | undefined>;
13
+ playingRepresentationInit$: IValueSubject<CommonInit | undefined>;
14
+ currentSegmentLength$: IValueSubject<number>;
15
+ onLastSegment$: IValueSubject<boolean>;
16
+ fullyBuffered$: IValueSubject<boolean>;
17
+ protected readonly kind: StreamKind;
18
+ protected readonly nativeBufferManager: NativeBufferManager;
19
+ protected readonly fetcher: Fetcher;
20
+ protected readonly tracer: ITracer;
21
+ protected readonly tuning: ITuningConfig;
22
+ protected representations: Map<Representation["id"], Representation>;
23
+ protected playingRepresentationId: Representation["id"] | undefined;
24
+ protected downloadingRepresentationId: Representation["id"] | undefined;
25
+ protected switchingRepresentationId: Representation["id"] | null;
26
+ protected initData: Map<Representation["id"], ArrayBuffer>;
27
+ protected initDataPromises: Map<Representation["id"], Promise<RepresentationFetchResult<T> | null | undefined>>;
28
+ protected idleCallbacks: Map<Representation["id"], number>;
29
+ protected parsedInitData: Map<Representation["id"], CommonInit>;
30
+ protected forwardBufferRepresentations: Map<Representation["id"], T[]>;
31
+ protected segments: Map<Representation["id"], T[]>;
32
+ protected containerParser: ContainerParser;
33
+ protected bufferPlaybackQueue: IBufferPlaybackQueueItem<T>[];
34
+ protected downloadingBufferItems: IBufferPlaybackQueueItem<T>[];
35
+ protected preloadOnly: boolean;
36
+ protected forwardBufferTarget: Milliseconds;
37
+ protected failedDownloads: number;
38
+ protected lastDataObtainedTimestampMs: Milliseconds;
39
+ protected loadByteRangeSegmentsTimeoutId: number;
40
+ protected currentVirtualBufferSize: Byte;
41
+ private baseUrls;
42
+ private baseUrlsIndex;
43
+ protected maintainAbortController: AbortController;
44
+ protected maintainMutexPromise: Promise<void> | null;
45
+ protected bufferClearingMutex: boolean;
46
+ protected abortNativeBufferMutex: boolean;
47
+ protected switchMutex: boolean;
48
+ protected seekMutex: boolean;
49
+ protected destroyAbortController: AbortController;
50
+ protected switchAbortController: AbortController;
51
+ protected downloadAbortController: AbortController;
52
+ protected subscription: Subscription;
53
+ protected readonly getCurrentPosition: () => Milliseconds | undefined;
54
+ protected readonly getCurrentStallDuration: () => Milliseconds | undefined;
55
+ protected constructor(kind: StreamKind, nativeBufferManager: NativeBufferManager, representations: Representation[], { fetcher, tracer, tuning, getCurrentPosition, getCurrentStallDuration, manifest }: Dependencies);
56
+ protected abstract loadItems(itemsToLoad: IBufferPlaybackQueueItem<T>[], representation: Representation, priority?: Priority): Promise<void>;
57
+ protected abstract selectItemsToLoad(): IBufferPlaybackQueueItem<T>[];
58
+ protected abstract prepareFetchParams(items: IBufferPlaybackQueueItem<T>[], representation: Representation): FetchParamsWithUrl;
59
+ protected abstract onSomeDataLoaded(data: ISomeDataLoadedCallbackParams<T>): Promise<void>;
60
+ protected abstract updateRepresentationBaseUrl(representation: Representation, newBaseUrl: string): void;
61
+ startWith: ReturnType<typeof abortable<[Representation["id"]]>>;
62
+ switchTo(newRepresentationId: Representation["id"], mode?: SwithRepresentationMode): Promise<void>;
63
+ protected getSwitchWithAbort(switchToTracer: ITracer): ReturnType<typeof abortable<[Representation["id"], SwithRepresentationMode], void>>;
64
+ prepareSeek(): Promise<void>;
65
+ seek(position: Milliseconds | undefined): Promise<void>;
66
+ maintain(currentPosition?: Milliseconds | undefined): Promise<void>;
67
+ getForwardBufferRepresentations(currentPosition?: Milliseconds | undefined): Map<Representation["id"], T[]>;
68
+ getForwardPlaybackBufferDuration(currentPosition?: Milliseconds | undefined): Milliseconds;
69
+ getPlaybackBufferState(): IRange<Milliseconds> | null;
70
+ abort(): Promise<void>;
71
+ findSegmentStartTime(position: Milliseconds): Milliseconds | undefined;
72
+ getRepresentationInitialTime(): Seconds;
73
+ getMutexInfo(): string;
74
+ calculateDurationFromSegments(): Milliseconds;
75
+ getActiveSegmentProgress(): VideoSegmentLoadProgress | undefined;
76
+ getMpdSegmentDuration(): Milliseconds | undefined;
77
+ get lastDataObtainedTimestamp(): Milliseconds;
78
+ setTarget(time: Milliseconds): void;
79
+ setPreloadOnly(preloadOnly: boolean): void;
80
+ destroy(): void;
81
+ protected verifyBufferPlaybackQueue(position: Milliseconds): Promise<void>;
82
+ protected forceSwitchCondition(oldRepresentation: Representation, newRepresentation: Representation): boolean;
83
+ protected clearBuffer(): Promise<void>;
84
+ protected abortDownload(): void;
85
+ protected abortDownloadingItems(): void;
86
+ protected abortNativeBuffer(): Promise<boolean>;
87
+ protected loadInits(): Promise<void>;
88
+ protected loadInitIfNeeded(representation: Representation, requestedPriority?: Priority, critical?: boolean): Promise<void>;
89
+ protected loadInit(representation: Representation, requestedPriority?: Priority, critical?: boolean): Promise<void>;
90
+ private isMaintainNativeBufferMutexActive;
91
+ protected maintainNativeBuffer(signal: AbortSignal): Promise<void>;
92
+ protected maintainPlaybackBuffer(position: Milliseconds): Promise<void>;
93
+ protected actualizeLastSegmentInfo(currentPosition: Milliseconds): void;
94
+ protected selectDownloadingItems(position: Milliseconds, segments: T[]): IBufferPlaybackQueueItem<T>[];
95
+ protected processCachedItems(): void;
96
+ protected withinInterval(currentPosition: Milliseconds | undefined, { from, to }: IRange<Milliseconds>, leftTolerance?: Milliseconds, rightTolerance?: Milliseconds): boolean;
97
+ protected withinAppendInterval(currentPosition: Milliseconds | undefined, { from, to }: IRange<Milliseconds>): boolean;
98
+ protected withinRemoveInterval(currentPosition: Milliseconds | undefined, { to }: IRange<Milliseconds>): boolean;
99
+ protected getExponentialDownloadDelay(): ReturnType<typeof abortable>;
100
+ protected waitExponentialDownloadDelay(): Promise<void>;
101
+ protected appendSegmentFully(nextPlayingItem: IBufferPlaybackQueueItem<T>, signal: AbortSignal): Promise<void>;
102
+ protected appendSegmentPartially(nextPlayingItem: IBufferPlaybackQueueItem<T>, signal: AbortSignal): Promise<void>;
103
+ protected parseFeedableSegmentChunk(chunk: DataView): DataView | null;
104
+ protected onItemFullyDownloaded(downloadedItem: IBufferPlaybackQueueItem<T>): void;
105
+ protected onItemFullyAppended(appendedItem: IBufferPlaybackQueueItem<T>): void;
106
+ protected removeSegment(nextRemoveItem: IBufferPlaybackQueueItem<T>, signal: AbortSignal): Promise<void>;
107
+ protected onDownloadItem(downloadedItem: IBufferPlaybackQueueItem<T>): void;
108
+ protected pruneVirtualBuffer(currentPosition: Milliseconds): void;
109
+ protected updateRepresentationsBaseUrlIfNeeded(): void;
110
+ }
@@ -0,0 +1,21 @@
1
+ import { BaseVirtualBufferManager } from "./baseVirtualBufferManager.versionA";
2
+ import type { Dependencies, IBufferPlaybackQueueItem, ISomeDataLoadedCallbackParams, IVirtualBufferManager } from "../types";
3
+ import type { ByteRangeSegment, Representation, StreamKind } from "../../../../utils/parsers/types";
4
+ import type { NativeBufferManager } from "../nativeBufferManager";
5
+ import type { FetchParamsWithUrl, Priority } from "../../fetcher";
6
+ export declare class ByteRangeVirtualBufferManager extends BaseVirtualBufferManager<ByteRangeSegment> implements IVirtualBufferManager<ByteRangeSegment> {
7
+ constructor(kind: StreamKind, nativeBufferManager: NativeBufferManager, representations: Representation[], dependencies: Dependencies);
8
+ protected override loadItems(itemsToLoad: IBufferPlaybackQueueItem<ByteRangeSegment>[], representation: Representation, priority?: Priority): Promise<void>;
9
+ protected override selectItemsToLoad(): IBufferPlaybackQueueItem<ByteRangeSegment>[];
10
+ protected override prepareFetchParams(items: IBufferPlaybackQueueItem<ByteRangeSegment>[], representation: Representation): FetchParamsWithUrl;
11
+ /**
12
+ * Закидываем в буфер сегменты атомарнее чем сегмент целиком. Например, по боксам в мпеге и по блокам в вебме.
13
+ * Таким образом не ждём его полной загрузки и готовы играть его намного быстрее
14
+ * @param dataView – данные, размер буфера – весь запрос
15
+ * @param globalFrom – Отступ dataView от начала файла, совпадает с отсупами сегментов
16
+ * @param loaded – Объём загруженных в dataView данных (всё что больше – пока нули)
17
+ * @private
18
+ */
19
+ protected override onSomeDataLoaded({ downloadingItems, dataView, representationId, globalFrom, loaded, signal }: ISomeDataLoadedCallbackParams<ByteRangeSegment>): Promise<void>;
20
+ protected override updateRepresentationBaseUrl(representation: Representation, newBaseUrl: string): void;
21
+ }
@@ -0,0 +1,21 @@
1
+ import { BaseVirtualBufferManager } from "./baseVirtualBufferManager.versionA";
2
+ import type { Dependencies, IBufferPlaybackQueueItem, ISomeDataLoadedCallbackParams, IVirtualBufferManager } from "../types";
3
+ import type { TemplateSegment, Representation, StreamKind } from "../../../../utils/parsers/types";
4
+ import type { NativeBufferManager } from "../nativeBufferManager";
5
+ import type { FetchParamsWithUrl, Priority } from "../../fetcher";
6
+ export declare class TemplateVirtualBufferManager extends BaseVirtualBufferManager<TemplateSegment> implements IVirtualBufferManager<TemplateSegment> {
7
+ constructor(kind: StreamKind, nativeBufferManager: NativeBufferManager, representations: Representation[], dependencies: Dependencies);
8
+ protected override loadItems(itemsToLoad: IBufferPlaybackQueueItem<TemplateSegment>[], representation: Representation, priority?: Priority): Promise<void>;
9
+ protected override selectItemsToLoad(): IBufferPlaybackQueueItem<TemplateSegment>[];
10
+ protected override prepareFetchParams(items: IBufferPlaybackQueueItem<TemplateSegment>[], representation: Representation): FetchParamsWithUrl;
11
+ protected getFetchUrl(items: IBufferPlaybackQueueItem<TemplateSegment>[], representation: Representation): URL;
12
+ /**
13
+ * Закидываем в буфер сегменты атомарнее чем сегмент целиком. Например, по боксам в мпеге и по блокам в вебме.
14
+ * Таким образом не ждём его полной загрузки и готовы играть его намного быстрее
15
+ * @param dataView – данные, размер буфера – весь запрос
16
+ * @param loaded – Объём загруженных в dataView данных (всё что больше – пока нули)
17
+ * @private
18
+ */
19
+ protected override onSomeDataLoaded({ downloadingItems, dataView, representationId, loaded, signal }: ISomeDataLoadedCallbackParams<TemplateSegment>): Promise<void>;
20
+ protected override updateRepresentationBaseUrl(representation: Representation, newBaseUrl: string): void;
21
+ }
@@ -1,6 +1,7 @@
1
1
  import type { Representation, StreamKind } from "../../../../utils/parsers/types";
2
2
  import type { NativeBufferManager } from "../nativeBufferManager";
3
3
  import type { Dependencies, IVirtualBufferManager } from "../types";
4
+ import type { ITuningConfig } from "../../../../../utils/tuningConfig";
4
5
  export declare class VirtualBufferFactory {
5
- static getBufferManager(kind: StreamKind, nativeBufferManager: NativeBufferManager, representations: Representation[], dependencies: Dependencies): IVirtualBufferManager;
6
+ static getBufferManager(kind: StreamKind, nativeBufferManager: NativeBufferManager, representations: Representation[], dependencies: Dependencies, tuning: ITuningConfig): IVirtualBufferManager;
6
7
  }
@@ -9,6 +9,7 @@ interface IConnectData {
9
9
  isSeeked$: IObservable<boolean>;
10
10
  looped$: IObservable<Seconds>;
11
11
  playing$: IObservable<undefined>;
12
+ pause$: IObservable<undefined>;
12
13
  currentStallDuration$: IValueSubject<Milliseconds>;
13
14
  tuning: ITuningConfig["stallsManager"];
14
15
  abrParams: ITuningConfig["autoTrackSelection"];
@@ -24,6 +25,7 @@ declare class StallsManager {
24
25
  private duration;
25
26
  private isSeeked$;
26
27
  private isBuffering$;
28
+ private isPaused;
27
29
  private maxQualityLimit;
28
30
  private lastUniqueVideoTrackSelected;
29
31
  private currentStallsCount;
@@ -23,6 +23,7 @@ export declare class DeviceChecker implements Checker {
23
23
  get os(): OS;
24
24
  get details(): DeviceDetails;
25
25
  get isIOS(): boolean;
26
+ get isIPadOS(): boolean;
26
27
  get isMac(): boolean;
27
28
  get isApple(): boolean;
28
29
  get isIphoneOrOldIpad(): boolean;
@@ -32,10 +33,6 @@ export declare class DeviceChecker implements Checker {
32
33
  get isMobile(): boolean;
33
34
  get iOSVersion(): number | undefined;
34
35
  detect(): void;
35
- getMediaDevices(): Promise<{
36
- cameras: MediaDeviceInfo[];
37
- microphones: MediaDeviceInfo[];
38
- } | undefined>;
39
36
  private detectHighEntropyValues;
40
37
  private detectDevice;
41
38
  private detectOS;
@@ -141,6 +141,7 @@ export type ITuningConfig = {
141
141
  useTotalStallsDurationPerTvt: boolean;
142
142
  useAverageStallsDurationPerTvt: boolean;
143
143
  useEmaStallsDurationPerTvt: boolean;
144
+ ignoreStallsOnPause: boolean;
144
145
  };
145
146
  droppedFramesChecker: {
146
147
  enabled: boolean;
@@ -175,6 +176,7 @@ export type ITuningConfig = {
175
176
  virtualBufferEmptinessTolerance: Milliseconds;
176
177
  useBufferQueueVerification: boolean;
177
178
  useVirtualBufferImplicitSeek: boolean;
179
+ bufferQueueVerificationMinPosition: Milliseconds;
178
180
  useNewRepresentationSwitch: boolean;
179
181
  useDelayedRepresentationSwitch: boolean;
180
182
  useSmartRepresentationSwitch: boolean;
@@ -353,6 +355,7 @@ export type ITuningConfig = {
353
355
  useNewSwitchTo: boolean;
354
356
  alwaysAbortPreviousSwitch: boolean;
355
357
  useDashProviderVirtual: boolean;
358
+ useDashProviderVirtualVersionA: boolean;
356
359
  useDashProviderVirtualMobile: boolean;
357
360
  useNewAutoSelectVideoTrack: boolean;
358
361
  useSafariEndlessRequestBugfix: boolean;