v4.0.0-rc.2
Pre-releaseRelease v4.0.0-rc.2 (2024-02-07)
Quick Links:
π API documentation
-
β― Demo
-
π Migration guide from v3
- π Overview
- π Changelog
DASH_WASM
andMULTI_THREAD
fix-
attachWorker
now returns a Promise - Project repository updates
Overview
This new release candidate mainly fixes issues we've seen with the WebAssembly parser for DASH MPD, that is used for both the DASH_WASM
feature (which lost its "experimental" label at v4.0.0-rc.1
) and the MULTI_THREAD
experimental feature.
Another minor fix is on the handling of the <UTCTiming>
element in a DASH MPD. If it pointed to an URL and if the resource behind it could not be fetched when first loading the MPD due to issues with the request(s) (there may be several attempts), then the RxPlayer would keep re-loading the resource each time the MPD was refreshed, instead of just stopping doing it once it loaded successfully once - which is what the RxPlayer does now.
None of these issues are regressions, and thus some also concern the v3.33.0 (the DASH_WASM
and <UTCTiming>
ones). As those all are very minor issues (DASH_WASM
being still experimental in v3.33.0
- with an error triggering a fallback on the JS-based parser anyway - and the <UTCTiming>
issue being rare and not preventing smooth playback) they will only be released as a future v3.33.1
release once the 4.0.0
is released.
Changelog
Features
- MULTI_THREAD:
attachWorker
now returns a Promise to indicate when WebWorker attachment failed [#1374]
Bug fixes
- dash: Don't unnecessarily reload external
<UTCTiming>
resources at each refresh if it failed for the first request of the Manifest [#1370] - dash: The
DASH_WASM
feature do not rely on WebAssembly's sign-extension operators anymore as that is poorly supported on older Samsung and LG TVs [#1372] - MULTI_THREAD: properly categorize forced subtitles in multithread scenarios
Other improvements
- build: automatically install Rust and WASM toolchain locally if unavailable when building the RxPlayer [#1373]
- doc: Update our documentation generator and fix all invalid anchors in it
- npm: prevent the publishing of unnecessary files on the npm registry [#1377, #1378]
DASH_WASM
and MULTI_THREAD
fix
After testing the MULTI_THREAD
feature on a large array of smart TVs, we noticed that some old Samsung and LG TVs had issues instantiating our WebAssembly MPD parser (on which both the MULTI_THREAD
and DASH_WASM
features rely).
It turned out that those TVs had support for WebAssembly (if they did not, the RxPlayer would automatically have disabled "multithread" mode), yet to a very old version of it which did not have some of its early features present in the WebAssembly file produced by the Rust compiler (the compiler we're using) by default.
This was not known to us as we always assumed that the compiler targeted by default the earliest available version of WebAssembly.
We ended up doing supplementary transformations on our WebAssembly file to remove the reliance on those newer features. The new mpd-parser.wasm
file delivered with this version (as well as exported through "rx-player/experimental/features/embeds"
) should now be compatible with those devices.
attachWorker
now returns a Promise
The aforementioned DASH_WASM
and MULTI_THREAD
issue put a light into some scenarios we were not enough prepared for: how to handle cases where the WebWorker and/or WebAssembly module relied on when using the MULTI_THREAD
feature fail to initialize.
This should hopefully be very rare now, yet may still happen if e.g. any of those resources are behind an URL that is not accessible or if browser security settings prevents the RxPlayer from creating or relying on a WebWorker.
To better handle those cases for now, we decided that the attachWorker
method now returns a Promise. That promise will either resolve if the Worker was initialized with success and reject if it did not.
Like before, you may still call loadVideo
synchronously after the attachWorker
call has been made (you don't have to await this Promise) but it is now advised to await that Promise in scenarios where you're both relying on the MULTI_THREAD
feature and on one of the corresponding monothreaded feature (either DASH
or DASH_WASM
) - in which case it is the role of the RxPlayer to choose between one or the other.
For example: the following code:
import RxPlayer from "rx-player/minimal";
import { DASH } from "rx-player/features";
import { MULTI_THREAD } from "rx-player/experimental/features";
import {
EMBEDDED_WORKER,
EMBEDDED_DASH_WASM,
} from "rx-player/experimental/features/embeds";
RxPlayer.addFeatures([
// Will allow to play DASH contents in main thread
DASH,
// Will allow to play DASH contents in multithread scenarios
MULTI_THREAD,
]);
const player = new RxPlayer(/* your usual RxPlayer options */);
try {
await player.attachWorker({
workerUrl: EMBEDDED_WORKER,
dashWasmUrl: EMBEDDED_DASH_WASM,
})
console.log("Worker succesfully attached!");
} catch (err) {
console.warn("An error arised while initializing the Worker", err);
}
player.loadVideo({ /* your usual loadVideo options */ });
Will only load the content in "multithread" mode if all of the following are true:
- Your browser supports the feature (which is already checked synchronously when
attachWorker
is called) - Your content is compatible with multithread mode
- The Worker initialization went without issue (this is the case where awaiting
attachWorker
has an effect)
And in other cases, it will load in monothreaded mode, as the DASH
feature is also added.
If you do not await attachWorker
before calling loadVideo
here and the Worker initialization fails, the RxPlayer might have already begun to load the content in "multithread" mode. In that case it might fail to do so and trigger an error for that content (we're also currently exploring ways of making the RxPlayer automatically reload in monothreaded mode in this exact last scenario but it isn't done for now).
Also note that if Worker initialization fails, the RxPlayer won't try to rely on it anymore for the next loadVideo
and reload
calls. If you want to retry Worker initialization in that unlikely scenario, you could call attachWorker
again.
Project repository updates
As we're now very confident of the stability of the v4 pre-releases, we began making changes to the RxPlayer repository:
-
The default branch seen on GitHub and choosen as a default target branch for Pull Requests is now
dev
, which corresponds to the latest merged developments on the v4. Note that it is currently further than thev4.0.0-rc.2
as we're already merging improvements for future v4 releases.Another branch,
stable
corresponds to the last released v4 version (so herev4.0.0-rc.2
) plus optional hotfixes.dev
is based onstable
.The old
master
branch keeps refering to the v3 but has been renamed tolegacy-v3
.next
does not exist anymore, any new developments for the v3 now targetslegacy-v3
. -
The default demo page exposed both by the GitHub link and in our
README.md
file now leads to thev4.0.0-rc.2
demo.The last
v3.33.0
demo page can still be accessed here and the list of demo pages per version can be found here. -
Likewise, the default documentation pages exposed in our
README.md
file now leads to thev4.0.0-rc.2
documentation.The last
v3.33.0
documentation page can still be accessed here and the list of documentation pages per version can be found here. -
We filtered files that were actually published on npm when we published a new version. For example, you now shouldn't be pulling the RxPlayer source files anymore when doing so.