@vkontakte/videoplayer-core 2.0.103 → 2.0.104
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 +73 -27
- package/es2015.esm.js +72 -26
- package/es2018.cjs.js +73 -27
- package/es2018.esm.js +72 -26
- package/esnext.cjs.js +75 -29
- package/esnext.esm.js +73 -27
- package/evergreen.esm.js +73 -27
- package/package.json +7 -7
- package/types/enums/AndroidPreferredFormat.d.ts +8 -0
- package/types/enums/WebmCodecStrategy.d.ts +7 -0
- package/types/env.d.ts +1 -0
- package/types/index.d.ts +12 -0
- package/types/player/Player.d.ts +173 -0
- package/{index.d.ts → types/player/types.d.ts} +64 -391
- package/types/player/utils/optimisticPosition.d.ts +12 -0
- package/types/player/utils/selectContainer.d.ts +3 -0
- package/types/providers/ChromecastProvider/ChromecastInitializer/index.d.ts +31 -0
- package/types/providers/ChromecastProvider/ChromecastInitializer/types.d.ts +23 -0
- package/types/providers/ChromecastProvider/index.d.ts +33 -0
- package/types/providers/DashLiveProvider/DashLiveProvider.d.ts +37 -0
- package/types/providers/DashLiveProvider/index.d.ts +2 -0
- package/types/providers/DashLiveProvider/types.d.ts +21 -0
- package/types/providers/DashLiveProvider/utils/FilesFetcher.d.ts +25 -0
- package/types/providers/DashLiveProvider/utils/LiveDashPlayer.d.ts +143 -0
- package/types/providers/DashLiveProvider/utils/ThroughputEstimator.d.ts +33 -0
- package/types/providers/DashLiveProvider/utils/liveDashPlayerUtil.d.ts +42 -0
- package/types/providers/DashProvider/baseDashProvider.d.ts +52 -0
- package/types/providers/DashProvider/consts.d.ts +1 -0
- package/types/providers/DashProvider/dashCmafLiveProvider.d.ts +8 -0
- package/types/providers/DashProvider/dashProvider.d.ts +6 -0
- package/types/providers/DashProvider/index.d.ts +2 -0
- package/types/providers/DashProvider/lib/buffer.d.ts +103 -0
- package/types/providers/DashProvider/lib/fetcher.d.ts +51 -0
- package/types/providers/DashProvider/lib/parsers/mpd.d.ts +3 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/BoxModel.d.ts +20 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/BoxParser.d.ts +21 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/BoxTypeEnum.d.ts +26 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/box.d.ts +79 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/equi.d.ts +21 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/ftyp.d.ts +17 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/index.d.ts +22 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/mdat.d.ts +15 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/mdia.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/mfhd.d.ts +11 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/minf.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/moof.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/moov.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/prhd.d.ts +16 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/proj.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/sidx.d.ts +48 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/st3d.d.ts +23 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/sv3d.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/tfdt.d.ts +17 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/tfhd.d.ts +22 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/tkhd.d.ts +42 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/traf.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/trak.d.ts +7 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/trun.d.ts +31 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/unknown.d.ts +6 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/boxes/uuid.d.ts +6 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/fullBox.d.ts +15 -0
- package/types/providers/DashProvider/lib/parsers/mpeg/isobmff.d.ts +12 -0
- package/types/providers/DashProvider/lib/parsers/webm/ebml.d.ts +76 -0
- package/types/providers/DashProvider/lib/parsers/webm/webm.d.ts +3 -0
- package/types/providers/DashProvider/lib/player.d.ts +75 -0
- package/types/providers/DashProvider/lib/sourceBufferTaskQueue.d.ts +18 -0
- package/types/providers/DashProvider/lib/types.d.ts +156 -0
- package/types/providers/DashProvider/lib/utils.d.ts +14 -0
- package/types/providers/HlsJsProvider/index.d.ts +24 -0
- package/types/providers/HlsLiveProvider/index.d.ts +30 -0
- package/types/providers/HlsLiveProvider/seekBackTimeExtractor.d.ts +3 -0
- package/types/providers/HlsProvider/index.d.ts +21 -0
- package/types/providers/HlsProvider/manifestDataExtractor.d.ts +21 -0
- package/types/providers/MpegProvider/index.d.ts +20 -0
- package/types/providers/ProviderContainer/index.d.ts +42 -0
- package/types/providers/ProviderContainer/types.d.ts +20 -0
- package/types/providers/ProviderContainer/utils/formatsSupport.d.ts +20 -0
- package/types/providers/ProviderContainer/utils/playbackHangup.d.ts +12 -0
- package/types/providers/WebRTCLiveProvider/WebRTCLiveClient.d.ts +188 -0
- package/types/providers/WebRTCLiveProvider/WebRTCLiveProvider.d.ts +60 -0
- package/types/providers/WebRTCLiveProvider/interface/WebRTCLiveClientOptions.d.ts +9 -0
- package/types/providers/types.d.ts +83 -0
- package/types/providers/utils/HTMLVideoElement/DroppedFramesManager.d.ts +44 -0
- package/types/providers/utils/HTMLVideoElement/TextTrackManager.d.ts +30 -0
- package/types/providers/utils/HTMLVideoElement/clear.d.ts +1 -0
- package/types/providers/utils/HTMLVideoElement/destroy.d.ts +1 -0
- package/types/providers/utils/HTMLVideoElement/forcePlay.d.ts +7 -0
- package/types/providers/utils/HTMLVideoElement/observable.d.ts +25 -0
- package/types/providers/utils/HTMLVideoElement/pool.d.ts +2 -0
- package/types/providers/utils/HTMLVideoElement/surface.d.ts +2 -0
- package/types/providers/utils/LiveOffset/index.d.ts +14 -0
- package/types/providers/utils/LiveOffset/types.d.ts +10 -0
- package/types/providers/utils/addQuicParam.d.ts +2 -0
- package/types/providers/utils/extractConnectionHeaders.d.ts +6 -0
- package/types/providers/utils/generateLiveUrl.d.ts +9 -0
- package/types/providers/utils/okQualityStringToVideoQuality.d.ts +3 -0
- package/types/providers/utils/parseFps.d.ts +1 -0
- package/types/providers/utils/syncDesiredState.d.ts +12 -0
- package/types/providers/utils/syncPlaybackState.d.ts +4 -0
- package/types/utils/3d/Camera3D.d.ts +14 -0
- package/types/utils/3d/CameraRotationManager.d.ts +62 -0
- package/types/utils/3d/Scene3D.d.ts +132 -0
- package/types/utils/3d/types.d.ts +25 -0
- package/types/utils/StateMachine/StateMachine.d.ts +19 -0
- package/types/utils/StateMachine/types.d.ts +60 -0
- package/types/utils/StatefulIterator/index.d.ts +13 -0
- package/types/utils/ThroughputEstimator.d.ts +25 -0
- package/types/utils/addScript.d.ts +2 -0
- package/types/utils/autoSelectVideoTrack.d.ts +26 -0
- package/types/utils/buffer/getBufferedRangeForPosition.d.ts +3 -0
- package/types/utils/buffer/getForwardBufferDuration.d.ts +3 -0
- package/types/utils/buffer/getTotalBufferDuration.d.ts +3 -0
- package/types/utils/buffer/isPositionBuffered.d.ts +3 -0
- package/types/utils/changePlaybackRate.d.ts +2 -0
- package/types/utils/hostnameFromUrl.d.ts +2 -0
- package/types/utils/isInPiP.d.ts +1 -0
- package/types/utils/link.d.ts +2 -0
- package/types/utils/mediaSource.d.ts +8 -0
- package/types/utils/observeElementVisibility.d.ts +3 -0
- package/types/utils/playbackTelemetry.d.ts +12 -0
- package/types/utils/setStateWithSubscribe.d.ts +3 -0
- package/types/utils/smoothedValue/baseSmoothedValue.d.ts +18 -0
- package/types/utils/smoothedValue/emaAndMaSmoothedValue.d.ts +7 -0
- package/types/utils/smoothedValue/emaTopExtremumValue.d.ts +10 -0
- package/types/utils/smoothedValue/smoothedValueFactory.d.ts +6 -0
- package/types/utils/smoothedValue/twoEmaSmoothedValue.d.ts +8 -0
- package/types/utils/smoothedValue/types.d.ts +26 -0
- package/types/utils/smoothedValue/utils.d.ts +3 -0
- package/types/utils/tuningConfig.d.ts +164 -0
- package/types/utils/videoFormat.d.ts +2 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ITuningConfig } from '../utils/tuningConfig';
|
|
2
|
+
import { ILogger, ISubject, IValueSubject, Milliseconds, Seconds, IRange, IError, QualityLimits, IWarning, IComponentLogger } from '@vkontakte/videoplayer-shared';
|
|
3
|
+
import { IChromecastInitializer } from '../providers/ChromecastProvider/ChromecastInitializer/types';
|
|
4
|
+
import { HttpConnectionType, IAudioTrack, ICueSettings, ISources, SeekState } from '../player/types';
|
|
5
|
+
import { IExternalTextTrack, IInternalTextTrack, ITextTrack, IVideoTrack, IVolumeState, PlaybackState, PlaybackRate } from '../player/types';
|
|
6
|
+
import { IStateMachine } from '../utils/StateMachine/types';
|
|
7
|
+
import ThroughputEstimator from '../utils/ThroughputEstimator';
|
|
8
|
+
import { Scene3D } from '../utils/3d/Scene3D';
|
|
9
|
+
import { Vector2D } from '../utils/3d/types';
|
|
10
|
+
export interface IProvider {
|
|
11
|
+
scene3D?: Scene3D;
|
|
12
|
+
destroy(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface IProviderDependencies {
|
|
15
|
+
dependencies: {
|
|
16
|
+
throughputEstimator: ThroughputEstimator;
|
|
17
|
+
chromecastInitializer: IChromecastInitializer;
|
|
18
|
+
logger: ILogger;
|
|
19
|
+
abrLogger: IComponentLogger;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface IProviderParams<TSourceType> extends IProviderDependencies {
|
|
23
|
+
container: HTMLElement;
|
|
24
|
+
source: TSourceType;
|
|
25
|
+
desiredState: IDesiredState;
|
|
26
|
+
output: IProviderOutput;
|
|
27
|
+
tuning: ITuningConfig;
|
|
28
|
+
}
|
|
29
|
+
export interface IDesiredState {
|
|
30
|
+
playbackState: IStateMachine<PlaybackState>;
|
|
31
|
+
seekState: IStateMachine<SeekState>;
|
|
32
|
+
volume: IStateMachine<IVolumeState>;
|
|
33
|
+
playbackRate: IStateMachine<PlaybackRate>;
|
|
34
|
+
videoTrack: IStateMachine<IVideoTrack | undefined>;
|
|
35
|
+
autoVideoTrackSwitching: IStateMachine<boolean>;
|
|
36
|
+
autoVideoTrackLimits: IStateMachine<QualityLimits>;
|
|
37
|
+
isLooped: IStateMachine<boolean>;
|
|
38
|
+
externalTextTracks: IStateMachine<IExternalTextTrack[]>;
|
|
39
|
+
internalTextTracks: IStateMachine<IInternalTextTrack[]>;
|
|
40
|
+
currentTextTrack: IStateMachine<ITextTrack['id'] | undefined>;
|
|
41
|
+
textTrackCuesSettings: IStateMachine<ICueSettings>;
|
|
42
|
+
cameraOrientation: IStateMachine<Vector2D>;
|
|
43
|
+
}
|
|
44
|
+
export interface IProviderOutput {
|
|
45
|
+
position$: IValueSubject<Seconds>;
|
|
46
|
+
duration$: IValueSubject<Seconds>;
|
|
47
|
+
volume$: IValueSubject<IVolumeState>;
|
|
48
|
+
autoVideoTrackLimits$: IValueSubject<QualityLimits | undefined>;
|
|
49
|
+
currentVideoTrack$: IValueSubject<IVideoTrack | undefined>;
|
|
50
|
+
currentVideoSegmentLength$: IValueSubject<number>;
|
|
51
|
+
currentAudioSegmentLength$: IValueSubject<number>;
|
|
52
|
+
availableVideoTracks$: IValueSubject<IVideoTrack[]>;
|
|
53
|
+
availableAudioTracks$: IValueSubject<IAudioTrack[]>;
|
|
54
|
+
isAudioAvailable$: IValueSubject<boolean>;
|
|
55
|
+
autoVideoTrackLimitingAvailable$: IValueSubject<boolean>;
|
|
56
|
+
canChangePlaybackSpeed$: IValueSubject<boolean | undefined>;
|
|
57
|
+
currentBuffer$: IValueSubject<IRange<Seconds> | undefined>;
|
|
58
|
+
isBuffering$: IValueSubject<boolean>;
|
|
59
|
+
isLive$: IValueSubject<boolean | undefined>;
|
|
60
|
+
isLowLatency$: IValueSubject<boolean | undefined>;
|
|
61
|
+
liveTime$: IValueSubject<Milliseconds | undefined>;
|
|
62
|
+
liveBufferTime$: IValueSubject<Milliseconds | undefined>;
|
|
63
|
+
availableTextTracks$: IValueSubject<ITextTrack[]>;
|
|
64
|
+
currentTextTrack$: IValueSubject<ITextTrack['id'] | undefined>;
|
|
65
|
+
hostname$: IValueSubject<string | undefined>;
|
|
66
|
+
httpConnectionType$: IValueSubject<HttpConnectionType | undefined>;
|
|
67
|
+
httpConnectionReused$: IValueSubject<boolean | undefined>;
|
|
68
|
+
element$: IValueSubject<HTMLVideoElement | undefined>;
|
|
69
|
+
elementVisible$: IValueSubject<boolean>;
|
|
70
|
+
availableSources$: IValueSubject<ISources | undefined>;
|
|
71
|
+
willSeekEvent$: ISubject<void>;
|
|
72
|
+
seekedEvent$: ISubject<void>;
|
|
73
|
+
error$: ISubject<IError>;
|
|
74
|
+
warning$: ISubject<IWarning>;
|
|
75
|
+
endedEvent$: ISubject<void>;
|
|
76
|
+
loopedEvent$: ISubject<Seconds>;
|
|
77
|
+
firstBytesEvent$: ISubject<Milliseconds | void>;
|
|
78
|
+
firstFrameEvent$: ISubject<void>;
|
|
79
|
+
canplay$: ISubject<void>;
|
|
80
|
+
is3DVideo$: ISubject<boolean>;
|
|
81
|
+
inPiP$: IValueSubject<boolean>;
|
|
82
|
+
inFullscreen$: IValueSubject<boolean>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ExactVideoQuality, ILogger, IObservable, Subject } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { ITuningConfig } from '../../../utils/tuningConfig';
|
|
3
|
+
import { IVideoTrack } from '../../../player/types';
|
|
4
|
+
import { IStateMachine } from '../../../utils/StateMachine/types';
|
|
5
|
+
interface IConnectData {
|
|
6
|
+
logger: ILogger;
|
|
7
|
+
video: HTMLVideoElement;
|
|
8
|
+
droppedFramesChecker: ITuningConfig['droppedFramesChecker'];
|
|
9
|
+
isAuto: IStateMachine<boolean>;
|
|
10
|
+
playing$: IObservable<undefined>;
|
|
11
|
+
pause$: IObservable<undefined>;
|
|
12
|
+
tracks$: IObservable<IVideoTrack[]>;
|
|
13
|
+
}
|
|
14
|
+
declare class DroppedFramesManager {
|
|
15
|
+
onDroopedVideoFramesLimit$: Subject<void>;
|
|
16
|
+
private subscription;
|
|
17
|
+
private log;
|
|
18
|
+
private video;
|
|
19
|
+
private droppedFramesChecker;
|
|
20
|
+
private isAuto;
|
|
21
|
+
private playing;
|
|
22
|
+
private tracks;
|
|
23
|
+
private forceChecker$;
|
|
24
|
+
private isForceCheckCounter;
|
|
25
|
+
private prevTotalVideoFrames;
|
|
26
|
+
private prevDroppedVideoFrames;
|
|
27
|
+
private currentTimer;
|
|
28
|
+
private limitCounts;
|
|
29
|
+
private currentQuality;
|
|
30
|
+
private maxQualityLimit;
|
|
31
|
+
connect(data: IConnectData): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
get droppedVideoMaxQualityLimit(): ExactVideoQuality | undefined;
|
|
34
|
+
private subscribe;
|
|
35
|
+
private handleChangeVideoQuality;
|
|
36
|
+
private onChangeQuality;
|
|
37
|
+
private checkDroppedFrames;
|
|
38
|
+
private onDroopedVideoFramesLimitTrigger;
|
|
39
|
+
private getMaxQualityLimit;
|
|
40
|
+
private get isEnabled();
|
|
41
|
+
private get isDroppedFramesCheckerSupport();
|
|
42
|
+
private savePrevFrameCounts;
|
|
43
|
+
}
|
|
44
|
+
export default DroppedFramesManager;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { IExternalTextTrack, IInternalTextTrack, ITextTrack } from '../../../player/types';
|
|
2
|
+
import { IDesiredState, IProviderOutput } from '../../../providers/types';
|
|
3
|
+
/**
|
|
4
|
+
* TODO: сейчас externalTextTracks и internalTextTracks записываются в availableTextTracks отсюда
|
|
5
|
+
* нужно будет выпилить этот класс за исключением этой логики,
|
|
6
|
+
* когда перестанет быть необходима поддержка браузерных субтитров
|
|
7
|
+
*/
|
|
8
|
+
declare class TextTrackManager {
|
|
9
|
+
private available$;
|
|
10
|
+
private current$;
|
|
11
|
+
private error$;
|
|
12
|
+
private video;
|
|
13
|
+
private cueSettings;
|
|
14
|
+
private subscription;
|
|
15
|
+
private externalTracks;
|
|
16
|
+
private internalTracks;
|
|
17
|
+
connect(video: HTMLVideoElement, desiredState: Pick<IDesiredState, 'externalTextTracks' | 'internalTextTracks' | 'currentTextTrack' | 'textTrackCuesSettings'>, providerOutput: Pick<IProviderOutput, 'availableTextTracks$' | 'currentTextTrack$' | 'error$'>): void;
|
|
18
|
+
private subscribe;
|
|
19
|
+
private applyCueSettings;
|
|
20
|
+
private htmlTextTracksAsArray;
|
|
21
|
+
private htmlTextTrackToITextTrack;
|
|
22
|
+
private static isHealthyTrack;
|
|
23
|
+
setExternal(tracks: IExternalTextTrack[]): void;
|
|
24
|
+
setInternal(tracks: IInternalTextTrack[]): void;
|
|
25
|
+
select(selectedId: ITextTrack['id'] | undefined): void;
|
|
26
|
+
destroy(): void;
|
|
27
|
+
private attach;
|
|
28
|
+
private detach;
|
|
29
|
+
}
|
|
30
|
+
export default TextTrackManager;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const clear: (video: HTMLVideoElement) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const destroy: (video: HTMLVideoElement) => void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Пытаемся запустить видео обходя ошибку `NotAllowedError` путём включения `mute`.
|
|
3
|
+
* @param {HTMLVideoElement} video - видеообъект
|
|
4
|
+
* @return {Promise}<boolean> - получилось начать воспроизведение
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: (video: HTMLVideoElement) => Promise<boolean>;
|
|
7
|
+
export default _default;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Seconds, IRange, IObservable, IError, IValueObservable } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { IVolumeState, PlaybackRate } from '../../../player/types';
|
|
3
|
+
export interface IObservableVideo {
|
|
4
|
+
playing$: IObservable<undefined>;
|
|
5
|
+
pause$: IObservable<undefined>;
|
|
6
|
+
canplay$: IObservable<undefined>;
|
|
7
|
+
ended$: IObservable<undefined>;
|
|
8
|
+
looped$: IObservable<Seconds>;
|
|
9
|
+
error$: IObservable<IError>;
|
|
10
|
+
seeked$: IObservable<undefined>;
|
|
11
|
+
seeking$: IObservable<undefined>;
|
|
12
|
+
progress$: IObservable<undefined>;
|
|
13
|
+
timeUpdate$: IObservable<Seconds>;
|
|
14
|
+
durationChange$: IObservable<Seconds>;
|
|
15
|
+
loadStart$: IObservable<void>;
|
|
16
|
+
loadedMetadata$: IObservable<undefined>;
|
|
17
|
+
loadedData$: IObservable<undefined>;
|
|
18
|
+
isBuffering$: IObservable<boolean>;
|
|
19
|
+
currentBuffer$: IObservable<IRange<Seconds>>;
|
|
20
|
+
volumeState$: IObservable<IVolumeState>;
|
|
21
|
+
playbackRateState$: IObservable<PlaybackRate>;
|
|
22
|
+
inPiP$: IValueObservable<boolean>;
|
|
23
|
+
inFullscreen$: IValueObservable<boolean>;
|
|
24
|
+
}
|
|
25
|
+
export declare const observe: (video: HTMLVideoElement) => IObservableVideo;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { ILiveOffset } from './types';
|
|
3
|
+
export default class LiveOffset implements ILiveOffset {
|
|
4
|
+
private pausedTime;
|
|
5
|
+
private streamOffset;
|
|
6
|
+
private pauseTimestamp;
|
|
7
|
+
getTotalPausedTime(): Milliseconds;
|
|
8
|
+
getCurrentPausedTime(): Milliseconds;
|
|
9
|
+
getStreamOffset(): Milliseconds;
|
|
10
|
+
getTotalOffset(): Milliseconds;
|
|
11
|
+
pause(): void;
|
|
12
|
+
resume(): void;
|
|
13
|
+
resetTo(offset: Milliseconds, isPaused?: boolean): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
export interface ILiveOffset {
|
|
3
|
+
getTotalPausedTime(): Milliseconds;
|
|
4
|
+
getCurrentPausedTime(): Milliseconds;
|
|
5
|
+
getStreamOffset(): Milliseconds;
|
|
6
|
+
getTotalOffset(): Milliseconds;
|
|
7
|
+
pause(): void;
|
|
8
|
+
resume(): void;
|
|
9
|
+
resetTo(offset: Milliseconds, isPaused?: boolean): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
export declare enum OffsetParameterType {
|
|
3
|
+
OFFSET_P = 0,
|
|
4
|
+
PLAYBACK_SHIFT = 1,
|
|
5
|
+
DASH_CMAF_OFFSET_P = 2
|
|
6
|
+
}
|
|
7
|
+
declare const _default: (url: string, offset?: Milliseconds, type?: OffsetParameterType) => string;
|
|
8
|
+
export default _default;
|
|
9
|
+
export declare const getLiveUrlOffset: (url: string, type: OffsetParameterType) => number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parseFps: (frameRateValue: string) => number;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IListener, IObservable, ISubscription } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { IVolumeState, PlaybackRate } from '../../player/types';
|
|
3
|
+
import { IStateMachine } from '../../utils/StateMachine/types';
|
|
4
|
+
declare const syncDesiredState: <Value>(desiredState: IStateMachine<Value | undefined>, get: () => Value | undefined, set: (value: Value | undefined) => void, { equal, changed$, onError, }?: {
|
|
5
|
+
equal?: ((a: Value | undefined, b: Value | undefined) => boolean) | undefined;
|
|
6
|
+
changed$?: IObservable<Value | undefined> | undefined;
|
|
7
|
+
onError?: IListener<unknown> | undefined;
|
|
8
|
+
}) => ISubscription;
|
|
9
|
+
export declare const syncVideoLooped: (video: HTMLVideoElement, desiredState: IStateMachine<boolean>, onError?: IListener<Error | unknown>) => ISubscription;
|
|
10
|
+
export declare const syncVideoVolumeState: (video: HTMLVideoElement, desiredState: IStateMachine<IVolumeState>, changed$: IObservable<IVolumeState>, onError?: IListener<Error | unknown>) => ISubscription;
|
|
11
|
+
export declare const syncVideoPlaybackRate: (video: HTMLVideoElement, desiredState: IStateMachine<PlaybackRate>, changed$: IObservable<PlaybackRate>, onError?: IListener<Error | unknown>) => ISubscription;
|
|
12
|
+
export default syncDesiredState;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IStateMachine } from '../../utils/StateMachine/types';
|
|
2
|
+
import { PlaybackState } from '../../player/types';
|
|
3
|
+
declare const _default: (playbackState: IStateMachine<PlaybackState>, value: PlaybackState, ignoreCurrentTransition?: boolean) => void;
|
|
4
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Degree, Vector2D, Vector3D } from '../../utils/3d/types';
|
|
2
|
+
/**
|
|
3
|
+
* Модель камеры трехмерной сцены
|
|
4
|
+
*/
|
|
5
|
+
export declare class Camera3D {
|
|
6
|
+
fov: Vector2D<Degree>;
|
|
7
|
+
/**
|
|
8
|
+
* x: Degree; // yaw (around vertical Y axis)
|
|
9
|
+
* y: Degree; // pitch (around horizontal X axis)
|
|
10
|
+
* z: Degree; // roll (around normal Z axis)
|
|
11
|
+
*/
|
|
12
|
+
orientation: Vector3D<Degree>;
|
|
13
|
+
constructor(fov: Vector2D<Degree>, orientation: Vector3D<Degree>);
|
|
14
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Camera3D } from '../../utils/3d/Camera3D';
|
|
2
|
+
import { DegreePerSecond, CameraRotationManagerParams, Degree, Vector3D } from '../../utils/3d/types';
|
|
3
|
+
/**
|
|
4
|
+
* Класс управляющий вращением камеры
|
|
5
|
+
*/
|
|
6
|
+
export declare class CameraRotationManager {
|
|
7
|
+
private options;
|
|
8
|
+
private camera;
|
|
9
|
+
private rotating;
|
|
10
|
+
private fading;
|
|
11
|
+
private lastTickTS;
|
|
12
|
+
private lastCameraTurn;
|
|
13
|
+
private lastCameraTurnTS;
|
|
14
|
+
private fadeStartSpeed;
|
|
15
|
+
private fadeCorrection;
|
|
16
|
+
private fadeTime;
|
|
17
|
+
rotationSpeed: Vector3D<DegreePerSecond>;
|
|
18
|
+
constructor(camera: Camera3D, options: CameraRotationManagerParams);
|
|
19
|
+
/**
|
|
20
|
+
* Поворот камеры из текущего положения на заданное количество градусов
|
|
21
|
+
*/
|
|
22
|
+
turnCamera(dx?: Degree, dy?: Degree, dz?: Degree): void;
|
|
23
|
+
/**
|
|
24
|
+
* Поворот камеры в заданное положение
|
|
25
|
+
*/
|
|
26
|
+
pointCameraTo(x?: Degree, y?: Degree, z?: Degree): void;
|
|
27
|
+
/**
|
|
28
|
+
* Устанавливает угловые скорости по осям
|
|
29
|
+
* Если скорость для оси не задана будет использована ее текущая скорость
|
|
30
|
+
*/
|
|
31
|
+
setRotationSpeed(sx?: DegreePerSecond, sy?: DegreePerSecond, sz?: DegreePerSecond): void;
|
|
32
|
+
/**
|
|
33
|
+
* Start permanent rotation
|
|
34
|
+
*/
|
|
35
|
+
startRotation(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Выставляет нулевую скорость, что приводит к плавной остановке
|
|
38
|
+
* при передаче поднятого флага останавливает движение мгновенно
|
|
39
|
+
*/
|
|
40
|
+
stopRotation(immediate?: boolean): void;
|
|
41
|
+
/**
|
|
42
|
+
* "Толкает" камеру для плавного затухания при наличии остаточного "крутящего момента"
|
|
43
|
+
*/
|
|
44
|
+
onCameraRelease(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Запускает режим затухания
|
|
47
|
+
*/
|
|
48
|
+
private startFading;
|
|
49
|
+
/**
|
|
50
|
+
* Останавливает режим затухания
|
|
51
|
+
*/
|
|
52
|
+
private stopFading;
|
|
53
|
+
/**
|
|
54
|
+
* Ограничивает угол поворота по вертикальной оси
|
|
55
|
+
*/
|
|
56
|
+
private limitCameraRotationY;
|
|
57
|
+
/**
|
|
58
|
+
* Рассчитывает положение камеры согласно текущей скорости с эмуляцией инерции
|
|
59
|
+
* @param time - ms from page load
|
|
60
|
+
*/
|
|
61
|
+
tick(time: number): void;
|
|
62
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Degree, Pixel, Scene3DParams, Vector2D, Vector3D } from '../../utils/3d/types';
|
|
2
|
+
/**
|
|
3
|
+
* Класс описывающий 3D сцену - канву на которой будет рисоваться проекция
|
|
4
|
+
*/
|
|
5
|
+
export declare class Scene3D {
|
|
6
|
+
private container;
|
|
7
|
+
private sourceVideoElement;
|
|
8
|
+
private canvas;
|
|
9
|
+
private gl;
|
|
10
|
+
private params;
|
|
11
|
+
private frameWidth;
|
|
12
|
+
private frameHeight;
|
|
13
|
+
private viewportWidth;
|
|
14
|
+
private viewportHeight;
|
|
15
|
+
private videoInitialized;
|
|
16
|
+
private program;
|
|
17
|
+
private videoTexture;
|
|
18
|
+
private vertexBuffer;
|
|
19
|
+
private textureMappingBuffer;
|
|
20
|
+
private camera;
|
|
21
|
+
private cameraRotationManager;
|
|
22
|
+
private videoElementDataLoadedFn;
|
|
23
|
+
private renderFn;
|
|
24
|
+
private active;
|
|
25
|
+
constructor(container: HTMLElement, sourceVideoElement: HTMLVideoElement, params: Scene3DParams);
|
|
26
|
+
/**
|
|
27
|
+
* Запускает отрисовку сцены
|
|
28
|
+
*/
|
|
29
|
+
play(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Останавливает отрисовку сцены
|
|
32
|
+
*/
|
|
33
|
+
stop(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Запускает режим постоянного вращение камеры согласно переданным коэффициентам угловых скоростей
|
|
36
|
+
* Базовая величина скорости задается в конфиге
|
|
37
|
+
* Итоговая скорость будет равна произведению базовой скорости и переданного коэффициента
|
|
38
|
+
* Принимает как положительные так и отрицательные значения (для противоположного вращения)
|
|
39
|
+
*/
|
|
40
|
+
startCameraManualRotation(mx: number, my: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Останавливает режим постоянного вращение камеры
|
|
43
|
+
*/
|
|
44
|
+
stopCameraManualRotation(immediate?: boolean): void;
|
|
45
|
+
/**
|
|
46
|
+
* Перемещает точку фокуса камеры на заданный угол
|
|
47
|
+
*/
|
|
48
|
+
turnCamera(dx: Degree, dy: Degree): void;
|
|
49
|
+
/**
|
|
50
|
+
* Перемещает точку фокуса камеры на заданный угол
|
|
51
|
+
*/
|
|
52
|
+
pointCameraTo(dx: Degree, dy: Degree): void;
|
|
53
|
+
/**
|
|
54
|
+
* Преобразовывает экранные координаты в градусы в соответствии с текущим полем обзора
|
|
55
|
+
*/
|
|
56
|
+
pixelToDegree(vector: Vector2D<Pixel>): Vector2D<Degree>;
|
|
57
|
+
/**
|
|
58
|
+
* Возвращает текущую ориентацию камеры
|
|
59
|
+
*/
|
|
60
|
+
getCameraRotation(): Vector3D;
|
|
61
|
+
/**
|
|
62
|
+
* Захват камеры - переход в ручное управление
|
|
63
|
+
*/
|
|
64
|
+
holdCamera(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Возвращает управление внутренним алгоритмам
|
|
67
|
+
*/
|
|
68
|
+
releaseCamera(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Уничтожает сцену
|
|
71
|
+
*/
|
|
72
|
+
destroy(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Устанавливает размер "экрана"
|
|
75
|
+
*/
|
|
76
|
+
setViewportSize(vpx: number, vpy: number): void;
|
|
77
|
+
/**
|
|
78
|
+
* Обработчик события загрузки данных на видеоэлементе
|
|
79
|
+
*/
|
|
80
|
+
private onDataLoadedHandler;
|
|
81
|
+
/**
|
|
82
|
+
* Запускает режим отрисовки
|
|
83
|
+
*/
|
|
84
|
+
private doPlay;
|
|
85
|
+
/**
|
|
86
|
+
* Основная функция отрисовки
|
|
87
|
+
*
|
|
88
|
+
* @param ts - ms from page load
|
|
89
|
+
*/
|
|
90
|
+
private render;
|
|
91
|
+
/**
|
|
92
|
+
* Создает шейдер
|
|
93
|
+
*/
|
|
94
|
+
private createShader;
|
|
95
|
+
/**
|
|
96
|
+
* Создает webGL програму
|
|
97
|
+
*/
|
|
98
|
+
private createProgram;
|
|
99
|
+
/**
|
|
100
|
+
* Создает текстуру
|
|
101
|
+
*/
|
|
102
|
+
private createTexture;
|
|
103
|
+
/**
|
|
104
|
+
* Обновляет текстуру
|
|
105
|
+
* Считывает текущий кадр из видео
|
|
106
|
+
*/
|
|
107
|
+
private updateTexture;
|
|
108
|
+
/**
|
|
109
|
+
* Создает буфер вершин плоскости с учетом поправки на отношение сторон
|
|
110
|
+
*/
|
|
111
|
+
private createVertexBuffer;
|
|
112
|
+
/**
|
|
113
|
+
* Создает буффер маппинга текстуры
|
|
114
|
+
*/
|
|
115
|
+
private createTextureMappingBuffer;
|
|
116
|
+
/**
|
|
117
|
+
* Рассчитывает положение текстуры на плоскости
|
|
118
|
+
*/
|
|
119
|
+
private calculateTexturePosition;
|
|
120
|
+
/**
|
|
121
|
+
* Обновляет значения в буффере маппинга текстуры
|
|
122
|
+
*/
|
|
123
|
+
private updateTextureMappingBuffer;
|
|
124
|
+
/**
|
|
125
|
+
* Обновляет кэш различных размеров
|
|
126
|
+
*/
|
|
127
|
+
private updateFrameSize;
|
|
128
|
+
/**
|
|
129
|
+
* Создает канву для сцены
|
|
130
|
+
*/
|
|
131
|
+
createCanvas(): HTMLCanvasElement;
|
|
132
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Milliseconds } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
export interface Vector3D<T = number> {
|
|
3
|
+
x: T;
|
|
4
|
+
y: T;
|
|
5
|
+
z: T;
|
|
6
|
+
}
|
|
7
|
+
export interface Vector2D<T = number> {
|
|
8
|
+
x: T;
|
|
9
|
+
y: T;
|
|
10
|
+
}
|
|
11
|
+
export type Pixel = number;
|
|
12
|
+
export type Degree = number;
|
|
13
|
+
export type DegreePerSecond = number;
|
|
14
|
+
export interface CameraRotationManagerParams {
|
|
15
|
+
rotationSpeed: DegreePerSecond;
|
|
16
|
+
maxYawAngle: Degree;
|
|
17
|
+
speedFadeTime: Milliseconds;
|
|
18
|
+
speedFadeThreshold: Milliseconds;
|
|
19
|
+
degreeToPixelCorrection: number;
|
|
20
|
+
rotationSpeedCorrection: number;
|
|
21
|
+
}
|
|
22
|
+
export interface Scene3DParams extends CameraRotationManagerParams {
|
|
23
|
+
fov: Vector2D;
|
|
24
|
+
orientation: Vector3D;
|
|
25
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IObservable, ISubject } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { IStateMachine, ITransition } from './types';
|
|
3
|
+
export default class StateMachine<TState> implements IStateMachine<TState> {
|
|
4
|
+
private state;
|
|
5
|
+
private prevState;
|
|
6
|
+
private transition?;
|
|
7
|
+
transitionStarted$: ISubject<ITransition<TState>>;
|
|
8
|
+
transitionEnded$: ISubject<ITransition<TState>>;
|
|
9
|
+
transitionUpdated$: ISubject<ITransition<TState>>;
|
|
10
|
+
forceChanged$: ISubject<ITransition<TState>>;
|
|
11
|
+
stateChangeStarted$: IObservable<ITransition<TState>>;
|
|
12
|
+
stateChangeEnded$: IObservable<ITransition<TState>>;
|
|
13
|
+
constructor(initialState: TState);
|
|
14
|
+
setState(newState: TState): void;
|
|
15
|
+
startTransitionTo(newState: TState): void;
|
|
16
|
+
getTransition(): ITransition<TState> | undefined;
|
|
17
|
+
getState(): TState;
|
|
18
|
+
getPrevState(): TState | undefined;
|
|
19
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { IObservable } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
export interface IStateMachine<TState> {
|
|
3
|
+
/**
|
|
4
|
+
* Событие о начале перехода между состояниями
|
|
5
|
+
*/
|
|
6
|
+
transitionStarted$: IObservable<ITransition<TState>>;
|
|
7
|
+
/**
|
|
8
|
+
* Событие об изменении целевого состояния в процессе осуществления перехода
|
|
9
|
+
*/
|
|
10
|
+
transitionUpdated$: IObservable<ITransition<TState>>;
|
|
11
|
+
/**
|
|
12
|
+
* Событие об окончании перехода между состояниями
|
|
13
|
+
*/
|
|
14
|
+
transitionEnded$: IObservable<ITransition<TState>>;
|
|
15
|
+
/**
|
|
16
|
+
* Событие о переходе в состояние, transition в которое не начинался
|
|
17
|
+
*/
|
|
18
|
+
forceChanged$: IObservable<ITransition<TState>>;
|
|
19
|
+
/**
|
|
20
|
+
* Приозводное от `transitionStarted$` и `transitionUpdated$` событие.
|
|
21
|
+
*/
|
|
22
|
+
stateChangeStarted$: IObservable<ITransition<TState>>;
|
|
23
|
+
/**
|
|
24
|
+
* Приозводное от `transitionEnded$` и `forceChanged$` событие.
|
|
25
|
+
*/
|
|
26
|
+
stateChangeEnded$: IObservable<ITransition<TState>>;
|
|
27
|
+
/**
|
|
28
|
+
* Начало перехода в состояние.
|
|
29
|
+
* Если в этот момент не было активного transition - будет отправлено событие `transitionStarted$`,
|
|
30
|
+
* иначе - `transitionUpdated$`
|
|
31
|
+
*/
|
|
32
|
+
startTransitionTo(state: TState): void;
|
|
33
|
+
/**
|
|
34
|
+
* Окончание перехода в состояние.
|
|
35
|
+
* Если transition в это состояние был начат - будет отправлено событие `transitionEnded$`,
|
|
36
|
+
* иначе - `forceChanged$`
|
|
37
|
+
*/
|
|
38
|
+
setState(state: TState): void;
|
|
39
|
+
/**
|
|
40
|
+
* Возвращает текущее состояние.
|
|
41
|
+
* Если сейчас есть активный transition - будет возвращено состояние, transition в которое сейчас выполняется (оптимистичноая стратегия изменений)
|
|
42
|
+
*/
|
|
43
|
+
getState(): TState;
|
|
44
|
+
/**
|
|
45
|
+
* Возвращает предыдущее состояние.
|
|
46
|
+
*/
|
|
47
|
+
getPrevState(): TState | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Возвращает текущий transition (если есть). Иначе - `undefined`
|
|
50
|
+
*/
|
|
51
|
+
getTransition(): ITransition<TState> | undefined;
|
|
52
|
+
}
|
|
53
|
+
export interface ITransition<TState> {
|
|
54
|
+
from: TState;
|
|
55
|
+
to: TState;
|
|
56
|
+
/**
|
|
57
|
+
* Информация о том, что переход был осуществлён с прерыванием другого перехода
|
|
58
|
+
*/
|
|
59
|
+
canceledTransition?: ITransition<TState>;
|
|
60
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface IStatefulIterator<T> {
|
|
2
|
+
next(): void;
|
|
3
|
+
getValue(): T;
|
|
4
|
+
isCompleted(): boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class StatefulIterator<T> implements IStatefulIterator<T> {
|
|
7
|
+
private iterator;
|
|
8
|
+
private current;
|
|
9
|
+
constructor(iteratorOrIterable: Iterable<T>);
|
|
10
|
+
next(): void;
|
|
11
|
+
getValue(): T;
|
|
12
|
+
isCompleted(): boolean;
|
|
13
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Byte, Kbps, Milliseconds, IValueSubject } from '@vkontakte/videoplayer-shared';
|
|
2
|
+
import { ITuningConfig } from '../utils/tuningConfig';
|
|
3
|
+
declare class ThroughputEstimator {
|
|
4
|
+
private throughput;
|
|
5
|
+
private rtt;
|
|
6
|
+
private subscription;
|
|
7
|
+
private tuningConfig;
|
|
8
|
+
private concurrentDownloads;
|
|
9
|
+
throughput$: IValueSubject<Kbps>;
|
|
10
|
+
rtt$: IValueSubject<Milliseconds>;
|
|
11
|
+
rttAdjustedThroughput$: IValueSubject<Kbps>;
|
|
12
|
+
constructor(tuning: ITuningConfig['throughputEstimator']);
|
|
13
|
+
destroy(): void;
|
|
14
|
+
trackXHR(xhr: XMLHttpRequest): void;
|
|
15
|
+
trackStream(stream: ReadableStream, isLowLatency?: boolean): void;
|
|
16
|
+
addRawSpeed(size: Byte, time: Milliseconds, concurrency?: number, isLowLatency?: boolean): void;
|
|
17
|
+
/**
|
|
18
|
+
* Стоит использовать только когда другие методы совсем не получается
|
|
19
|
+
*/
|
|
20
|
+
addRawThroughput(rate: Kbps): void;
|
|
21
|
+
addRawRtt(time: Milliseconds): void;
|
|
22
|
+
private static sanityCheck;
|
|
23
|
+
private static load;
|
|
24
|
+
}
|
|
25
|
+
export default ThroughputEstimator;
|