Skip to content

Commit

Permalink
Merge pull request #1257 from canalplus/fix/ps5-loaded
Browse files Browse the repository at this point in the history
PS5: wait for a readyState of `4` before considering the content loaded
  • Loading branch information
peaBerberian authored Jul 3, 2023
2 parents 68fa2e3 + c2d53c6 commit e80e99a
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 1 deletion.
36 changes: 36 additions & 0 deletions src/compat/__tests__/should_wait_for_have_enough_data.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-return */

describe("compat - shouldWaitForHaveEnoughData", () => {
beforeEach(() => {
jest.resetModules();
});

it("should return false if we are not on the Playstation 5", () => {
jest.mock("../browser_detection", () => {
return {
__esModule: true as const,
isPlayStation5: false,
};
});
const shouldWaitForHaveEnoughData =
jest.requireActual("../should_wait_for_have_enough_data");
expect(shouldWaitForHaveEnoughData.default()).toBe(false);
});

it("should return true if we are on the Playstation 5", () => {
jest.mock("../browser_detection", () => {
return {
__esModule: true as const,
isPlayStation5: true,
};
});
const shouldWaitForHaveEnoughData =
jest.requireActual("../should_wait_for_have_enough_data");
expect(shouldWaitForHaveEnoughData.default()).toBe(true);
});
});
2 changes: 2 additions & 0 deletions src/compat/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import shouldRenewMediaKeySystemAccess from "./should_renew_media_key_system_acc
import shouldUnsetMediaKeys from "./should_unset_media_keys";
import shouldValidateMetadata from "./should_validate_metadata";
import shouldWaitForDataBeforeLoaded from "./should_wait_for_data_before_loaded";
import shouldWaitForHaveEnoughData from "./should_wait_for_have_enough_data";

// TODO To remove. This seems to be the only side-effect done on import, which
// we would prefer to disallow (both for the understandability of the code and
Expand Down Expand Up @@ -105,5 +106,6 @@ export {
shouldUnsetMediaKeys,
shouldValidateMetadata,
shouldWaitForDataBeforeLoaded,
shouldWaitForHaveEnoughData,
tryToChangeSourceBufferType,
};
17 changes: 17 additions & 0 deletions src/compat/should_wait_for_have_enough_data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { isPlayStation5 } from "./browser_detection";

/**
* An `HTMLMediaElement`'s readyState allows the browser to communicate whether
* it can play a content reliably.
* Usually, we may consider that a `HAVE_FUTURE_DATA` (readyState `3`) or even
* a `HAVE_CURRENT_DATA` (readyState `2`) is enough to begin playing the content
* and consider it as loaded.
*
* However some devices wrongly anounce those readyStates before being actually
* able to decode the content. For those devices we wait for the
* `HAVE_ENOUGH_DATA` readyState before considering the content as loaded.
* @returns {boolean}
*/
export default function shouldWaitForHaveEnoughData() : boolean {
return isPlayStation5;
}
5 changes: 4 additions & 1 deletion src/core/init/utils/get_loaded_reference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import {
shouldValidateMetadata,
shouldWaitForDataBeforeLoaded,
shouldWaitForHaveEnoughData,
} from "../../../compat";
import createSharedReference, {
IReadOnlySharedReference,
Expand Down Expand Up @@ -64,7 +65,9 @@ export default function getLoadedReference(
}
}

if (observation.readyState >= 3 && observation.currentRange !== null) {
const minReadyState = shouldWaitForHaveEnoughData() ? 4 :
3;
if (observation.readyState >= minReadyState && observation.currentRange !== null) {
if (!shouldValidateMetadata() || mediaElement.duration > 0) {
isLoaded.setValue(true);
listenCanceller.cancel();
Expand Down

0 comments on commit e80e99a

Please sign in to comment.