11import { resolveBufferPolicy } from "./buffer-policy" ;
22import { EventEmitter } from "./event-emitter" ;
33import { HttpClient } from "./http-client" ;
4+ import { MediaElementObserver } from "./media-element-observer" ;
45import { MediaSourceController } from "./media-source-controller" ;
56import { PlaybackClient } from "./playback-client" ;
67import { PlaybackLoop } from "./playback-loop" ;
7- import { createSnapshot , type TypeTypeMseSnapshot } from "./player-snapshot" ;
8+ import { bufferedEndMs , createSnapshot , type TypeTypeMseSnapshot } from "./player-snapshot" ;
89import { SeekController } from "./seek-controller" ;
910import { SegmentScheduler } from "./segment-scheduler" ;
1011import { type LoadedSession , loadPlaybackSession } from "./session-loader" ;
@@ -19,6 +20,7 @@ export class TypeTypeMsePlayer {
1920 private readonly emitter = new EventEmitter ( ) ;
2021 private readonly http : HttpClient ;
2122 private readonly playback : PlaybackClient ;
23+ private readonly mediaEvents : MediaElementObserver ;
2224 private readonly media : MediaSourceController ;
2325 private readonly scheduler : SegmentScheduler ;
2426 private readonly loop : PlaybackLoop ;
@@ -39,6 +41,12 @@ export class TypeTypeMsePlayer {
3941 : { endpoint : config . endpoint } ,
4042 ) ;
4143 this . playback = new PlaybackClient ( this . http ) ;
44+ this . mediaEvents = new MediaElementObserver ( {
45+ video,
46+ state : ( state ) => this . setState ( state ) ,
47+ error : ( error ) => this . handleError ( error ) ,
48+ } ) ;
49+ this . mediaEvents . start ( ) ;
4250 this . media = new MediaSourceController ( video ) ;
4351 this . scheduler = new SegmentScheduler ( this . http , this . media , this . emitter ) ;
4452 this . loop = new PlaybackLoop ( {
@@ -50,7 +58,7 @@ export class TypeTypeMsePlayer {
5058 policy : resolveBufferPolicy ( config ) ,
5159 session : ( ) => this . session ,
5260 signal : ( ) => this . operation . signal ,
53- bufferedEndMs : ( ) => this . bufferedEndMs ( ) ,
61+ bufferedEndMs : ( ) => bufferedEndMs ( this . video ) ,
5462 error : ( error ) => this . handleError ( error ) ,
5563 } ) ;
5664 }
@@ -95,7 +103,7 @@ export class TypeTypeMsePlayer {
95103 }
96104
97105 snapshot ( ) : TypeTypeMseSnapshot {
98- return createSnapshot ( this . video , this . state , this . session , this . bufferedEndMs ( ) ) ;
106+ return createSnapshot ( this . video , this . state , this . session , bufferedEndMs ( this . video ) ) ;
99107 }
100108
101109 destroy ( ) : void {
@@ -104,6 +112,7 @@ export class TypeTypeMsePlayer {
104112 this . operation . abort ( ) ;
105113 this . seekController . reset ( ) ;
106114 this . loop . stop ( ) ;
115+ this . mediaEvents . stop ( ) ;
107116 this . media . detach ( ) ;
108117 this . emitter . clear ( ) ;
109118 this . state = "destroyed" ;
@@ -151,12 +160,6 @@ export class TypeTypeMsePlayer {
151160 this . setState ( "ready" ) ;
152161 }
153162
154- private bufferedEndMs ( ) : number {
155- const buffered = this . video . buffered ;
156- if ( buffered . length === 0 ) return 0 ;
157- return Math . round ( buffered . end ( buffered . length - 1 ) * 1000 ) ;
158- }
159-
160163 private setState ( state : TypeTypeMseState ) : void {
161164 if ( this . state === state ) return ;
162165 this . state = state ;
0 commit comments