From de53b42dad28950d6128308a00e046a2758ba33f Mon Sep 17 00:00:00 2001 From: Benjamin Wallberg Date: Fri, 27 Sep 2024 11:05:42 +0200 Subject: [PATCH] fixup! feat: mp4 mode handling --- src/media-event-filter.ts | 79 ++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/media-event-filter.ts b/src/media-event-filter.ts index 984931b..0983dfc 100644 --- a/src/media-event-filter.ts +++ b/src/media-event-filter.ts @@ -129,6 +129,7 @@ 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. @@ -137,57 +138,57 @@ export const getMediaEventFilter = ({ }; const onCanPlay = (): void => { - if (mp4Mode) { - // Some MP4 files can stop buffering at readyState 3 (canplay), if mp4Mode is enabled we - // trigger canplaythrough at readyState 3. - onCanPlayThrough(); - } - if (isNotReady()) return; + 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; + } - // guard for when an engine sets playbackRate to 0 to continue buffering - // recover in "ratechange" event - if (mediaElement.playbackRate === 0) { state = { ...state, - deferCanPlay: true, + deferCanPlay: false, }; - return; - } - - state = { - ...state, - deferCanPlay: false, - }; - - // block for handling behaviour after initial load, - // like buffer and seek recovery - clearRatechangeBufferTimeout(); + // block for handling behaviour after initial load, + // like buffer and seek recovery + clearRatechangeBufferTimeout(); - if (state.buffering) { - state = { - ...state, - buffering: false, - }; + if (state.buffering) { + state = { + ...state, + buffering: false, + }; - callback(FilteredMediaEvent.BUFFERED); + callback(FilteredMediaEvent.BUFFERED); - if (state.deferPlayingEvent) { - onPlaying(); - } - } else if (state.seeking) { - state = { - ...state, - seeking: false, - deferSeekedEvent: false, - }; + if (state.deferPlayingEvent) { + onPlaying(); + } + } else if (state.seeking) { + state = { + ...state, + seeking: false, + deferSeekedEvent: false, + }; - callback(FilteredMediaEvent.SEEKED); + callback(FilteredMediaEvent.SEEKED); - if (state.deferPlayingEvent) { - onPlaying(); + 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 => {