Skip to content

Commit

Permalink
fixup! feat: mp4 mode handling
Browse files Browse the repository at this point in the history
  • Loading branch information
bwallberg committed Sep 27, 2024
1 parent de53b42 commit fa8f8af
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 41 deletions.
1 change: 1 addition & 0 deletions src/demo/native-events.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"](
Expand Down
80 changes: 39 additions & 41 deletions src/media-event-filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand Down

0 comments on commit fa8f8af

Please sign in to comment.