@vkontakte/videoplayer-core 2.0.131-dev.abb2b2b1.0 → 2.0.131-dev.c93c80a1.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/es2015.cjs.js +91 -30
- package/es2015.esm.js +93 -32
- package/es2018.cjs.js +91 -30
- package/es2018.esm.js +93 -32
- package/es2024.cjs.js +98 -37
- package/es2024.esm.js +95 -34
- package/esnext.cjs.js +98 -37
- package/esnext.esm.js +95 -34
- package/evergreen.esm.js +92 -31
- package/package.json +2 -2
- package/types/providers/DashProvider/baseDashProvider.d.ts +1 -0
- package/types/providers/DashProvider/lib/buffer.d.ts +3 -0
- package/types/providers/DashProvider/lib/fetcher.d.ts +2 -1
- package/types/providers/DashProvider/lib/player.d.ts +1 -0
- package/types/providers/DashProvider/lib/sourceBufferBufferedDiff.d.ts +19 -0
- package/types/providers/DashProvider/lib/utils.d.ts +11 -0
- package/types/providers/DashProviderNew/baseDashProvider.d.ts +57 -0
- package/types/providers/DashProviderNew/consts.d.ts +3 -0
- package/types/providers/DashProviderNew/index.d.ts +2 -0
- package/types/providers/DashProviderNew/lib/ElementSizeManager.d.ts +19 -0
- package/types/providers/DashProviderNew/lib/LiveTextManager.d.ts +23 -0
- package/types/providers/DashProviderNew/lib/buffer.d.ts +117 -0
- package/types/providers/DashProviderNew/lib/fetcher.d.ts +59 -0
- package/types/providers/DashProviderNew/lib/parsers/ietf/index.d.ts +13 -0
- package/types/providers/DashProviderNew/lib/parsers/index.d.ts +3 -0
- package/types/providers/DashProviderNew/lib/parsers/mpd.d.ts +3 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/BoxModel.d.ts +20 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/BoxParser.d.ts +21 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/BoxTypeEnum.d.ts +30 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/box.d.ts +74 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/avc1.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/equi.d.ts +21 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/ftyp.d.ts +17 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/index.d.ts +26 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/mdat.d.ts +15 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/mdia.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/mfhd.d.ts +11 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/minf.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/moof.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/moov.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/mvhd.d.ts +35 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/prhd.d.ts +16 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/proj.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/sidx.d.ts +48 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/st3d.d.ts +23 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/stbl.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/stsd.d.ts +11 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/sv3d.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/tfdt.d.ts +17 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/tfhd.d.ts +22 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/tkhd.d.ts +42 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/traf.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/trak.d.ts +8 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/trun.d.ts +31 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/unknown.d.ts +6 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/boxes/uuid.d.ts +11 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/fullBox.d.ts +15 -0
- package/types/providers/DashProviderNew/lib/parsers/mpeg/isobmff.d.ts +12 -0
- package/types/providers/DashProviderNew/lib/parsers/webm/ebml.d.ts +76 -0
- package/types/providers/DashProviderNew/lib/parsers/webm/webm.d.ts +3 -0
- package/types/providers/DashProviderNew/lib/player.d.ts +92 -0
- package/types/providers/DashProviderNew/lib/sourceBufferTaskQueue.d.ts +19 -0
- package/types/providers/DashProviderNew/lib/types.d.ts +186 -0
- package/types/providers/DashProviderNew/lib/utils.d.ts +21 -0
- package/types/providers/DashProviderNew/newDashCmafLiveProvider.d.ts +8 -0
- package/types/providers/DashProviderNew/newDashProvider.d.ts +6 -0
- package/types/utils/autoSelectTrack.d.ts +6 -3
- package/types/utils/qualityLimits.d.ts +3 -18
- package/types/utils/tuningConfig.d.ts +3 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vkontakte/videoplayer-core",
|
|
3
|
-
"version": "2.0.131-dev.
|
|
3
|
+
"version": "2.0.131-dev.c93c80a1.0",
|
|
4
4
|
"author": "vk.com",
|
|
5
5
|
"description": "Videoplayer core library based on the vk.com platform",
|
|
6
6
|
"homepage": "https://vk.com",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"**/*.d.ts"
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@vkontakte/videoplayer-shared": "1.0.
|
|
57
|
+
"@vkontakte/videoplayer-shared": "1.0.59-dev.3ed4b6b9.0",
|
|
58
58
|
"hls.js": "~1.4.7"
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -41,6 +41,7 @@ export default abstract class BaseDashProvider implements IProvider {
|
|
|
41
41
|
protected audioStreamsMap: Map<Stream, IAudioTrack[]>;
|
|
42
42
|
protected videoTrackSwitchHistory: TrackHistory<IVideoTrack>;
|
|
43
43
|
protected audioTrackSwitchHistory: TrackHistory<import("../../player/types").IBaseTrack>;
|
|
44
|
+
private readonly selectedRepresentations;
|
|
44
45
|
constructor(params: IParams);
|
|
45
46
|
protected abstract seek(position: Milliseconds, forcePrecise: boolean): void;
|
|
46
47
|
protected getProviderSubscriptionInfo(): IProviderSubscriptionInfo;
|
|
@@ -12,6 +12,7 @@ export interface Dependencies {
|
|
|
12
12
|
}
|
|
13
13
|
export interface Gap extends IRange<Milliseconds> {
|
|
14
14
|
representation: Representation['id'];
|
|
15
|
+
persistent: boolean;
|
|
15
16
|
}
|
|
16
17
|
export declare class BufferManager {
|
|
17
18
|
currentLiveSegmentServerLatency$: IValueSubject<number>;
|
|
@@ -60,6 +61,7 @@ export declare class BufferManager {
|
|
|
60
61
|
private index;
|
|
61
62
|
private lastDataObtainedTimestampMs;
|
|
62
63
|
private loadByteRangeSegmentsTimeoutId;
|
|
64
|
+
private sourceBufferBufferedDiff;
|
|
63
65
|
constructor(kind: StreamKind, mediaSource: MediaSource, representations: Representation[], { fetcher, tuning, getCurrentPosition, isActiveLowLatency, compatibilityMode, manifest }: Dependencies);
|
|
64
66
|
startWith: (param_0: string) => Promise<void | undefined>;
|
|
65
67
|
switchToWithPreviousAbort(newRepresentationId: Representation['id'], dropBuffer?: boolean): void;
|
|
@@ -108,6 +110,7 @@ export declare class BufferManager {
|
|
|
108
110
|
private pruneBuffer;
|
|
109
111
|
private abortBuffer;
|
|
110
112
|
getDebugBufferState(): IRange<Milliseconds> | undefined;
|
|
113
|
+
getBufferedTo(): number | null;
|
|
111
114
|
getForwardBufferDuration(currentPosition?: Milliseconds | undefined): Milliseconds;
|
|
112
115
|
private detectGaps;
|
|
113
116
|
private detectGapsWhenIdle;
|
|
@@ -42,9 +42,9 @@ export declare class Fetcher {
|
|
|
42
42
|
recoverableError$: Subject<IError>;
|
|
43
43
|
error$: Subject<IError>;
|
|
44
44
|
private abortAllController;
|
|
45
|
-
private subscription;
|
|
46
45
|
private compatibilityMode;
|
|
47
46
|
private useEnableSubtitlesParam;
|
|
47
|
+
private readonly subscription;
|
|
48
48
|
constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam }: IParams);
|
|
49
49
|
private onHeadersReceived;
|
|
50
50
|
fetchManifest: (param_0: string) => Promise<string | null | undefined>;
|
|
@@ -54,5 +54,6 @@ export declare class Fetcher {
|
|
|
54
54
|
private fetchByteRangeRepresentation;
|
|
55
55
|
private fetchTemplateRepresentation;
|
|
56
56
|
private doFetch;
|
|
57
|
+
private unsubscribeAbortSubscription;
|
|
57
58
|
}
|
|
58
59
|
export declare const suppressAbort: (e: Error | unknown) => void | never;
|
|
@@ -68,6 +68,7 @@ export declare class Player {
|
|
|
68
68
|
private stallWatchdogSubscription;
|
|
69
69
|
private livePauseWatchdogSubscription;
|
|
70
70
|
private destroyController;
|
|
71
|
+
private initedPruneBufferCallback;
|
|
71
72
|
constructor(params: Params);
|
|
72
73
|
initManifest: (param_0: HTMLVideoElement, param_1: string, param_2: number) => Promise<void | undefined>;
|
|
73
74
|
updateManifest: () => Promise<Manifest | null | undefined>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class SourceBufferBufferedDiff {
|
|
2
|
+
private lastUpdateTs;
|
|
3
|
+
private lastCallTs;
|
|
4
|
+
private prevRanges;
|
|
5
|
+
private readonly sourceBuffer;
|
|
6
|
+
private readonly mediaSource;
|
|
7
|
+
private readonly subscription;
|
|
8
|
+
constructor(mediaSource: MediaSource, sourceBuffer: SourceBuffer);
|
|
9
|
+
private updateend;
|
|
10
|
+
/**
|
|
11
|
+
* если длина массивов разная - считаем, что какие то сегменты удалили
|
|
12
|
+
*
|
|
13
|
+
* если длина одинаковая - считаем, что сегменты удалили в том случае,
|
|
14
|
+
* если в новом массиве хотя бы 1 сегмент стал меньше
|
|
15
|
+
*/
|
|
16
|
+
private isRangesRemoved;
|
|
17
|
+
wasUpdated(): boolean;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Representation, Segment, SegmentReference, Stream, TemplateSegment, TemplateSegmentReference, TextRepresentation } from '../../../providers/DashProvider/lib/types';
|
|
2
2
|
import { IAudioStream, IAudioTrack, IInternalTextTrack, IVideoStream, IVideoTrack } from '../../../player/types';
|
|
3
|
+
import { IRange, Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
3
4
|
export declare const representationToVideoTrack: ({ id, width, height, bitrate, fps, quality: qualityString, streamId }: Representation) => IVideoTrack | undefined;
|
|
4
5
|
export declare const representationToAudioTrack: ({ id, bitrate }: Representation) => IAudioTrack;
|
|
5
6
|
export declare const representationToTextTrack: ({ language, label }: Stream, { id, url, isAuto }: Representation & {
|
|
@@ -13,3 +14,13 @@ export declare const isTemplateSegment: (segment: Segment) => segment is Templat
|
|
|
13
14
|
export declare const isTemplateSegmentReference: (segmentReference: SegmentReference) => segmentReference is TemplateSegmentReference;
|
|
14
15
|
export declare const isAbortError: (e: Error | unknown) => boolean;
|
|
15
16
|
export declare const isTextRepresentation: (representation: Representation | TextRepresentation) => representation is TextRepresentation;
|
|
17
|
+
/**
|
|
18
|
+
* @mutates intervals
|
|
19
|
+
*/
|
|
20
|
+
export declare const mergeIntervals: (intervals: IRange<Milliseconds>[]) => IRange<Milliseconds>[];
|
|
21
|
+
export declare const findInIterator: <T>(iterable: MapIterator<T> | SetIterator<T>, matchFn: (arg: T) => boolean) => T | null;
|
|
22
|
+
/**
|
|
23
|
+
* даёт `true` каждые `ms` миллисекунд
|
|
24
|
+
*/
|
|
25
|
+
export declare const semaphor: (ms: number) => () => boolean;
|
|
26
|
+
export declare const createTimeRanges: (buffered: TimeRanges) => number[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { IAudioTrack, IDashURLSource, IHLSSource, IInternalTextTrack, IVideoTrack } from '../../player/types';
|
|
2
|
+
import { CommonInit, IProviderSubscriptionInfo, ProviderState, Representation, Stream } from './lib/types';
|
|
3
|
+
import { IProvider, IProviderParams } from '../../providers/types';
|
|
4
|
+
import { TrackHistory } from '../../utils/autoSelectTrack';
|
|
5
|
+
import { IStateMachine } from '../../utils/StateMachine/types';
|
|
6
|
+
import { ISubscription, ITracer, Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
7
|
+
import { Player } from './lib/player';
|
|
8
|
+
import { Scene3D } from '../../utils/3d/Scene3D';
|
|
9
|
+
import DroppedFramesManager from '../../providers/utils/HTMLVideoElement/DroppedFramesManager';
|
|
10
|
+
import TextTrackManager from '../../providers/utils/HTMLVideoElement/TextTrackManager';
|
|
11
|
+
import StallsManager from '../../providers/utils/StallsManager';
|
|
12
|
+
import { ElementSizeManager } from './lib/ElementSizeManager';
|
|
13
|
+
type IParams = IProviderParams<IDashURLSource> & {
|
|
14
|
+
sourceHls?: IHLSSource;
|
|
15
|
+
};
|
|
16
|
+
export default abstract class BaseDashProvider implements IProvider {
|
|
17
|
+
scene3D: Scene3D | undefined;
|
|
18
|
+
protected subscription: ISubscription;
|
|
19
|
+
protected videoState: IStateMachine<ProviderState>;
|
|
20
|
+
protected video: HTMLVideoElement;
|
|
21
|
+
protected player: Player;
|
|
22
|
+
protected params: IParams;
|
|
23
|
+
protected tracer: ITracer;
|
|
24
|
+
protected textTracksManager: TextTrackManager;
|
|
25
|
+
protected droppedFramesManager: DroppedFramesManager;
|
|
26
|
+
protected stallsManager: StallsManager;
|
|
27
|
+
protected elementSizeManager: ElementSizeManager;
|
|
28
|
+
protected videoTracksMap: Map<IVideoTrack, {
|
|
29
|
+
stream: Stream;
|
|
30
|
+
representation: Representation;
|
|
31
|
+
}>;
|
|
32
|
+
protected audioTracksMap: Map<IAudioTrack, {
|
|
33
|
+
stream: Stream;
|
|
34
|
+
representation: Representation;
|
|
35
|
+
}>;
|
|
36
|
+
protected textTracksMap: Map<IInternalTextTrack, {
|
|
37
|
+
stream: Stream;
|
|
38
|
+
representation: Representation;
|
|
39
|
+
}>;
|
|
40
|
+
protected videoStreamsMap: Map<Stream, IVideoTrack[]>;
|
|
41
|
+
protected audioStreamsMap: Map<Stream, IAudioTrack[]>;
|
|
42
|
+
protected videoTrackSwitchHistory: TrackHistory<IVideoTrack>;
|
|
43
|
+
protected audioTrackSwitchHistory: TrackHistory<import("../../player/types").IBaseTrack>;
|
|
44
|
+
private readonly selectedRepresentations;
|
|
45
|
+
constructor(params: IParams);
|
|
46
|
+
protected abstract seek(position: Milliseconds, forcePrecise: boolean): void;
|
|
47
|
+
protected getProviderSubscriptionInfo(): IProviderSubscriptionInfo;
|
|
48
|
+
protected subscribe(): void;
|
|
49
|
+
protected selectVideoAudioRepresentations(): [Representation, Representation | undefined] | undefined;
|
|
50
|
+
protected prepare(manifestOffset?: number): void;
|
|
51
|
+
protected syncPlayback: () => undefined;
|
|
52
|
+
protected init3DScene: (init: CommonInit) => void;
|
|
53
|
+
protected destroy3DScene: () => void;
|
|
54
|
+
protected playIfAllowed(): void;
|
|
55
|
+
destroy(): void;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IObservableVideo } from '../../../providers/utils/HTMLVideoElement/observable';
|
|
2
|
+
import { IListener, IRectangle, ISubscription, ValueSubject } from '@vkontakte/videoplayer-shared';
|
|
3
|
+
interface ConnectParams {
|
|
4
|
+
video: HTMLVideoElement;
|
|
5
|
+
observableVideo: IObservableVideo;
|
|
6
|
+
}
|
|
7
|
+
export declare class ElementSizeManager {
|
|
8
|
+
private readonly subscription;
|
|
9
|
+
private readonly pipSize$;
|
|
10
|
+
private readonly videoSize$;
|
|
11
|
+
private readonly elementSize$;
|
|
12
|
+
private pictureInPictureWindowRemoveEventListener;
|
|
13
|
+
connect({ observableVideo, video }: ConnectParams): void;
|
|
14
|
+
getValue(): IRectangle<number> | undefined;
|
|
15
|
+
subscribe(listener: IListener<IRectangle<number> | undefined>, error?: IListener<Error | unknown>): ISubscription;
|
|
16
|
+
getObservable(): ValueSubject<IRectangle<number> | undefined>;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IValueSubject, Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { Dependencies } from './buffer';
|
|
3
|
+
import { Manifest, Stream, TextRepresentation } from './types';
|
|
4
|
+
export declare class LiveTextManager {
|
|
5
|
+
currentRepresentation$: IValueSubject<TextRepresentation | null>;
|
|
6
|
+
private readonly maxRepresentations;
|
|
7
|
+
private representationsCursor;
|
|
8
|
+
private representations;
|
|
9
|
+
private readonly getCurrentPosition;
|
|
10
|
+
private currentSegment;
|
|
11
|
+
constructor(streams: Stream[], deps: Pick<Dependencies, 'getCurrentPosition'>);
|
|
12
|
+
updateLive(manifest: Manifest | null): void;
|
|
13
|
+
seekLive(streams?: Stream[]): void;
|
|
14
|
+
maintain(currentPosition?: Milliseconds | undefined): void;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
/**
|
|
17
|
+
* @todo support multi-streams
|
|
18
|
+
* @see https://jira.mvk.com/browse/VP-2420
|
|
19
|
+
*/
|
|
20
|
+
private processStreams;
|
|
21
|
+
static isSupported(streams?: Stream[]): boolean;
|
|
22
|
+
private static filterRepresentations;
|
|
23
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { ITuningConfig } from '../../../utils/tuningConfig';
|
|
2
|
+
import { IError, IRange, ISubject, IValueSubject, Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
3
|
+
import type { Fetcher } from './fetcher';
|
|
4
|
+
import { CommonInit, Manifest, Representation, Stream, StreamKind } from './types';
|
|
5
|
+
export interface Dependencies {
|
|
6
|
+
fetcher: Fetcher;
|
|
7
|
+
tuning: ITuningConfig;
|
|
8
|
+
getCurrentPosition: () => Milliseconds | undefined;
|
|
9
|
+
isActiveLowLatency: () => boolean;
|
|
10
|
+
compatibilityMode?: boolean;
|
|
11
|
+
manifest: Manifest | null;
|
|
12
|
+
}
|
|
13
|
+
export interface Gap extends IRange<Milliseconds> {
|
|
14
|
+
representation: Representation['id'];
|
|
15
|
+
}
|
|
16
|
+
export declare class BufferManager {
|
|
17
|
+
currentLiveSegmentServerLatency$: IValueSubject<number>;
|
|
18
|
+
currentLowLatencySegmentLength$: IValueSubject<number>;
|
|
19
|
+
currentSegmentLength$: IValueSubject<number>;
|
|
20
|
+
onLastSegment$: IValueSubject<boolean>;
|
|
21
|
+
fullyBuffered$: IValueSubject<boolean>;
|
|
22
|
+
playingRepresentation$: IValueSubject<Representation['id'] | undefined>;
|
|
23
|
+
playingRepresentationInit$: IValueSubject<CommonInit | undefined>;
|
|
24
|
+
error$: ISubject<IError>;
|
|
25
|
+
gaps: Gap[];
|
|
26
|
+
private subscription;
|
|
27
|
+
private kind;
|
|
28
|
+
private initData;
|
|
29
|
+
private parsedInitData;
|
|
30
|
+
private representations;
|
|
31
|
+
private segments;
|
|
32
|
+
private allInitsLoaded;
|
|
33
|
+
private activeSegments;
|
|
34
|
+
private mediaSource;
|
|
35
|
+
private playingRepresentationId;
|
|
36
|
+
private downloadingRepresentationId;
|
|
37
|
+
private switchingToRepresentationId;
|
|
38
|
+
private sourceBuffer;
|
|
39
|
+
private downloadAbortController;
|
|
40
|
+
private switchAbortController;
|
|
41
|
+
private destroyAbortController;
|
|
42
|
+
private readonly getCurrentPosition;
|
|
43
|
+
private readonly isActiveLowLatency;
|
|
44
|
+
private tuning;
|
|
45
|
+
private forwardBufferTarget;
|
|
46
|
+
private fetcher;
|
|
47
|
+
private bufferLimit;
|
|
48
|
+
private sourceBufferTaskQueue;
|
|
49
|
+
private gapDetectionIdleCallback;
|
|
50
|
+
private initLoadIdleCallback;
|
|
51
|
+
private failedDownloads;
|
|
52
|
+
private baseUrls;
|
|
53
|
+
private baseUrlsIndex;
|
|
54
|
+
private compatibilityMode;
|
|
55
|
+
private preloadOnly;
|
|
56
|
+
private isLive;
|
|
57
|
+
private liveUpdateSegmentIndex;
|
|
58
|
+
private liveInitialAdditionalOffset;
|
|
59
|
+
private isSeekingLive;
|
|
60
|
+
private index;
|
|
61
|
+
private lastDataObtainedTimestampMs;
|
|
62
|
+
private loadByteRangeSegmentsTimeoutId;
|
|
63
|
+
constructor(kind: StreamKind, mediaSource: MediaSource, representations: Representation[], { fetcher, tuning, getCurrentPosition, isActiveLowLatency, compatibilityMode, manifest }: Dependencies);
|
|
64
|
+
startWith: (param_0: string) => Promise<void | undefined>;
|
|
65
|
+
switchToWithPreviousAbort(newRepresentationId: Representation['id'], dropBuffer?: boolean): void;
|
|
66
|
+
switchTo: (param_0: string, param_1: boolean | undefined) => Promise<void | undefined>;
|
|
67
|
+
switchToOld: (param_0: string, param_1: boolean | undefined) => Promise<void | undefined>;
|
|
68
|
+
warmUpMediaSource(): void;
|
|
69
|
+
abort(): Promise<boolean>;
|
|
70
|
+
maintain(currentPosition?: Milliseconds | undefined): void;
|
|
71
|
+
get lastDataObtainedTimestamp(): number;
|
|
72
|
+
private searchGaps;
|
|
73
|
+
private getActualLiveStartingSegments;
|
|
74
|
+
getLiveSegmentsToLoadState(manifest: Manifest | null): IRange<Milliseconds> | undefined;
|
|
75
|
+
seekLive: (param_0: Stream[] | undefined) => Promise<void | undefined>;
|
|
76
|
+
updateLive(manifest: Manifest | null): void;
|
|
77
|
+
proceedLowLatencyLive(): void;
|
|
78
|
+
private updateLowLatencyLiveIfNeeded;
|
|
79
|
+
findSegmentStartTime(position: Milliseconds): Milliseconds | undefined;
|
|
80
|
+
setTarget(time: Milliseconds): void;
|
|
81
|
+
setPreloadOnly(preloadOnly: boolean): void;
|
|
82
|
+
destroy(): void;
|
|
83
|
+
private selectForwardBufferSegments;
|
|
84
|
+
private selectForwardBufferSegmentsLive;
|
|
85
|
+
private selectForwardBufferSegmentsRecord;
|
|
86
|
+
private loadSegments;
|
|
87
|
+
private loadTemplateSegment;
|
|
88
|
+
private updateRepresentationsBaseUrlIfNeeded;
|
|
89
|
+
private loadByteRangeSegments;
|
|
90
|
+
private prepareByteRangeFetchSegmentParams;
|
|
91
|
+
private prepareTemplateFetchSegmentParams;
|
|
92
|
+
private abortActiveSegments;
|
|
93
|
+
private onSomeTemplateDataLoaded;
|
|
94
|
+
/**
|
|
95
|
+
* Закидываем в буфер сегменты атомарнее чем сегмент целиком. Например, по боксам в мпеге и по блокам в вебме.
|
|
96
|
+
* Таким образом не ждём его полной загрузки и готовы играть его намного быстрее
|
|
97
|
+
* @param dataView – данные, размер буфера – весь запрос
|
|
98
|
+
* @param globalFrom – Отступ dataView от начала файла, совпадает с отсупами сегментов
|
|
99
|
+
* @param loaded – Объём загруженных в dataView данных (всё что больше – пока нули)
|
|
100
|
+
* @private
|
|
101
|
+
*/
|
|
102
|
+
private onSomeByteRangesDataLoaded;
|
|
103
|
+
private onSegmentFullyAppended;
|
|
104
|
+
private abortSegment;
|
|
105
|
+
private loadNextInit;
|
|
106
|
+
private loadInit;
|
|
107
|
+
private dropBuffer;
|
|
108
|
+
private pruneBuffer;
|
|
109
|
+
private abortBuffer;
|
|
110
|
+
getDebugBufferState(): IRange<Milliseconds> | undefined;
|
|
111
|
+
getBufferedTo(): number | null;
|
|
112
|
+
getForwardBufferDuration(currentPosition?: Milliseconds | undefined): Milliseconds;
|
|
113
|
+
private detectGaps;
|
|
114
|
+
private detectGapsWhenIdle;
|
|
115
|
+
private checkEjectedSegments;
|
|
116
|
+
private handleAsyncError;
|
|
117
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HttpConnectionType } from '../../../player/types';
|
|
2
|
+
import type ThroughputEstimator from '../../../utils/ThroughputEstimator';
|
|
3
|
+
import { Byte, IValueSubject, Milliseconds, IRange, Subject, ITracer, IError } from '@vkontakte/videoplayer-shared';
|
|
4
|
+
import { CommonInit, GenericContainerParser, Segment, SegmentReference } from './types';
|
|
5
|
+
export declare enum RangeMethod {
|
|
6
|
+
HEADER = 0,
|
|
7
|
+
PARAM = 1
|
|
8
|
+
}
|
|
9
|
+
export interface IParams {
|
|
10
|
+
throughputEstimator?: ThroughputEstimator;
|
|
11
|
+
requestQuic: boolean;
|
|
12
|
+
compatibilityMode?: boolean;
|
|
13
|
+
tracer: ITracer;
|
|
14
|
+
useEnableSubtitlesParam?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export type Priority = 'high' | 'low' | 'auto';
|
|
17
|
+
export interface FetchParamsWithUrl extends FetchParams {
|
|
18
|
+
url: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FetchParams {
|
|
21
|
+
range?: IRange<Byte>;
|
|
22
|
+
rangeMethod?: RangeMethod;
|
|
23
|
+
onProgress?: (dataView: DataView, loaded: number) => void;
|
|
24
|
+
onProgressTasks?: Promise<void>[];
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
priority?: Priority;
|
|
27
|
+
measureThroughput?: boolean;
|
|
28
|
+
isLowLatency?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export type RepresentationFetchResult = {
|
|
31
|
+
init: CommonInit | null;
|
|
32
|
+
segments: Segment[];
|
|
33
|
+
dataView: DataView;
|
|
34
|
+
};
|
|
35
|
+
export declare class Fetcher {
|
|
36
|
+
private throughputEstimator;
|
|
37
|
+
private requestQuic;
|
|
38
|
+
private tracer;
|
|
39
|
+
lastConnectionType$: IValueSubject<HttpConnectionType | undefined>;
|
|
40
|
+
lastConnectionReused$: IValueSubject<boolean | undefined>;
|
|
41
|
+
lastRequestFirstBytes$: IValueSubject<Milliseconds | undefined>;
|
|
42
|
+
recoverableError$: Subject<IError>;
|
|
43
|
+
error$: Subject<IError>;
|
|
44
|
+
private abortAllController;
|
|
45
|
+
private compatibilityMode;
|
|
46
|
+
private useEnableSubtitlesParam;
|
|
47
|
+
private readonly subscription;
|
|
48
|
+
constructor({ throughputEstimator, requestQuic, tracer, compatibilityMode, useEnableSubtitlesParam }: IParams);
|
|
49
|
+
private onHeadersReceived;
|
|
50
|
+
fetchManifest: (param_0: string) => Promise<string | null | undefined>;
|
|
51
|
+
fetch: (param_0: string, param_1: FetchParams) => Promise<ArrayBuffer | null | undefined>;
|
|
52
|
+
fetchRepresentation(segmentReference: SegmentReference, parser: GenericContainerParser<unknown>, priority?: Priority): Promise<RepresentationFetchResult | null>;
|
|
53
|
+
destroy(): void;
|
|
54
|
+
private fetchByteRangeRepresentation;
|
|
55
|
+
private fetchTemplateRepresentation;
|
|
56
|
+
private doFetch;
|
|
57
|
+
private unsubscribeAbortSubscription;
|
|
58
|
+
}
|
|
59
|
+
export declare const suppressAbort: (e: Error | unknown) => void | never;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** @fork https://github.com/sozialhelden/ietf-language-tags */
|
|
2
|
+
export interface ILanguageSubtag {
|
|
3
|
+
langtag?: string;
|
|
4
|
+
language?: string;
|
|
5
|
+
extlang?: string;
|
|
6
|
+
script?: string;
|
|
7
|
+
region?: string;
|
|
8
|
+
variants?: string[];
|
|
9
|
+
extensions?: Record<string, string>;
|
|
10
|
+
privateuse?: string;
|
|
11
|
+
}
|
|
12
|
+
/** @fork https://github.com/sozialhelden/ietf-language-tags */
|
|
13
|
+
export declare const parseLangAttribute: (attr: string) => ILanguageSubtag | null;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Manifest } from '../types';
|
|
2
|
+
export declare const replaceSegmentTemplate: (template: string, data: Partial<Record<"representationId" | "segmentNumber" | "bandwidth" | "segmentTime", string>>) => string;
|
|
3
|
+
export declare const parse: (text: string, manifestUrl: string) => Manifest;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Box } from '../../../../../providers/DashProviderNew/lib/parsers/mpeg/box';
|
|
2
|
+
/**
|
|
3
|
+
* Queryable object to get needed boxes from structure
|
|
4
|
+
*/
|
|
5
|
+
export declare class BoxModel {
|
|
6
|
+
private readonly index;
|
|
7
|
+
constructor(initialSet: Box[]);
|
|
8
|
+
/**
|
|
9
|
+
* Processes index creation
|
|
10
|
+
*/
|
|
11
|
+
private indexBoxLevel;
|
|
12
|
+
/**
|
|
13
|
+
* Returns first box of given type
|
|
14
|
+
*/
|
|
15
|
+
find<T extends Box>(type: string): T | null;
|
|
16
|
+
/**
|
|
17
|
+
* Returns all boxes of given typoe
|
|
18
|
+
*/
|
|
19
|
+
findAll<T extends Box>(type: string): T[];
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Box } from '../../../../../providers/DashProviderNew/lib/parsers/mpeg/box';
|
|
2
|
+
import { BoxTypeEnum } from '../../../../../providers/DashProviderNew/lib/parsers/mpeg/BoxTypeEnum';
|
|
3
|
+
export declare const BOX_TYPE_MAP: Record<BoxTypeEnum, typeof Box>;
|
|
4
|
+
export interface BoxParserOptions {
|
|
5
|
+
offset: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Box parsing object
|
|
9
|
+
*/
|
|
10
|
+
export declare class BoxParser {
|
|
11
|
+
private options;
|
|
12
|
+
constructor(opts?: Partial<BoxParserOptions>);
|
|
13
|
+
/**
|
|
14
|
+
* Parses DataView into the set of boxes
|
|
15
|
+
*/
|
|
16
|
+
parse(view: DataView): Box[];
|
|
17
|
+
/**
|
|
18
|
+
* Creates boxes from source DataView with exact type
|
|
19
|
+
*/
|
|
20
|
+
private createBox;
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 'Known' box types
|
|
3
|
+
*/
|
|
4
|
+
export declare enum BoxTypeEnum {
|
|
5
|
+
FtypBox = "ftyp",
|
|
6
|
+
MoovBox = "moov",
|
|
7
|
+
MvhdBox = "mvhd",
|
|
8
|
+
MoofBox = "moof",
|
|
9
|
+
MdatBox = "mdat",
|
|
10
|
+
SidxBox = "sidx",
|
|
11
|
+
TrakBox = "trak",
|
|
12
|
+
MdiaBox = "mdia",
|
|
13
|
+
MfhdBox = "mfhd",
|
|
14
|
+
TkhdBox = "tkhd",
|
|
15
|
+
TrafBox = "traf",
|
|
16
|
+
TfhdBox = "tfhd",
|
|
17
|
+
TfdtBox = "tfdt",
|
|
18
|
+
TrunBox = "trun",
|
|
19
|
+
MinfBox = "minf",
|
|
20
|
+
Sv3dBox = "sv3d",
|
|
21
|
+
St3dBox = "st3d",
|
|
22
|
+
PrhdBox = "prhd",
|
|
23
|
+
ProjBox = "proj",
|
|
24
|
+
EquiBox = "equi",
|
|
25
|
+
UuidBox = "uuid",
|
|
26
|
+
StblBox = "stbl",
|
|
27
|
+
StsdBox = "stsd",
|
|
28
|
+
Avc1Box = "avc1",
|
|
29
|
+
UnknownBox = "unknown"
|
|
30
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type BoxParser } from '../../../../../providers/DashProviderNew/lib/parsers/mpeg/BoxParser';
|
|
2
|
+
/**
|
|
3
|
+
* Generic boxes description
|
|
4
|
+
*
|
|
5
|
+
* aligned(8) class Box (unsigned int(32) boxtype, optional unsigned int(8)[16] extended_type) {
|
|
6
|
+
* unsigned int(32) size;
|
|
7
|
+
* unsigned int(32) type = boxtype;
|
|
8
|
+
* if (size==1) {
|
|
9
|
+
* unsigned int(64) largesize;
|
|
10
|
+
* } else if (size==0) {
|
|
11
|
+
* // boxes extends to end of file
|
|
12
|
+
* }
|
|
13
|
+
* if (boxtype==‘uuid’) {
|
|
14
|
+
* unsigned int(8)[16] usertype = extended_type;
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
*/
|
|
18
|
+
export declare class Box {
|
|
19
|
+
source: DataView;
|
|
20
|
+
boxParser: BoxParser;
|
|
21
|
+
type: string;
|
|
22
|
+
size32: number;
|
|
23
|
+
size64: number;
|
|
24
|
+
usertype: number;
|
|
25
|
+
content: DataView;
|
|
26
|
+
children: Box[];
|
|
27
|
+
/**
|
|
28
|
+
* Next byte in source buffer to be read
|
|
29
|
+
*/
|
|
30
|
+
protected cursor: number;
|
|
31
|
+
/**
|
|
32
|
+
* for compatibility with old Box type
|
|
33
|
+
*/
|
|
34
|
+
get id(): string;
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
get size(): number;
|
|
39
|
+
constructor(source: DataView, boxParser: BoxParser);
|
|
40
|
+
/**
|
|
41
|
+
* Internal method to scan for children
|
|
42
|
+
*/
|
|
43
|
+
protected scanForBoxes(view: DataView): Box[];
|
|
44
|
+
/**
|
|
45
|
+
* Reads given number of bytes from source buffer as a string
|
|
46
|
+
* starting from current cursor position and using provided encoding
|
|
47
|
+
* Moves cursor forward
|
|
48
|
+
*/
|
|
49
|
+
protected readString(byteLength: number, encoding?: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Reads 1 byte from source buffer as an unsigned integer
|
|
52
|
+
* starting from current cursor position
|
|
53
|
+
* Moves cursor forward
|
|
54
|
+
*/
|
|
55
|
+
protected readUint8(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Reads 2 bytes from source buffer as an unsigned integer
|
|
58
|
+
* starting from current cursor position
|
|
59
|
+
* Moves cursor forward
|
|
60
|
+
*/
|
|
61
|
+
protected readUint16(): number;
|
|
62
|
+
/**
|
|
63
|
+
* Reads 4 bytes from source buffer as an unsigned integer
|
|
64
|
+
* starting from current cursor position
|
|
65
|
+
* Moves cursor forward
|
|
66
|
+
*/
|
|
67
|
+
protected readUint32(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Reads 8 bytes from source buffer as an unsigned BigInt
|
|
70
|
+
* starting from current cursor position
|
|
71
|
+
* Moves cursor forward
|
|
72
|
+
*/
|
|
73
|
+
protected readUint64(): bigint;
|
|
74
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Box } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/box';
|
|
2
|
+
import { BoxParser } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/BoxParser';
|
|
3
|
+
/**
|
|
4
|
+
* Advance Video Coding Box
|
|
5
|
+
*/
|
|
6
|
+
export declare class Avc1Box extends Box {
|
|
7
|
+
constructor(source: DataView, boxParser: BoxParser);
|
|
8
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FullBox } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/fullBox';
|
|
2
|
+
import { type BoxParser } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/BoxParser';
|
|
3
|
+
/**
|
|
4
|
+
* aligned(8) class ProjectionDataBox(unsigned int(32) proj_type, unsigned int(8)version, unsigned int(24) flags)
|
|
5
|
+
* extends FullBox(proj_type, version, flags) {
|
|
6
|
+
* }
|
|
7
|
+
*
|
|
8
|
+
* aligned(8) class EquirectangularProjection ProjectionDataBox(‘equi’, 0, 0) {
|
|
9
|
+
* unsigned int(32) projection_bounds_top;
|
|
10
|
+
* unsigned int(32) projection_bounds_bottom;
|
|
11
|
+
* unsigned int(32) projection_bounds_left;
|
|
12
|
+
* unsigned int(32) projection_bounds_right;
|
|
13
|
+
* }
|
|
14
|
+
*/
|
|
15
|
+
export declare class EquiBox extends FullBox {
|
|
16
|
+
projectionBoundsTop: number;
|
|
17
|
+
projectionBoundsBottom: number;
|
|
18
|
+
projectionBoundsLeft: number;
|
|
19
|
+
projectionBoundsRight: number;
|
|
20
|
+
constructor(source: DataView, boxParser: BoxParser);
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Box } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/box';
|
|
2
|
+
import { type BoxParser } from '../../../../../../providers/DashProviderNew/lib/parsers/mpeg/BoxParser';
|
|
3
|
+
/**
|
|
4
|
+
* File Type Box description
|
|
5
|
+
*
|
|
6
|
+
* aligned(8) class FileTypeBox extends Box(‘ftyp’) {
|
|
7
|
+
* unsigned int(32) major_brand;
|
|
8
|
+
* unsigned int(32) minor_version;
|
|
9
|
+
* unsigned int(32) compatible_brands[]; // to end of the boxes
|
|
10
|
+
* }
|
|
11
|
+
*/
|
|
12
|
+
export declare class FtypBox extends Box {
|
|
13
|
+
majorBrand: string;
|
|
14
|
+
minorVersion: number;
|
|
15
|
+
compatibleBrands: string[];
|
|
16
|
+
constructor(source: DataView, boxParser: BoxParser);
|
|
17
|
+
}
|