Commit Graph

282 Commits

Author SHA1 Message Date
Andy(김규회) c7368024ae feat: Select default track by a list of preferences (#9542)
I went ahead and implemented the full structured preference system that
was discussed in
https://github.com/shaka-project/shaka-player/issues/1591.
Instead of just expanding languages to arrays, I replaced all 14
individual preference fields with 3 structured arrays:

```tsx
  preferredAudio (language, role, label, channelCount, codec, spatialAudio)
  preferredText (language, role, format, forced)
  preferredVideo (label, role, codec, hdrLevel, layout)
```

Each array entry works as an AND filter - so you can say things like "I
want Korean with 5.1 surround, but if not available, English is fine
too":

```tsx
player.configure('preferredAudio', [
  {language: 'ko', channelCount: 6},
  {language: 'ko'},
  {language: 'en'},
]);
```

<img width="1728" height="965" alt="image"
src="https://github.com/user-attachments/assets/7b088150-139b-475e-bdba-5bc77dd4e524"
/>

**Config** - Replaced the 14 individual fields with 3 arrays of typed
preference objects (AudioPreference, TextPreference, VideoPreference).
The old fields still work at runtime with a deprecation warning, so
existing apps won't break immediately.

**Demo** - The demo config UI now shows inline expandable preference
lists instead of flat text inputs. You can add/remove entries and
configure each field per entry. URL hash serialization was updated to
use JSON format, with legacy param fallbacks preserved.
2026-02-20 10:12:08 +01:00
Álvaro Velad Galván e85b648ef0 feat!: Remove MSS support (#9329)
Related to https://github.com/shaka-project/shaka-player/issues/9321
2025-11-04 20:06:44 +01:00
Álvaro Velad Galván 7ccb20a641 feat(HLS): Add support for com.apple.hls.chapters (#9195)
Spec:
https://developer.apple.com/documentation/http-live-streaming/providing-javascript-object-notation-json-chapters

Add disableChapters config
Update the UI to show chapters if there is only one language Add support
to download chapters

---------

Co-authored-by: Wojciech Tyczyński <tykus160@gmail.com>
2025-10-14 15:20:51 +02:00
Álvaro Velad Galván f2805853bf test: Add ClearKey storage integration tests (#9174) 2025-10-08 19:04:30 +02:00
Gary Katsevman 729cea8fc4 feat: Change dvvC box to free box for Dolby Vision workarounds (#9101)
This is based on
https://professionalsupport.dolby.com/s/article/Guidelines-to-developers-building-DASH-HLS-player-apps-for-LG-WebOS-Chromecast-and-other-Chromium-based-app-development-platforms?language=en_US
2025-09-17 10:21:12 +02:00
Álvaro Velad Galván 5654aea946 feat: Expose video label in Track and VideoTrack (#8947) 2025-07-31 16:15:47 +02:00
Álvaro Velad Galván 4967e5278a feat: Expose video roles in Track and VideoTrack (#8944)
Related to https://github.com/shaka-project/shaka-player/issues/8943
2025-07-31 14:00:29 +02:00
Wojciech Tyczyński 970d7756ea feat: Add Device API (#8210)
The goal is to simplify and abstract feature logic detection. Currently
lots of places depend on various calls to `shaka.util.Platform` and
mainteinance of this is hard & not easy to read.

By introducing device API ideally rest of the player logic would look
into device features instead of directly checking platform. Additionally
we can more easily cache needed values, so we won't have to parse user
agent several times anymore.

---------

Co-authored-by: Álvaro Velad Galván <ladvan91@hotmail.com>
2025-06-02 13:46:40 +02:00
Álvaro Velad Galván 047ae55637 test: Unify DRM checking in tests (#8504) 2025-04-24 18:29:36 +02:00
Álvaro Velad Galván c2bf105ba2 test: Check recommendation keysystem to check PlayReady support (#8496) 2025-04-22 12:59:09 +02:00
Álvaro Velad Galván 5597c0684c test: Disable flaky test on Chromecast (#8381) 2025-04-02 13:58:34 +02:00
Álvaro Velad Galván 60c6b19d61 fix(Offline): Fix HLS-AES download (#8374) 2025-04-01 15:49:13 +02:00
Álvaro Velad Galván f1ddd1d10b test: Add test for MSS download and playback (#8373) 2025-04-01 15:26:25 +02:00
Álvaro Velad Galván 8f0b0e3282 feat(LCEVC): Detect as supported dual track content with LCEVC (#8134)
This PR does not yet add enhancement layer decoding support.
2025-02-21 13:28:56 +01:00
Álvaro Velad Galván 4936b0c230 feat(DASH): Add dependencyVideo to video streams (#8057)
This will allow us to support dual tracks (main and enhancement layer)
in the future, for example with the LCEVC codec.
2025-02-11 18:20:25 +01:00
Álvaro Velad Galván f778713e13 feat: Create a new simple API for Audio (#8005)
Close https://github.com/shaka-project/shaka-player/issues/3544

---------

Co-authored-by: Wojciech Tyczyński <tykus160@gmail.com>
2025-02-05 12:16:25 +01:00
Álvaro Velad Galván 46f07e72b2 chore: Stop using "Object" in Storage integration annotations (#7941)
Related to https://github.com/shaka-project/shaka-player/issues/1672
2025-01-24 11:56:06 +01:00
Wojciech Tyczyński 6e55a3b21b build: Forbid using dot in generic types (#7904)
Fixes #2643

Happy reviewing!
2025-01-20 09:39:51 +01:00
Álvaro Velad Galván 21bbd93a50 fix(Offline): Allow downloading AES content (#7827)
Also adds integration tests for DASH AES-128, HLS AES-256 and HLS
SAMPLE-AES download and playback
2025-01-07 09:53:51 +01:00
Álvaro Velad Galván bc41643cf3 fix(Offline): Allow storage of MSS streams (#7799)
Co-authored-by: theodab <theodab@google.com>
2024-12-24 14:07:25 +01:00
Álvaro Velad Galván 179ccc61b8 chore: Move DrmEngine and DrmUtils to drm namespace (#7788) 2024-12-20 13:10:29 +01:00
Wojciech Tyczyński 51765e9693 build: Change spellchecking tool and fix spelling mistakes (#7765)
Fixes #7693
2024-12-20 12:27:05 +01:00
Álvaro Velad Galván 2260aa9cf6 feat: Update usage of minBufferTime according to the DASH spec (#7616)
Related to
https://github.com/shaka-project/shaka-player/issues/7602#issuecomment-2479518970

From 23009-1:

The value of the minimum buffer time does not provide any instructions
to the client on how long
to buffer the media. The value however describes how much buffer a
client should have under
ideal network conditions. As such, MBT is not describing the burstiness
or jitter in the network,
it is describing the burstiness or jitter in the content encoding.
Together with the BW value, it is
a property of the content. Using the "leaky bucket" model, it is the
size of the bucket that makes
    BW true, given the way the content is encoded
2024-11-19 10:47:18 +01:00
Joey Parrish d81c9cb369 test: Deduplicate platform support check (#7450)
This deduplicates a platform support check that was run in
player_integration.js, and declares the pre-existing central support map
in an extern so we can clean up its use.

This stops a DRM integration test from timing out on FirefoxWindows. It
still gets skipped, though, due to a failing Widevine check, so there
will be follow-on work for that.

Issue #7449
2024-10-21 09:21:56 +02:00
Álvaro Velad Galván e2413ed5f2 feat(HLS): Make dummy streams for tags representing muxed audio (#7343)
Close https://github.com/shaka-project/shaka-player/issues/5836
2024-09-20 23:58:56 +02:00
Álvaro Velad Galván 013b3c7f22 feat(Offline): Allow store external thumbnails (#7322)
Related to https://github.com/shaka-project/shaka-player/issues/2016
2024-09-17 09:44:53 +02:00
Álvaro Velad Galván a35028c3bc feat: Allow set the videoContainer in the Player constructor (#6953)
Related to
https://github.com/shaka-project/shaka-player/issues/6672#issuecomment-2130166183
2024-07-08 08:59:36 +02:00
Álvaro Velad Galván 0ea31b46e6 feat: Add option to disable continue loading live stream manifest when paused (#6916)
Close https://github.com/shaka-project/shaka-player/issues/3781
2024-06-26 17:17:28 +02:00
Álvaro Velad Galván 6a8dbf7686 test: Consolidate probeSupport in one place (#6667) 2024-05-24 11:00:07 +02:00
Álvaro Velad Galván 329d42ad56 feat: Parse colorGamut and use it in MCap (#6663) 2024-05-24 08:59:06 +02:00
Álvaro Velad Galván 02c5b4388d test: Fix PlayReady test in Chromecast (#6621) 2024-05-17 08:34:48 +02:00
Joey Parrish ddabe93eaf test: Fix Fuchsia background-video errors (#6579)
In some cases, Fuchsia Chromecast tests will fail with the error: "The
play() request was interrupted because video-only background media was
paused to save power."

This resolves the issue by ensuring tests run un-muted on that platform,
based on this Chrome code, which indicates the "paused to save power"
logic does not activate when sound is playing:
https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/media/web_media_player_impl.cc;l=3535;drc=d23075f3

This also fixes two places in our tests where the `createVideoElement()`
was bypassed. This should always be used, because it is a central place
to apply workarounds such as this.
2024-05-10 23:21:37 -07:00
Joey Parrish 91daf87781 test: Skip offline DRM tests on Android (#6573)
The offline DRM tests have begun failing on Android at a rate of 80% or
more. This was eventually determined to be related to
https://crbug.com/1108158 and the timeout workaround in DrmEngine.

When close() hangs and we time out and move on, we leave sessions open
that consume hardware resources at the OEMCrypto level in Android. This
eventually leads to failures like `Failed to execute 'createMediaKeys'
on 'MediaKeySystemAccess': MediaDrmBridge creation failed`. Logs from
`adb logcat` show that 17 sessions are open when this fails, which
likely means our lab device has a limit of 16 open sessions.

Initially, delays between these offline DRM test cases were found to be
an effective workaround, but full test runs showed this to be
ineffective after all.

The only recourse, until Chrome and Widevine fix their bug, is to skip
these tests on Android.
2024-05-10 07:36:39 +02:00
Álvaro Velad Galván c6c39dfafc feat: Add encryptionScheme to shaka.extern.DrmInfo (#6480)
Related to https://github.com/shaka-project/shaka-player/issues/1419
2024-04-26 06:49:15 +02:00
theodab 1da5da9790 fix(DASH): Fix support for multi-mimeType variants (#6348)
A previous PR, #5950, added support for variants that contain multiple
different codecs.
It was supposed to also add support for variants with multiple
mimeTypes, but that part didn't work correctly. This reworks a lot of
#5950 and #6047, to change how they handle such complicated variants.

This has the side-effect of allowing the stream utils to differentiate
between content that has multiple codecs because of type changes, and
content that has multiple codecs because of being muxed video+audio.

Fixes #6010

---------

Co-authored-by: Álvaro Velad Galván <ladvan91@hotmail.com>
2024-04-10 02:48:57 -07:00
Álvaro Velad Galván 42f491f782 feat(DASH): Add support for Content Steering (#5710)
Related to https://github.com/shaka-project/shaka-player/issues/5704
2023-11-09 08:34:09 +01:00
Álvaro Velad Galván c2c8320251 fix(Offline): Fix download of some HLS manifests (#5861) 2023-11-06 20:38:49 +01:00
Álvaro Velad Galván 508e5cfbba feat(DASH): Add initial support for "urn:mpeg:dash:ssr:2023" (#5762) 2023-11-03 14:57:15 +01:00
theodab 4425dca283 chore: Remove state engine (#5752)
The state engine mechanism, designed for the player class, was
over-engineered. The structure of the class makes debugging player
errors unnecessarily annoying, by obfuscating the code-path the error
followed, and in general
has created a significant amount of technical debt.
This changes the player to use an async-await setup for the top-level
operations, laying things out much more cleanly
and linearly.

---------

Co-authored-by: Álvaro Velad Galván <ladvan91@hotmail.com>
2023-10-30 23:59:08 -07:00
Álvaro Velad Galván 81fc82b6b2 feat(HLS): Add support for REQ-VIDEO-LAYOUT (#5809)
Also add preferredVideoLayout config
2023-10-26 09:25:45 +02:00
Álvaro Velad Galván 8b7141f923 fix(DASH): Fix manifest update time for LL-DASH (#5736) 2023-10-11 11:34:15 +02:00
Dave Nicholas 0078137d1b feat: Enable codec switching (#5470)
Closes: https://github.com/shaka-project/shaka-player/issues/1528
Closes: https://github.com/shaka-project/shaka-player/issues/1567
Closes: https://github.com/shaka-project/shaka-player/issues/4379
Closes: https://github.com/shaka-project/shaka-player/issues/5306

---------

Co-authored-by: Álvaro Velad Galván <ladvan91@hotmail.com>
2023-10-04 08:37:14 +02:00
Álvaro Velad Galván 0bbb47025e feat(DASH): Add new config to prevent mixing of audio representations from different adaptation sets (#5620)
Closes https://github.com/shaka-project/shaka-player/issues/5461
2023-09-13 22:38:00 +02:00
Álvaro Velad Galván de19884dd1 fix(HLS): Fix external subtitles out of sync in HLS (#5491)
Fixes https://github.com/shaka-project/shaka-player/issues/5458
Fixes https://github.com/shaka-project/shaka-player/issues/5443
2023-08-21 09:00:07 -07:00
Joey Parrish ffafacfb84 test: Disable power-saving features on both Chrome and Edge (#5508)
Power-saving features on Chrome and Edge were subtly interfering with
playback tests. Timers could be throttled, and both video-only media and
media in occluded windows could be paused by the browser.

This was discovered only after awaiting play() Promises in all tests.
These Promises were being rejected with useful error messages that led
to these discoveries.

Awaiting play() requires us to disable stall detection during playback
tests. This is because on some platforms, stalls get resolved by calling
pause() and then play(), which would cause the original awaited play()
Promise to be rejected.

Finally, some Player tests created additional Player instances that were
unnecessary. Removing those allowed me to centralize most of the
configuration to disable stall detection.
2023-08-18 18:45:05 -07:00
Wojciech Tyczyński f53349fc93 feat: Add originalLanguage to the Track structure (#5409)
Shaka in most of places normalizes tracks' language code to be compliant with ISO 639-1 when possible. However, it does not do that all the time (i.e. normalization is missing in MSS parser) and there is no way to get value that has been explicitly set in a manifest. Moreover, documentation is misleading, as it claims that value is taken directly from a manifest.
Normalization should take place, specifically to easify PeriodCombiner algorithm and also to not break existing applications.
However, original value can be desired for some implementations.
This PR introduces new field to get original language value from the manifest.
2023-07-18 02:09:17 -07:00
theodab 654a0281d9 feat(DASH): Expose accessibility purpose in track (#5216)
Closes #5211
2023-05-08 17:13:06 -07:00
Vincent Valot cc97da167f feat: allow reuse of persistent license sessions (#4461)
Add capability to re-use persistent license sessions across sessions.

DrmEngine will now always:
- try to start stored persistent sessions before trying to fetch a
license, as-to be able to check if all needed keys are already loaded.
- ask for a new license when the persistent session doesn't have the
needed keys for playback,

Given the flag `persistentSessionOnlinePlayback` is true, DrmEngine:
- won't remove the persistent session from the device at the end of the
playback,
- won't throw an error when the persistent session isn't found on the
device,

For now, it needs Shaka's users to persist session information by
themselves (localStorage, IndexDB, ...) before giving it back for the
next session. Still, it lays foundation to develop the feature to fully
handling it on Shaka's side.

Related to #1956
2023-04-19 15:18:34 -07:00
theodab d4d37407c8 fix(offline): Add storage muxer init timeout (#4566)
In some cases, indexedDB.open() can end up calling neither callback.
When this does happen, according to my initial testing, it happens
consistently when reloading the page, so it's not a one-off fluke but
presumably some sort of implementation or browser install problem. If
that does happen, the init promise of the storage muxer hangs forever,
potentially blocking other operations from happening. This adds a
timeout to the invocation of indexedDB.open(), after which the operation
fails with a new error.
2022-10-13 15:35:55 -07:00
Joey Parrish c97768bfe0 test: Fix playback timeouts on ChromeMac (#4520)
Shorten a StreamingEngine integration test to work around an issue with
ChromeMac where playback doesn't always occur at 1x. This is an issue
with Selenium or Chrome itself (unknown) that is out of our control. By
making the test somewhat shorter, we can have it complete on time, even
when this issue is present on a device.

Also increase timeouts on offline playback tests.
2022-09-28 08:19:44 +02:00