diff --git a/src/demo/native-events.hook.ts b/src/demo/native-events.hook.ts index 976d5dd..bc9277c 100644 --- a/src/demo/native-events.hook.ts +++ b/src/demo/native-events.hook.ts @@ -17,6 +17,7 @@ export const useNativeEvents = ({ video }: { video: HTMLVideoElement }) => { currentTime: video.currentTime, duration: video.duration, seeking: video.seeking, + playbackRate: video.playbackRate, }; console[evt === MediaEvent.timeupdate ? "debug" : "log"]( diff --git a/src/media-event-filter.ts b/src/media-event-filter.ts index 0983dfc..2c237a6 100644 --- a/src/media-event-filter.ts +++ b/src/media-event-filter.ts @@ -129,7 +129,6 @@ export const getMediaEventFilter = ({ }; const isNotReady = (): boolean => state.loading || state.ended; - const isReady = () => !isNotReady(); // Reset state of media event filter when a new src is // attached to the media element. @@ -138,63 +137,62 @@ export const getMediaEventFilter = ({ }; const onCanPlay = (): void => { - if (isReady()) { - // guard for when an engine sets playbackRate to 0 to continue buffering - // recover in "ratechange" event - if (mediaElement.playbackRate === 0) { - state = { - ...state, - deferCanPlay: true, - }; - - return; + if (isNotReady()) { + if (mp4Mode) { + onCanPlayThrough(); } - + return + } + // guard for when an engine sets playbackRate to 0 to continue buffering + // recover in "ratechange" event + if (mediaElement.playbackRate === 0) { state = { ...state, - deferCanPlay: false, + deferCanPlay: true, }; - // block for handling behaviour after initial load, - // like buffer and seek recovery - clearRatechangeBufferTimeout(); + return; + } - if (state.buffering) { - state = { - ...state, - buffering: false, - }; + state = { + ...state, + deferCanPlay: false, + }; - callback(FilteredMediaEvent.BUFFERED); + // block for handling behaviour after initial load, + // like buffer and seek recovery + clearRatechangeBufferTimeout(); - if (state.deferPlayingEvent) { - onPlaying(); - } - } else if (state.seeking) { - state = { - ...state, - seeking: false, - deferSeekedEvent: false, - }; + if (state.buffering) { + state = { + ...state, + buffering: false, + }; - callback(FilteredMediaEvent.SEEKED); + callback(FilteredMediaEvent.BUFFERED); - if (state.deferPlayingEvent) { - onPlaying(); - } + if (state.deferPlayingEvent) { + onPlaying(); + } + } else if (state.seeking) { + state = { + ...state, + seeking: false, + deferSeekedEvent: false, + }; + + callback(FilteredMediaEvent.SEEKED); + + if (state.deferPlayingEvent) { + onPlaying(); } - } - if (mp4Mode) { - // Some MP4 files can stop buffering at readyState 3 (canplay), if mp4Mode is enabled we - // trigger canplaythrough at readyState 3. - onCanPlayThrough(); } }; const onCanPlayThrough = (): void => { // guard for when an engine sets playbackRate to 0 to continue buffering // recover in "ratechange" event - if (mediaElement.playbackRate === 0) { + if (!mp4Mode && mediaElement.playbackRate === 0) { state = { ...state, deferCanPlayThroughHandling: true,