- Add a
maxVideoBufferSize
constructor option and{get,set}MaxVideoBufferSize
methods to limit the size of loaded video data buffered at the same time [#1041, #1054] - DRM: Add a
"periods"
mode to thekeySystems[].singleLicensePer
loadVideo
option, allowing to obtain decryption license for groups of Periods allowing a compromise between optimization, features and compatibility [#1028, #1061] - Add a
"reload"
audioTrackSwitchingMode
to work-around rare compatibility issues when switching audio tracks [#1089]
- subtitles: Fix rare issue where subtitles could be skipped due to a rounding error [#1064]
- DASH: fix issue where the wrong segments would be requested on
$Number$ -based MPD with a SegmentTimeline older than thetimeShiftBufferDepth
[#1052, #1060] - directfile: disable all audio tracks before enabling one to work-around Safari issue on MacOS Monterey [#1067]
- avoid performing a small seek when changing the audio track [#1080]
- api: allow switching to RELOADING state synchronously after LOADED [#1083]
- Safari Mobile: Improve decryption support on Safari mobile by relying on the vendored
WebKitMediaKeys
API [#1072] - DASH: Fix issue which prevented the integrity check of most MP4 DASH segments when
transportOptions.checkMediaSegmentIntegrity
was set totrue
- avoid unnecessary warning logs when loading some initialization segments [#1049]
- TypeScript: Add forgotten TypeScript types in the exposed segment and manifest loader APIs [#1057]
- DRM: Avoid decryption issues when a license is persisted in a
singleLicensePer
"init-data"
mode but loaded in a"content"
mode [#1031, #1042] - DRM: Totally avoid the theoretical possibility of leaking MediaKeySessions when a
generateRequest
orload
call takes multiple seconds [#1093]
- DASH: always consider that the non-last Period is finished when it contains SegmentTimeline elements [#1047]
- add better buffer cleaning logic on a browser's
QuotaExceededError
to better handle memory limitations [#1065] - DASH: Prioritize selectionPriority attribute over a "main" Role when ordering AdaptationSets [#1082]
- directfile/Safari: use the
getStartDate
method ingetWallClockTime
,seekTo
and thepositionUpdate
event when available to obtain true offseted "wall-clock" times when playing HLS contents on Safari [#1055] - DRM: Improve DRM Session caches performance when
singleLicensePer
is set to"content"
- DRM: Stop retrying closing MediaKeySessions multiple times when it fails, instead doing it only once when it should work [#1093]
- TypeScript: Add IBitrateEstimate, IPositionUpdate and IPlayerState types to the exported types [#1084]
- Remove dependency on pinkie's promise ponyfill [#1058, #1090]
- tests: add performance tests, to better catch and avoid performance regressions [#1053, #1062]
- DRM: Refactor DRM logic for better maintainability. DRM-linked logs are now prefixed by
DRM:
instead ofEME:
like previously [#1042]
- API: re-switch to SEEKING state instead of BUFFERING when seeking to already-buffered data [#1015]
- DASH: provide default startNumber attribute for number-based SegmentTemplate indexes with a SegmentTimeline [#1009]
- TTML (subtitles): interpret percentages as relative to the computed cell size and not as the percentage of the inherited font size in the page [#1013]
- subtitles: Work-around recent Chrome issue where the content of a native
<track>
element would still be visible despite being removed from the DOM (issue only reproducible in the"native"
textTrackMode
) [#1039] - API: Fix rare issue happening when switching rapidly between Representations, which led to multiple APIs such as
getAvailableVideoBitrate
orgetAvailableAudioTracks
returning either incorrect or empty results [#1018] - Improve prevention of rare segment-loading loops by fixing an issue with the clean-up of the short-term buffer history we maintain [#1045]
- DASH-LL: Improve adaptive bitrate logic on low-latency contents by implementing a specific algorithm for those [#1025, #1036]
- DASH-LL: Improve handling of
$Time$ -based DASH-LL contents [#1020] - DASH: Support UTCTiming element with the
urn:mpeg:dash:utc:http-xsdate:2014
scheme [#1021] - DOC: Important refactoring of the RxPlayer API documentation to improve readability, discoverability and to add search capability to it [#1016]
- DASH: handle ContentProtection elements that have been defined at the Representation-level (and not at the AdaptationSet-level, as defined by the DASH-IF IOP) [#1027]
- DASH: Be resilient when the resource behind an UTCTiming element leads to an error (usually due to an HTTP-related issue) - instead of failing with an error like now [#1026]
- Better estimate the duration of ISOBMFF segments with multiple moof boxes [#1037]
- EME: Add hex-encoded key id to the
KEY_STATUS_CHANGE_ERROR
error message so we can know which key we're talking about when debugging [#1033] - dev/scripts: for the "modular" (a.k.a. minimal) RxPlayer build now rely on TypeScript's const enums, instead of uglily using sed, to replace compile-time constants. [#1014]
- dev/scripts: remove reliance on environment variables when running the RxPlayer build scripts [#1004]
- dev/scripts: add esbuild devdependency and add "s" script to allow faster checks for RxPlayer developpers [#1003]
- CI: Rely on Github actions instead of Travis for most CI-related matters [#1046]
- code/refacto: replace central
Clock
concept (Observable bringing media-related updates to the RxPlayer at a regular pace) by a more flexiblePlaybackObserver
class [#1002]
- ttml: Do not throw if a TTML subtitles file doesn't contain any
<body>
tag, just ignore it [#993] - Auto-detect when playback is unexplicably frozen and try to unlock it through a small seek [#982]
- Properly send
available{Audio,Video}BitratesChange
event for multi-Period contents [#983] - DASH/MetaPlaylist/Local: fix rare infinite rebuffering issue which could happen when changing or disabling the track of a future Period [#1000]
- compat: Prevent rare segment-loading loops by automatically detecting when segments are garbage collected by the browser immediately after being pushed [#987, #990]
- compat/DRM: In some Safari versions, communicating a license as a JS
ArrayBuffer
could throw, this is now fixed [#974] - DASH_WASM: Don't stop with a fatal error if an expected ISO8601 duration value is empty in the MPD
- DASH_WASM: Parse
<Event>
elements which contain an XML namespace defined outside that element [#981] - DASH_WASM: Drastically reduce wasm compilation time and file size [#980]
- Request initialization segment and the first media segments at the same time when possible, potentially reducing loading times [#973]
- Remove cached segment request detection in the adaptive logic, as it is sensible to false positives, leading to a poor bitrate in some short contents [#977]
- Export more needed types through the
rx-player/types
path [#972, #976] - demo: Expose some player options in the demo page [#999]
- dev: Rewrite build logic from bash to node.js to improve its maintainability
- dev: Replace internal
info
script by more helpful and interactivelist
script [#991] - dev/code: Forbid the usage of TypeScript's type
any
in most of the RxPlayer's code - performing runtime type-checking in some cases (in DEV mode only) [#994] - dev/code: Remove RxJS from the transports code [#962]
- Add HDR information through the
hdrInfo
property on video Representation/tracks as returned by APIs such asgetVideoTrack
,getAvailableVideoTracks
, thevideoTrackChange
event,getManifest
,getCurrentAdaptations
andgetCurrentRepresentations
[#946] - Add the
DASH_WASM
experimental feature, allowing faster MPD parsing using WebAssembly [#937] - Add the experimental
VideoThumbnailLoader
tool, which uses "trickmodes" DASH AdaptationSet to generate thumbnails [#647] - Add
preferTrickModeTracks
option tosetPlaybackRate
, to switch on or off trickmode tracks when available on the Manifest [#940] - Add
areTrickModeTracksEnabled
method to indicate whether the RxPlayer is using trickmode tracks in priority [#940] - Add
trickModeTracks
andisTrickModeTrack
properties to video tracks as returned by thegetVideoTrack
andgetAvailableVideoTracks
method and by thevideoTrackChange
event [#940] - Add
maxSessionCacheSize
keySystems
option, to configure the maximum number of decryption sessions that can be kept alive at the same time in a cache [#938] - The
manifestLoader
callback defined intransportOptions
can now ask for a request to be retried [#964] initialManifest
now accepts the Manifest as anArrayBuffer
[#937]- The
manifestLoader
callback defined intransportOptions
can now send the Manifest as anArrayBuffer
[#937]
- DASH: don't ignore new EventStream elements that weren't in the previous MPD update for a given Period [#956]
- DASH: fix fatal error linked to the
duration
of theMediaSource
happening when playing a multi-Period live DASH content whose previous (before updating) last Period's segments had been fully generated and fully pushed. [#952] - DASH: Avoid loading plain-text subtitles in a loop when playing before the first cue starts or after the last cue ends [#945, #948]
- DASH: Avoid loading plain-text subtitles in a loop when the
transportOptions.checkMediaSegmentIntegrity
is set totrue
[#947] - DASH: avoid ending a dynamic stream if new Periods may be added later to the MPD [#959]
- DASH: avoid unnecessarily refresh a MPD based on SegmentList elements when they don't perfectly align with the pushed data [#963]
- Improve
audioTrackSwitchingMode
"direct"
mode by avoiding unnecessary reloading cases [#872, #887, #943] - When seeking after the end of an ended content, actually seek just a little before to avoid subtle issues [#941]
- DASH: limit the postponment of a Manifest refresh due to poor MPD-parsing performance to 6-times the "regular" delay (not impacted by
tansportOptions.minimumManifestUpdateInterval
) [#958] - DASH: Avoid loading two times a segment instead of once when that segment is not anounced in the MPD through a SegmentBase, SegmentList nor SegmentTemplate element but just through the Representation's BaseURL. [#949]
- Update used RxJS version to 7.0.0, which might bring with it a smaller size and better performances [#954]
- demo: remove Chart.js dependency (we found that its new API documentation and errors were too impenetrable) and replace the "Buffer Size" chart by a homemade one. [#955, #957]
- Add
inbandEvent
event for when an event is encountered in a media segment [#892] - DRM: Add
singleLicensePer
keySystems
option to be able to signal in advance that the current content has a single license, even if it has multiple encryption keys [#863, #904] - DRM: Add
keySystems[].licenseStorage.disableRetroCompatibility
boolean to unlock optimizations when compatibility with EME sessions persisted in older RxPlayer versions is not important [#919]
- DASH: Fix rounding error that could cause infinite buffering issues when going from a DASH Period to the next [#897, #899]
- DRM: Always pass on server certificate before any challenge is generated. Contents with multiple licenses previously could lead to the latter being done before the former. [#895]
- DRM: Fix possible leaks of MediaKeySessions if closed at the wrong time [#920]
- Fix issue making sudden and acute fall in bandwidth not being considered soon enough [#906]
- On some devices when
maxBufferAhead
is set, avoid removing the initially loaded data if done before the initial seek could be performed [#907] - Avoid cases of infinite rebuffering on Tizen 4 by avoiding pushing segments "on top of others" too close to the current position [#925]
- Avoid seeking issues on Tizen by not seeking over discontinuities that will be already handled by the browser [#922]
- Fix initial seek on Tizen (Samsung TVs) on live contents by setting a much lower duration (to work-around a Tizen overflow) [#914]
- DASH: Consider multiple defined
<Accessibility>
tags for a single AdaptationSet [#903] - Fix error that could be thrown on Safari when calling the
getStatusForHDCP
method from the experimentalMediaCapabilitiesProber
tool [#927]
- Avoid to push on top of the current position if there's already a segment there as it can provoke minor decoding issues on some devices [#925]
- Update video element's duration if the content duration changes [#917]
- DASH: Improve loading time with encrypted contents by only using the encrypted initialization data found in the Manifest when found in it [#911, #919]
- Record redirections made on a
manifestUpdateUrl
to request directly the right URL on next update. [#929] - Improve loading time when a
serverCertificate
is given by calling thesetServerCertificate
API earlier [#895] - Improve loading time when switching contents by fetching the Manifest at the same time the previous content is cleaned-up [#894]
- Improve loading time on some CPU-constrained devices by not running unnecessary playback checks on the "progress" HTMLMediaElement event anymore [#893]
- DASH: Consider DASH audio AdaptationSet with a "urn:mpeg:dash:role:2011" schemeIdUri and a "description" role as
audioDescription
tracks [#903] - Warn through the logger when the autoplay attribute is enabled on the media element but not on RxPlayer [#924]
- Avoid switching to a SEEKING state if the seek operation was performed inside the RxPlayer's code [#872, #887]
- DRM: Wait up to 100 milliseconds after a persistent MediaKeySession has been loaded to wait for possibly late
keyStatuses
updates [#928] - DRM: Only store persistent MediaKeySession once at least one key is known [#926]
- DRM: Reconsider Representations that have been fallbacked from if they become decipherable [#905]
- DRM: Lower the maximum size of the MediaKeySession cache from 50 to 15 to improve compatibility, even more now that license with multiple keys are properly handled
- Doc: Move architecture documentation closer to the code it documents [#764, #900]
- Doc: add "Quick links" to the top of the API documentation [#909]
- Fix support of encrypted contents on Safari (v3.23.0 regression)
- Add the
reload
method to be able to re-load the last loaded content as fast as possible (e.g. after fatal errors) [#859, #867] - Add
onCodecSwitch
loadVideo option, to select a strategy when a new incompatible codec is encountered [#856] - Emit
DISCONTINUITY_ENCOUNTERED
warnings when a discontinuity has been seeked over [#862] - Add minAudioBitrate and minVideoBitrate constructor options and the {set,get}Minimum{Audio,Video}Bitrate methods to define the minimum quality reachable through adaptive streaming [#876]
- Fix impossibility to fallback to another Representation (with the
keySystems[].fallbackOn
loadVideo
options) when a decryption key has been found to be non-usable [#889] - Fix DRM-related events being sent twice in a row instead of just once [#850]
- Stop and throw
MANIFEST_PARSE_ERROR
error again when either audio or video has only unsupported codecs (instead of just playing the other type) [#864] - Avoid re-downloading a segment that ends a lot before its expected end [#846]
- In "native"
textTrackMode
, avoid requesting text segments in a loop [#878] - Disable effects of
throttleVideoBitrateWhenHidden
,limitVideoWidth
andthrottleVideoBitrate
player options on Firefox >= 67 due to how Picture in Picture mode is currently handled in them [#874] - Work-around race condition in old Chromium versions where loading a persistent MediaKeySession led to no key statuses right away [#847]
- Skip over most audio or video discontinuities in the stream, even those not announced in the Manifest [#862]
- When track or bitrate switching lead to a reload, seek back a consistent number of milliseconds to give back context [#848]
- Don't call
setServerCertificate
API whenkeySystems[].serverCertificate
option is set tonull
[#849] - On the rare platforms where an undefined initialization data type can be received on encrypted events, retry
generateRequest
with a default "cenc" value if the first one fails due to it being empty [#870] - Re-add debug logs logging the principal media properties at each clock tick [#844]
- Use TextEncoder and TextDecoder interfaces when available to speed-up string conversions [#843, #875]
- Throw a better error when no EME API is found
- Reduce default bundles size by switching to webpack 5 to generate them
- tests: Add conformance tests on the initial seek to help debugging related issues on new platforms [#873]
- lint/code: Use eslint code linter even for the TypeScript code [#842]
- Add
audioTrackSwitchingMode
loadVideo
option to allow different strategies when switching between audio tracks [#801, #806] - Add
enableFastSwitching
loadVideo
option to enable or disable optimizations doing segment replacement in the browser's buffer [#779, #780] - Add
initialManifest
loadVideo
option to provide the Manifest to the RxPlayer when it has already been loaded [#807] - tools: Add
StringUtils
utilitary functions to tools to convert bytes to strings and the other way around [#809] - tools: The
TextTrackRenderer
tool is not experimental anymore: it now has a stable API [#810] - experimental/local-manifest: The RxPlayer now (only) plays the new
"0.2"
format version of the "LocalManifest" (in the experimental"local"
transport) [#810]
- directfile: Fix impossibility to play an encrypted content in directfile mode (regression brought in v3.21.1) [#827, #830]
- subtitles: Display multiple cues with overlapping times [#829]
- smooth: Fix minimum position in a Smooth live content when fewer segments than the dvr window length are available [#826]
- dash/metaplaylist: Fix possible playback issues on multi-Period contents, where segments from multiple Periods overlap [#837]
- Fix very rare race condition which triggered a "setting priority of null" error after synchronous segment requests were done [#817]
- local-manifest: LocalManifest that transition from not finished to finished while playing now end properly [#818]
- local-manifest: Fix and clarify the duration and maximum position reported for a playing LocalManifest [#818]
- compatibility/drm: On some webkit-based browsers, do not require the use of a server certificate for DRM if the key system used is not FairPlay [#833]
- drm: Properly update to a different server certificate on the MediaKeys or remove it if needed [#835]
- drm: throw MEDIA_IS_ENCRYPTED_ERROR again when playing an encrypted event without either the
EME
feature, EME APIs or akeySystems
option [#841]
- subtitles/ttml: Apply default position to TTML subtitles in
"html"
textTrackMode
when no style is found [#815] - subtitles/ttml: Set default text color to white to TTML subtitles in
"html"
textTrackMode [#832] - drm: Avoid re-setting a server certificate we know has already been pushed to improve loading performance [#824, #835]
- dash: Always prefer a "main" AdaptationSet when hesitating between multiple ones [#828]
- dash: Improve minimum position precision for dynamic DASH contents when less segments are available than what would be guessed from the timeShiftBufferDepth [#826]
- drm/logs: Better log why a MediaKeySession is not considered as "usable" [#822]
- drm/logs: Be more verbose with DRM-related logs, even at lower logger levels [#821]
- tests/conformance: Add "conformance tests", to quickly test the capabilities of new devices and targets [#814]
- code: avoid circular dependency in
src/features
in original typescript source files [#805] - demo: Fix default position for the video track select element in the demo to always be at the currently selected video track [#813]
- demo/code: Better integrate the RxPlayer to the demo: through a simple import, instead of adding a script tag for the bundled version [#811]
- dev: Remove all enforced git-hooks (on pre-commit and pre-push) [#808]
- compatibility/drm: make switching the current
MediaKeys
work on most platforms by re-ordering browser API calls [#766, #744] - compatibility/drm: in Edge and IE11, fix behavior which could lead to not fallbacking from a non-decryptable quality due to a badly parsed key ID [#790]
- dash: when a Representation depends on multiple SegmentTemplate at the same time, merge all corresponding information instead of just relying on the last one [#767, #768]
- smooth: skip discontinuity when seeking in the middle of one when playing a smooth content [#792]
- api: fix
getUrl
and the minimum position calculation after playing for some time a live content with a setmanifestUpdateUrl
[#775, #776] - drm/subtitles: better handle UTF-8 and UTF-16 characters in an encrypted initialization data or in subtitles [#791]
- requests: still retry all the other segment's URLs when a non-retryable error happen on the request for one of them [#798]
- dash: fix infinite rebuffering when playing multi-Period DASH contents for some time with a
manifestUpdateUrl
set [#797]
- improve seek latency in some rare cases where we could profit from cancelling a request for a needed segment [#752, #769]
- requests: only download an initialization segment when media segments for that Representation are needed [#773]
- requests: avoid unnecessary segment requests when segments loaded don't exactly align with what is expected if contiguous segments exist [#772, #771]
- better time quality switches to avoid having to re-download segments in the new quality [#781, #782, #783]
- adaptive: limit bandwidth oscillations when the buffer level is low by choosing a lower bitrate by default and limiting fall in bandwidth when in "starvation mode" [#796]
- compatibility/drm: filter out badly-formed CENC PSSH when found, if some well-formed exist [#788]
- isobmff: support rare but possible occurence where an ISOBMFF box size is stored on 8 bytes [#784]
- logs: when logs are set to
"DEBUG"
, now regularly print visual representations of which segments live currently in the buffer(s) [#795] - demo: change separator in the demo's generated links from "" to "!" to not change its form when percent-encoded [#758, #759]
- project: better document changes in changelog and release notes, mostly by linking to related issues and PRs
- code: rename "Buffer" module to "Stream" in the code, documentation and logs to better reflect what that code does [#793]
- tests: add "global" unit tests for a more a module-oriented testing strategy (when compared to our existing function-oriented unit tests) to our EME (DRM) related code [#753]
- api/events: add
"streamEvent"
event for when a DASH EventStream's event is reached - api/events: add
"streamEventSkip"
event for when a DASH EventStream's event is "skipped" - types/events: add
IStreamEvent
andIStreamEventData
- which define the payload emitted by both a"streamEvent"
and"streamEventSkip"
events to the exported types - api/tracks: add second argument to
setPreferredAudioTracks
,setPreferredTextTracks
andsetPreferredVideoTracks
to be able to also apply them to the currently loaded Periods / content - text/webvtt: parse settings attributes of WebVTT subtitles when in HTML mode
- api/tracks: add codec information to
getAvailableAudioTracks
andgetAudioTrack
- dash: do not reduce the minimum position when using the
manifestUpdateUrl
transportOptions
inloadVideo
- local-manifest: consider
language
property from a "local" Manifest - local-manifest: refresh the Manifest even if we dont have a Manifest URL, as is often the case when playing locally-stored contents
- local-manifest: allow the "expired" property of a local-manifest to be updated
- compat/eme/fairplay: for fairplay contents, better format the initialization data given to the CDM. The previous behavior could lead to invalid license requests
- eme: re-allow serialization into a JSON string of the persisted session data, as presented in the DRM tutorial
- compat/low-latency: fix compilation of async/await when playing low-latency contents with the default bundled builds
- eme: ensure that the previous MediaKeySystemAccess used had
persistentState
to "required" when a new content needs it to be - eme: fix
closeSessionsOnStop
keySystems
option actually not removing any MediaKeySession when stopping a content (v3.20.1 regression).
- dash: emit minor errors arising when parsing the DASH MPD through warning events (whose payload will be an error with the
PIPELINE_PARSE_ERROR
code) - dash: consider AdaptationSet@selectionPriority in our initial track choice if the user preferences lead to multiple compatible tracks
- misc: do not download video segments when playing on an "audio" element.
- eme: replace the MediaKeySession's cache entry based on the least recently used instead of on the least recently created to improve cache effectiveness.
- eme/persistent sessions: Limit the maximum of stored persistent MediaKeySessions to 1000 to avoid the storage to grow indefinitely (higher than that, the least-recently used will be evicted)
- eme: fix
OTHER_ERROR
issue arising when loading a new encrypted media when a previous since-disposed instance of the RxPlayer played encrypted contents on the same media element - eme: fix
OTHER_ERROR
issue arising on Internet Explorer 11 when playing more than one encrypted content - eme: fix issue where more than 50 active MediaKeySessions at the same time could lead to infinite rebuffering when playing back a previous content with multiple encryption keys
- directfile: for directfile contents, don't reset to the preferred audio, text or video track when the track list changes
- eme: remove any possibility of collision in the storage of EME initialization data. The previous behavior could theorically lead some initialization data to be ignored.
- eme: fix typo which conflated an EME "internal-error" key status and an "output-restricted" one.
- api: add
disableVideoTrack
method - api: add the
preferredVideoTrack
constructor option andsetPreferredVideoTracks
/getPreferredVideoTracks
methods to set a video track preference (or to start with the video track disabled). - api: add optional
codec
property to preferred audio tracks APIs, allowing applications to communicate a codec preference. - api: make the
language
andaudioDescription
properties inpreferredAudioTracks
' objects optional. - api: add
signInterpreted
togetVideoTrack
andgetAvailableVideoTracks
return objects to know when a track contains sign language interpretation
- api: deprecate the
getManifest()
method - api: deprecate the
getCurrentAdaptations()
method - api: deprecate the
getCurrentRepresentations()
method
- compat/eme: Set proper EME Safari implementation, to play contents with DRM on it without issues
- compat/directfile/iOS: On Safari iOS, fix auto-play warnings when a directfile content is played with the
playsinline
attribute set. - directfile: In Directfile mode, always disable the current text track when a
null
is encountered in the preferredTextTracks array
- abr: ignore requests that may have directly hit the cache in our adaptive logic
- dash/perf: improve parsing efficiency for very large MPDs, at the expense of a very small risk of de-synchronization. Mechanisms still allow for regular re-synchronization.
- dash: handle multiple URL per segment announced through multiple BaseURL elements in the MPD
- dash/smooth/metaplaylist: add
manifestUpdateUrl
to loadVideo'stransportOptions
to provide a shorter version of the Manifest, used for more resource-efficient Manifest updates - tools/createMetaplaylist: add the experimental
createMetaplaylist
tool, which allows to generate Metaplaylist contents from given Manifests - tools/TextTrackRenderer: add the optional
language
property to thesetTextTrack
method of the experimentalTextTrackRenderer
tool as it could be needed when parsing SAMI subtitles - types: export IAvailableAudioTrack, IAvailableTextTrack and IAvailableVideoTrack types
- types: export IAudioTrack, ITextTrack and IVideoTrack types
- dash/smooth: fix segment url resolution when there is query parameters in the Manifest URL and/or segment path, themselves containing "/" characters
- local-manifest: fix videoElement's duration and
getVideoDuration
for contents in the experimentallocal
transport - tools/parseBifThumbnails: do not return an un-displayable ArrayBuffer of the whole thing in each
image
property in the experimentalparseBifThumbnails
function
- compat: avoid pushing a segment on top of the current position in Safari, as it can sometime lead to green macro-blocks
- dash: add multiple performance improvements related to MPD parsing on embedded devices
- dash/smooth/metaplaylist/local: refresh less often the Manifest when parsing it takes too much time to improve performance
- smooth: filter unsupported video and audio QualityLevels when parsing a Smooth Manifest
- build: greatly reduce the time needed to produce a modular build through the
npm run build:modular
script - build: remove Object.assign dependency
- directfile: support most audio tracks API when playing a directfile content
- directfile: support most text tracks API when playing a directfile content
- directfile: support most video tracks API when playing a directfile content
- api: add
seeking
andseeked
events which announce the beginning and end of a seek, even when seeking to an already buffered part - subtitles/ttml: handle styles inheriting other styles in TTML subtitles
- local-manifest: add experimental
local
transport to allow the playback of downloaded contents (even when offline) - tools: add the experimental
TextTrackRenderer
tool to be able to add a custom text track to any content - tools: add the experimental
parseBifThumbnails
tool to easily parse thumbnails in the BIF format
- api: deprecate the
supplementaryTextTracks
loadVideo option in profit of the external TextTrackRenderer tool - api: aeprecate the
supplementaryImageTracks
loadVideo option in profit of the external parseBifThumbnails tool - api: deprecate the
getImageTrackData
method in profit of the externalparseBifThumbnails
tool - api: deprecate the
imageTrackUpdate
event in profit of the externalparseBifThumbnails
tool - api: deprecate
hideNativeSubtitles
(officially)
- subtitles/ttml: Correctly handle alpha information in the rgba values included in a TTML file
- images/bif: fix sometimes incorrect "ts" value on thumbnails returned by the
getImageTrackData
method and theimageTrackUpdate
event
- node: allow the RxPlayer to be imported from Node.js for server-side-rendering
- images/bif: throw a better error when an invalid BIF file is received
- api: be more "generous" with player events by ditching the deep-equal npm module due to package size and some edge-case behavior
- demo: avoid re-rendering multiple ui components when unnecessary
- dash/metaplaylist: fix infinite rebuffering issue when refreshing multi-Period contents under specific conditions
- buffer: be less aggressive when garbage collecting subtitles (if the maxBufferAhead/maxBufferBehind options are set) to avoid useful subtitles being removed
- directfile/compat: for directfile contents, trigger directly the LOADED state on iOS/iPad/iPod browsers as those are not preloaded there
- demo: display clickable "play" button on the video element when autoplay is blocked due to browser policies - to help users unlock the situation
- demo: add "Other" key system to allow specifying a custom key system in the demo page
- eme/api: add keySystems.fallbackOn property to
loadVideo
to allow fallbacking to other qualities when encountering various key errors - eme/api: allow to set
fallbackOnLastTry
on agetLicense
Error to be able to fallback on other qualities when a license request is on error - eme/api: add
NO_PLAYABLE_REPRESENTATION
MediaError
for when every video or audio quality cannot be played - manifest/api: add
decipherable
property to a Representation object - api: add
decipherabilityUpdate
event triggered when a Representation's decipherability status is updated - languages/api: add
dub
boolean to audio tracks (throughgetAudioTrack
andgetAvailableAudioTracks
) to tell if this is a dubbed track - languages/ttml: with TTML subtitles, support length relative to the Computed Cell Size for
tts:fontSize
,tts:padding
,tts:extent
,tts:origin
andtts:lineHeight
- transports/api: add
checkMediaSegmentIntegrity
transportOptions
to automatically retry media segments which appear corrupted - transports/api: add
minimumManifestUpdateInterval
transportOptions
to limit the Manifest update frequency - transports/api: add "progress" callback to a custom segmentLoader to improve adaptive streaming when an external segment loader is used
- dash/metaplaylist: download the first segment of a new Period when the last downloaded segment from the previous Period ends after that segment ends
- smooth/metaplaylist: consider
serverSyncInfos
transportOptions
for Smooth and MetaPlaylist contents - buffers: completely clean a previous audio/text track from the SourceBuffer when switching to a different audio/text track
- dash: avoid requesting an inexistent segment when downloading a multi-Period DASH content with a number-based SegmentTemplate with the
agressiveMode
option set totrue
- eme: do not wait for a previous invalid MediaKeySession to be closed before re-creating a valid one for the same content, to work around a widevine issue
- eme: avoid race condition issue arising when multiple init data are received before the MediaKeys have been attached to the media element
- dash: do not consider "trickmodes" AdaptationSet as directly playable video tracks
- directfile: begin directly at the end (instead of the beginning) when setting a
startAt
loadVideo option with afromLastPosition
property set to0
on directfile contents - metaplaylist: fix playback for non-live MetaPlaylist contents not starting at a
0
time
- abr: better estimate a lower bitrate after a sudden fall in bandwidth
- dash/low-latency: properly use @availabilityTimeOffset when playing a low-latency DASH content
- code: use only strict boolean expressions in the code (do not rely on falsy or truthy values anymore).
- demo: add buffer content graphs to the demo page to vizualize exactly what have been buffered
- demo: improve accessibility of the demo page for the english-speaking visually impaired
- misc: replace uglifyJS by terser for minification purposes
- dash: update timeshiftBufferDepth considered when refreshing the MPD
- dash: fix infinite rebuffering issue when refreshing a Multi-Period MPD with the oldest Periods removed
- api: go to
"SEEKING"
state instead of"BUFFERING"
when seeking while the player is in the "BUFFERING" state - api: Avoid reinitializing the video, audio and text track choice after a
"RELOADING"
state - api: When going back to a Period on which
disableTextTracks
was called, keep the text track disabled even if differentpreferredTextTracks
are set - smooth: Replace
{CustomAttributes}
token in a segment URL - dash: load the last segment of a Period when it is declared in a SegmentTemplate (with no SegmentTimeline) and when its end is exactly equal to the end of the Period
- dash/metaplaylist: be more tolerant with the appendWindows set as the previous behavior could lead to infinite rebuffering and segments re-downloading
- dash/metaplaylist/smooth: Better handle discontinuities in a VoD content
- dash/metaplaylist: Handle discontinuities between DASH Periods and between MetaPlaylist contents
- dash/smooth: Avoid requesting multiple time the last segment when the duration given in the Manifest are inexact
- smooth: Skip without throwing Manifest's StreamIndex with an unrecognized type
- dash: Improve prediction of when to update a dynamic MPD with xlinks
- dash: Be more tolerant of differences between a segment's time announced by the Manifest and the reality to avoid multiple cases of segment re-downloading
- dash: Guess initialization range for segments defined in a SegmentBase without an Initialization element
- dash: Throw better error when a sidx with a reference_type
1
is encountered - api: Throw a better error when setting a
preferredAudioTracks
orpreferredTextTracks
value in the wrong format - demo: Allow to export and share demo links with custom contents
- demo: Fix video track switching in the demo page
- demo: Fix spinner not hiding when playing on very specific conditions
- demo: reset playback rate before loading a content
- dash: add
lowLatencyMode
loadVideo
option to play low-latency DASH contents with chunk-encoded CMAF and chunked transfer encoding close to the live edge efficiently - metaplaylist: add the experimental
metaplaylist
transport, which allows to smoothly play a concatenation of multiple contents - api: add
serverSyncInfos
totransportOptions
(loadVideo
option) - errors: add
code
property to aNetworkError
indicating the corresponding HTTP status
- dash: fix minimum time calculation for Multi-Period MPDs with SegmentTemplate segment indexes but no SegmentTimeline
- dash: play static MPD not declaring any segment for a time of 0 seconds at the minimum possible time by default
- dash: fix maximum position calculation for live Multi-Period contents where the currently generated period is not the last one declared in the MPD
- api: authorize to set no
url
toloadVideo
if themanifestLoader
transportOption
is set - smooth: the
aggressiveMode
option now only allows requests for segments which had time to at least begin to be generated to avoid too much HTTP 412 - dash: the
aggressiveMode
now also have an effect for some SegmentTemplate DASH contents (download segments even if they're not finished) - code: add pre-commit and pre-push git hooks to automate checking and facilitate bisecting
- dash: better handle live Multi-Period contents where the currently broadcasted period is not the last one declared in the MPD
- dash: better infer the end of a Period if the start of the next one is defined
- api: always start live contents at the live edge if one is defined and not just before the last available segments
- ci: run integration tests with Travis and appveyor again
- api: fix
networkConfig.segmentRetry
loadVideo
option. Due to a typo, it was forced to the default value (4) - api/abr: when the
throttleVideoBitrateWhenHidden
option is set to true, wait 60 seconds (as documented) after the page is hidden before switching to a lower bitrate - dash: fix segment indexing for SegmentList-based MPD with a period start different than 0
- dash/smooth: check if the segment should still be available before retrying it (avoid unnecessary HTTP 404 errors)
- dash/smooth: the Manifest can now be refreshed due to unexpected 404 HTTP errors on a segment request (only on particular conditions)
- dash: better handle segments overlapping multiple periods by using the data that is only within the concerned Period's bounds
- demo: authorize to play stored contents with an HTTP Manifest in the HTTPS demo
- eme: add
getLicenseConfig
property to thekeySystems
loadVideo
option, to be able to have much more control over getLicense's behavior - eme: add
noRetry
togetLicense
errors to abort retries when the licence request fails - eme: add
message
togetLicense
andonKeyStatusesChange
errors to allow custom errors when the license request fails - eme: add a new
ENCRYPTED_MEDIA_ERROR
with the codeCREATE_MEDIA_KEYS_ERROR
for when we cannot create a MediaKeys instance (seen on some Android devices).
- api: avoid sending {audio,video...}BitrateChange with a
-1
value when starting to play a content - api/abr: a call to
setAudioBitrate
orsetVideoBitrate
could be ignored for a content if it was still loading. This is now fixed. - api/abr: a call to
setMaxAutoBitrate
orsetMaxVideoBitrate
could be ignored for a content if it was still loading. This is now fixed. - dash: fix maximum position calculation when refreshing a live MPD with a UTCTiming element and no SegmentTimeline.
- dash/smooth: a MPD/Manifest request failing could still be retried when loading another content
- eme/compat: on Safari, depend on WebKitMediaKeys even if MediaKeys is defined because of differences of implementations
- pipelines: always send
PIPELINE_LOAD_ERROR
warnings when a segment request or a Manifest request is retried - errors: replace undocumented
PIPELINE_RESOLVE_ERROR
code into the proper documentedPIPELINE_LOAD_ERROR
code - errors: replace undocumented
PIPELINE_PARSING_ERROR
code into the proper documentedPIPELINE_PARSE_ERROR
code - errors: add to the
ErrorCodes
static property the previously forgottenNONE
,INVALID_KEY_SYSTEM
andINVALID_ENCRYPTED_EVENT
codes.
- abr: make use of another adaptive algorithm, buffer-based, when enough buffer has been built.
- demo: allow the user to save custom contents to local storage to be able to reuse them when the page is refreshed
- eme: throw a better error in
onKeyStatusesChange
if the Promise is rejected without an Error - errors: refactore error management to better correlate the
fatal
boolean to a playback stop and to better ensure a documented error is always thrown - scripts: make our build script compatible with MacOS (handle BSD sed)
- api/abr: add
throttleVideoBitrateWhenHidden
which unlikethrottleWhenHidden
does not throttle the video bitrate if the media element is in picture-in-picture mode
- api/abr: deprecate
throttleWhenHidden
in profit ofthrottleVideoBitrateWhenHidden
which has a better API definition for some edge cases
- api/abr:
limitVideoWidth
now also considers if the video is in picture-in-picture mode - buffer: better prevent the
BUFFER_FULL_ERROR
MediaError
on some memory-constrained devices - dash: consider the buffer depth as infinite (until
availabilityStartTime
) if thetimeShiftBufferDepth
is not set - smooth: consider the buffer depth as infinite if the
DVRWindowLength
is not set or set to 0 - init: start live contents that just began (less than 10 seconds ago) at the minimum position instead of throwing a STARTING_TIME_NOT_FOUND MEDIA_ERROR.
- tests: use web server (local by default) instead of stubbed XHRs to serve tests contents to our integration and memory tests
- eme: add
disableMediaKeysAttachmentLock
key system option to bypass a deadlock (with possible tradeoffs) when playing encrypted contents on some peculiar devices
- dash/smooth: never rely on Date.now when calculating time differences to avoid issues when the user adjusts the system clock while playing a live content
- eme: throw a better error (avoid
toString is not a function
messages) for aKEY_LOAD_ERROR
when thegetLicense
function provided fails without a proper error - api: fix rare situation with DASH multi-period contents where we reported no available bitrate, Adaptation nor Representation when switching to another Period.
- eme: add other default contentTypes when calling requestMediaKeySystemAccess to improve device support
- demo: update the demo UI
- code: change indentation style of a big chunk of the code to increase readability
- dash: add UTCTiming support
- smooth: add
aggressiveMode
transportOption to requests segments in advance - dash/smooth: add
referenceDateTime
transportOption to set a default reference time for live contents
- buffer: work around firefox bug leading to infinite rebuffering when seeking many times in a content
- dash/smooth: add optional
url
,sendingTime
andreceivingTime
properties in the response given by manifestLoader transportOption - misc: deploy documentation pages and demos from our previous versions
- misc: add new RxPlayer logo to README.md and the demo
- npm: publish package again. An error in the previous release led to some files missing on npm
- languages/api: add
preferredAudioTracks
andpreferredTextTracks
player options - languages/api: add
setPreferredAudioTracks
,getPreferredAudioTracks
,setPreferredTextTracks
andgetPreferredTextTracks
methods - languages/api: add
availableAudioTracksChange
,availableTextTracksChange
andavailableVideoTracksChange
events - abr/api: add
availableAudioBitratesChange
andavailableVideoBitratesChange
events - eme: allow playback of mixed encrypted and unencrypted contents on Chrome
- types: export the new
IAudioTrackPreference
andITextTrackPreference
types
- languages/api: deprecate the
defaultAudioTrack
loadVideo
option in favor of thepreferredAudioTracks
player option. - languages/api: deprecate the
defaultTextTrack
loadVideo
option in favor of thepreferredTextTracks
player option.
- dash: fix
minimumUpdatePeriod
management for DASH contents - smooth: better prevent 412 HTTP errors for smooth streaming contents
- subtitles: ensure subtitles are not visible in Firefox when disabling them in the
"native"
textTrack mode. - errors: avoid sending multiple
MEDIA_TIME_BEFORE_MANIFEST
orMEDIA_TIME_AFTER_MANIFEST
warnings instead of just one - api: fix (deprecated) option
hideNativeSubtitles
- errors: set a readable error message for every error and warnings thrown
- tools/mediaCapabilitiesProber: set logs about unimportant missing APIs as debug-level instead of warn-level
- types: provide type safety to
addEventListener
andremoveEventListener
- dash/api: fix
getMinimumPosition
for MPDs with an availabilityStartTime superior to unix epoch - smooth: be more tolerant on downloaded segments (accept ISOBMFF with boxes in any order)
- buffers/abr: fix issue infrequently leading to a delay in quality changes
- buffers: improve synchronisation to the SourceBuffer's buffer to avoid cases where the same segment could be downloaded multiple times
- subtitles: fix bug in the clean-up logic of subtitles in the
"html"
texttrack mode that would lead to removed subtitles still being displayed - pipelines: retry a segment request with a backoff instead of stopping when receiving a HTTP 412
- compat/subtitles: work-around firefox issue in the
"native"
texttrack mode to ensure track cues are removed when the content is stopped - subtitles/webvtt: support default classes in the WebVTT specification
- subtitles/webvtt: multiple styles for the same element are now merged into one (instead of considering only the last one)
- subtitles/webvtt: fix styling issues when both styles applied globally and styles applied on a selector are defined
- subtitles/webvtt: do not remove whitespaces in styles to keep a sane formatting for some complex values
- dash: warn through logs when fields are not in the expected format
- drm: throw more explicative error messages when DRM are not supported in the current target
- dash/smooth: get more precize duration from ISOBMFF by better handling the default duration taken from the tfhd box
- tests: continue unit test coverage improvements (from 22% in the
v3.10.2
to 33.6%) - demo: fix initial text-track selection
- dash/smooth: fix manifest updates for some DASH contents (SegmentTimeline without SegmentTemplate) and for some Smooth usages
- compat/drm: adopt a new strategy for malfunctioning CENC PSSH on Edge by moving them at the end of the initialization data
- dash/smooth: update deprecated Manifest.adaptations property when updating the manifest
- dash: refresh the MPD less often
- dash/smooth: improve precision of
getMaximumPosition
when the Manifest is updated - tests: use the Jest library for unit tests
- tests: add a lot of unit tests to sensitive code (from a coverage of 13% in the v3.10.1 to 22% in the v3.10.2)
- npm: reduce size of the npm package
- abr: always consider the last quality estimation
- drm: work-arround Edge bug where the browser does not accept a valid CENC PSSH (DRM-related information in an ISOBMFF)
- dash: handle
S
nodes (segments) with an @r attribute at-1
in an MPD - dash: handle
SegmentTimeline
which have as a firstS
node (segment) an undefined @t attribute in an MPD - dash: Representation.index.getLastPosition() for SegmentBase-based DASH Representations now returns the end of the last segment (it returned the start of the last segment before)
- dash/smooth: throw better error (
MANIFEST_PARSE_ERROR
) if none of the audio or video tracks of a content can be played (e.g. none have supported codecs)
- manifest: better infer the minimum time of a Manifest
- code: refresh code architecture (rename and move modules, remove some dependencies...)
- tests: add coverage reports for both unit and "integration" tests, to check where tests are lacking and better pin down our hot-spots
- tests: add appveyor countinous integration service for unit tests
- dash: Manage xlinks in "onLoad" resolution model
- dash: Implement AdaptationSet switching by merging similar and switchable AdaptationSet into a single track
- compat: add
MEDIA_ERR_METADATA_NOT_LOADED
warning, triggered when the browser has issues with loading the initial data (only seen on the Samsung mobile browser in directfile mode) - compat: add
MEDIA_ERR_PLAY_NOT_ALLOWED
warning, triggered when the application tries toplay
but the current browser doesn't allow it (often due to autoplay policy) - api: the
play
API now returns a Promise, mirroring the original browser'splay
API
- api: The
xhr
property from aNetworkError
is now deprecated
- compat/smooth: fix fatal error
BUFFER_APPEND_ERROR
happening on some HSS contents with Edge - dash/smooth: never refresh the manifest if its content is not dynamic
- dash/smooth: use new URL if the initial manifest request is redirected (again :/ - thanks @fnatte)
- api: do not go out of the
LOADING
state if the metadata could not be fetched (even if the browser tells us otherwise) - to work around Samsung Browser bug - api: avoid going out of the
LOADED
state until the initial seek is done and metadata is fetched - compat: use Promise ponyfill to improve IE11 compatibility with the MediaCapabilitiesProber and some EME functionalities
- api: translate most IETF language tags into corresponding ISO639-3 codes for the
normalizedLanguage
property - given from APIs such asgetAvailableAudioTracks
- tools: fix
mediaCapabilitiesProber.getCompatibleDRMConfigurations
experimental tool on Safari - api: filter out duplicates in
getAvailableVideoBitrates
andgetAvailableAudioBitrates
- dash: better infer unknown Period durations
- dash: better manage overlapping Periods by giving more importance to the last chronological one
- memory: clean-up
Adaptation
andRepresentation
information on Periods which are not considered anymore - log: warn through our logs every time a warning event is sent by the API
- demo: authorize DRMs in IE11 or Safari when in HTTP in the demo page
- demo: fix time indication for non-live contents
- compat: fix
undefined Object.values function
issue happening in some older browsers (mainly encountered in IE11 and old webkit versions) - compat: remove side-effects relative to DRM on Safari
- tools: fix issue about an undefined Array.prototype.find method in some older browsers when calling mediaCapabilitiesProber.getCompatibleDRMConfigurations (mainly encountered in IE11)
- eme: activate MediaKeys caching on Edge
- compat: add in our validation process a ban of methods and functions unavailable in older browsers
- tests/smooth: reinforce our Smooth Streaming integration tests
- smooth: authorize empty tracks ("StreamIndex") in Smooth manifests
- smooth: fix issue preventing emergency manifest updates
- dash: fix timeout for minimumUpdatePeriod in cases where the time at which the manifest was last requested is not known (like when setting a customManifestLoader argument)
- smooth: keep supplementary segment information when updating the manifest
- smooth: when updating segment information, perform garbage-collection of those concerning unreachable segments
- dash: consider
minimumUpdatePeriod
attribute in MPDs - buffer: add codec-switching for browsers supporting the
SourceBuffer.prototype.changeType
API - dash/smooth: accept and parse segments with a "stpp.ttml.im1t" codec (TTML IMSC1 in MP4)
- smooth: fix calculations of the initial time, duration and minimum position for HSS VOD contents not starting at a '0' time
- buffer: fix priority updates for segment requests
- dash: calculate VOD duration from the last period if undefined in the MPD's root
- dash: remove possibility of obtaining two periods with the same id
- typings: make
manualBitrateSwitchingMode
loadVideo
option an optional TypeScript typing (thanks @fnatte again!)
- abr: do not always cancel pending requests when switching to a new bitrate
- abr: re-estimate the bandwidth immediately after each request
- buffer: remove automatic garbage-collection of the "image" source-buffer (its rules should be more complex than those in place)
- tools/mediaCapabilitiesProber: Make
getCompatibleDRMConfigurations
work under IE11 and old webkit versions - tools/mediaCapabilitiesProber: Add a multitude of bug fixes to the experimental mediaCapabilitiesProber
- package: divide by more than 2 the size of our package published in
npm
(thanks @necccc) - tests: add memory tests to detect memory leaks
- demo: add 'favicon' to the demo page
- abr: fix memory leak in ABR Management
- eme: avoid re-attaching a server certificate at each encrypted event
- buffer: lower the "paddings" applied to the video buffer when raising the quality
- abr: when pratical, avoid relying on the "Content-Length" header to protect against miscalculations when downloading from misconfigured servers
- abr: lower the minimum number of bytes we wait to download before we evaluate the bandwidth
- abr: use performance.now instead of Date.now for better precision
- module: move express from the dependencies to the devDependencies
- demo: fix standalone demo and add possibility to launch it via HTTPS
- api/dash/smooth: add representationFilter API to prevent Representations (i.e. media qualities) from being played
- api/buffer: add
manualBitrateSwitchingMode
option to allow a direct representation switch when callingsetVideoBitrate
andsetAudioBitrate
- api/buffer: emit a
MEDIA_TIME_BEFORE_MANIFEST
warning when the wanted time is before what is announced in the manifest - api/buffer: emit a
MEDIA_TIME_AFTER_MANIFEST
warning when the wanted time is after what is announced in the manifest
- remove export of undeclared
ICompatVTTCue
from modular build
- buffer: to avoid taking too much memory, regularly clean-up text and image buffer 5 hours ahead/behind the current position (customizable)
- demo: add HTTPS capabilities on local full demo
- rxjs: update rxjs to 6.3.3
- typescript: update typescript to 3.1.2
- eme: add
throwOnLicenseExpiration
boolean tokeySystems
(loadVideo
option) to allow better expiration management - eme: in the
getLicense
property ofkeySystems
(loadVideo
option), it is now possible to resolve withnull
to avoid a license update. - eme: in the
onKeyStatusesChange
property ofkeySystems
(loadVideo
option), it is now possible to resolve withnull
to avoid a license update. - tools: replace experimental tool
mediaCapabilitiesProber.isDRMSupported
by the more usefulmediaCapabilitiesProber.getCompatibleDRMConfigurations
- smooth: giving a WSX URL instead of the Manifest URL for a smooth content is now deprecated.
- smooth: giving a publishing point definition URL (.isml) instead of the Manifest URL for a smooth content is now deprecated.
- smooth: giving a Smooth Streaming server manifest URL (.ism) instead of the Manifest URL for a smooth content is now deprecated.
- api: switch state to "ENDED" if seeking to the end while the player is in the "LOADED" state.
- api: switch state to "SEEKING" if seeking in the content while the player is in the "LOADED" state.
- dash: consider multiple
Role
nodes for an AdaptationSet. - typescript: fix typings error when an application build us without the
skipLibCheck
TypeScript option enabled. - smooth: fix Manifest URL generation when a ".ism" or a ".isml" URL is given.
- doc: document deprecation of the
adaptations
property returned from aManifest
object (as returned from thegetManifest
method).
- doc: add quick start tutorial.
- doc: add player states documentation.
- demo: add possibility to play encrypted contents.
- demo: update demo page.
- tests: consolidate our integration tests.
- directfile: send
LOADED
event again for directfile contents - thanks @Fnatte - dash: don't merge "main" AdaptationSet if they are not of a video type
- eme: fix bug which prevented the
closeSessionsOnStop
keySystem option to work properly - typescript: export types compatible with project references
- directfile/tests: add basic directfile integration tests
- build: update to Babel 7
- rxjs: update to RxJS 6.3.1
- api: add video track switching
- dash: add webm support
- api: Emit warning if autoPlay is blocked on the current browser
- api: add
getAvailableVideoTracks
method to retrieve every video tracks - api: add
getVideoTrack
method to get the active video track - api: add
setVideoTrack
method to switch the video track - api: add
videoTrackChange
event to know when a video track has been switched - api: add
RELOADING
event for cases where the player needs to reload (such as during a video track switch)
- api: the method
isFullscreen
has been deprecated - api: the method
setFullscreen
has been deprecated - api: the method
exitFullscreen
has been deprecated - api: the method
getNativeTextTrack
has been deprecated - api: the event
fullscreenChange
has been deprecated - api: the event
nativeTextTrackChange
has been deprecated
- ttml: display forbidden characters (such as ">") in a
"native"
textTrackMode
- ttml: process
xml:space
even if it is not defined at the top level - buffer: perform a better clean-up of previous media in a SourceBuffer when switching audio or text track
- manifest/dash: throw a MANIFEST_PARSE_ERROR when no AdaptationSet of a given type in a Period is in a compatible codec
- types: export and document main typings used internally such as ILoadVideoOptions (the loadVideo argument)
- misc: log every fatal errors
- misc: remove dumb npm inclusion as a project dependency
- doc: improve architecture documentation
- dash: Manage presentationTimeOffset completely (allow advanced multi-period configurations)
- dash: Fix Adaptations bug when the first DASH adaptation was a "main" one
- smooth: Remove the limitation of a minimum bitrate in Smooth Streaming
- dash: Fix condition which prevented to play audio-only live DASH streams
- typescript: add typescript declaration files
- abr: update ABR mechanisms when the estimated bandtwidth fall suddenly
- api: warn in the log when the browser reject a wanted autoplay
- drm: Add keyId information to the internal Manifest structure
- typescript: update typescript to v3.0.1
- parsers: fix wrong computation of segment time in template index
- abr: get concerned request in starvation mode
- tools: add
mediaCapabilitiesProber
tool as an experimental tool - builds: add minimal import with feature selection (allowing cleaner feature switching or lazy-loading)
- dash: allow multiple "main" adaptation
- api: add static
version
property to the RxPlayer API
- vtt: fix
line
setting for vtt tracks in"native"
textTrackMode - dash: always play "main" adaptation first
- misc: don't interfere with a client's RxJS implementation by switching to RxJS 6
- dash: presentationTimeOffset doesn't have an influence on requested segment anymore
- smooth/dash: throw a
"MANIFEST_PARSE_ERROR"
if no audio and video adaptations/StreamIndex are available in the current content
- builds: Reduce size of the builds
- builds: use uglifyJS instead of Closure-compiler
- builds: update to typescript 2.9
- rxjs: update to RxJS version 6 (v6.2.1)
- code: set complete URL in segment's media property
- demo: add time indicator on the progress bar
- demo: update fullscreen mode to also display the text track element
- misc: moved demo server scripts to the respective demo directories
- misc: moved manifest parsers to the
src/parsers
directory - misc: moved scripts from
./tools
to./scripts
- misc: moved webpack configs to the root of the project
- buffer: fix several bugs happening when calling
endOfStream
to announce the end of the current content. Especially prevalent on Chrome. - net: use redirected URL as a base for further requests when the manifest request led to a HTTP redirect.
- vtt/srt: ignore silently (do not throw) when an unknown block has been detected in a vtt or srt file
- vtt/srt: support styling spans (like b, i and u XML tags) spanning multiple lines
- api:
getAvailableTextTracks
andgetAvailableAudioTracks
now always return an array (and never null) as announced in the API documentation - api: set default log level to
"NONE"
instead of"INFO"
- misc: remove development-only code from the non-minified code
- misc: move some dev dependencies from
dependencies
todevDependencies
inpackage.json
- eme: allow multiple licenses per content
- eme: allow different MediaKeys to be attached on multiple media elements
- eme: limit simultaneous loaded MediaKeySession to 50 by default (configurable)
- source-buffer: clean properly the text SourceBuffer on deactivation
- buffer: perform discontinuity seeks only for native source buffers
- doc: generate documentation pages
- misc: add sonarqube quality pass
- code: set a clearer private state for the API
- tools: update to webpack v4.8.3
- tools: update to typescript v2.8.3
- api: emit SEEKING state instead of BUFFERING when the user seeks to an unbuffered part just after resuming playback
- api: work around bug found in old versions of Chrome where the ENDED state would never be triggered at the end of the stream
- api/language: fix bug where an audio or text language would not be switched to on certain conditions in live contents
- smooth: fix frequent manifest refreshing happening immediately when changing audio/text language
- eme/error: fix reason string and error message for KEY_STATUS_CHANGE_ERROR
- buffer: update download queue immediately when seeking to an already-buffered part, to always prioritize needed segments
- buffer: schedule segments per level of priority to lower some buffering/seeking/loading time
- demo: fix "Big Buck Bunny WEBM"'s URL
- misc: fix missing browser API on IE11
- buffer: end correctly streams which experienced a custom sourcebuffer (text/image) crash
- tools: support development on windows
- api: add directfile API to allow the playback of files natively managed by the browser
- api: fix player state when seeking after the video ended
- text/api: fix getTextTrack API which could return the current audio track instead
- text: clean-up custom HTML text track SourceBuffer's buffered when the text track is disabled
- dash: Handle multi-periods DASH manifests
- api: add
periodChange
event - api: add
stopAtEnd
option to the constructor, to deactivate automatic content un-loading when it ends - api: add
manifestLoader
to thetransportOptions
of aloadVideo
call
- stream: call
endOfStream
for better end detection and to allow the Chrome browser to display the last frames of a video - buffer: always play the last possible milliseconds of a content (removed END_OF_PLAY config attribute)
- eme: workaround a bug found on Chrome where setting a
keySystems
option inloadVideo
would always throw on HTTP (not HTTPS) pages. - vtt: fix WebVTT parsing when the last line of a WebVTT file is not a new line
- dash: ignore availabilityStartTime settings for a static MPD
- buffer: ignore segments for a duration inferior to the MINIMUM_SEGMENT_SIZE (200ms by default) to avoid infinite re-downloading
- update RxJS to v5.5.6
- update TypeScript to v2.7.2
- api: add
networkConfig
toloadVideo
options - eme: add
closeSessionsOnStop
to thekeySystems
loadVideo
option
- dash: fix Range request ranges for representations based on a SegmentList index
- smooth: allows smooth Manifests for non-live contents to begin at a timestamp != 0
- eme: fix bug which prevented to play encrypted contents on IE11
- buffer: fix issue which could led to multiple video or audio segments being downloaded at the same time
- dash/text: support MPD AdaptationSet with a "caption" Role as text Adaptations
- dash/text: remove offset set for subtitles on live contents, which led to unsynchronized subtitles
- dash: fix issue which could led to segments being re-downloaded too much in a SegmentTemplate scheme
- demo: set "html" textTrackMode by default to have a better stylization of closed captions.
- eme: consider unknown errors (e.g. errors coming from the user of the library) as fatal eme errors
- text/webvtt: authorize header options without parsing them
- text/webvtt: authorize timestamps without hours
- misc: remove multiple unneeded assertions in DEV mode
- misc: update DEV mode default debug level from DEBUG to INFO
- text/ttml: apply correctly a style if directly set on an attribute
- eme: load new video even if the last EME clean-up failed
- misc: set better work arround for typescript issue 20104 to make building npm scripts usable again
- tools: update the update-version npm script
- demo:
npm run start
andnpm run standalone
now build the rx-player in the "development" environment - tools: add more logs in DEBUG mode
- misc: work around typescript issue 20104 temporarly to launch in Chrome in HTTP
- abr: adopt a less agressive strategy to avoid re-bufferings
- smooth: avoid most of the manifest refresh requests
- Switch codebase to TypeScript
- Add Travis CI
- misc: add possibility to do custom builds through environment variables, to remove unwanted features from minified code.
- languages: add support for segmented VTT subtitles
- languages/dash: add support for plain text TTML, SAMI, SRT, VTT and MP4-embedded VTT subtitles in DASH manifests
- languages/smooth: add support for MP4-embedded VTT subtitles in Smooth manifests
- languages: add possibility to show fragmented or not TTML, SAMI, SRT and VTT text tracks in a element, even for browser that do not support the VTTCue API
- languages: add possibility to show TTML, SRT, VTT and SAMI text tracks in HTML tags for richer stylisation.
- api: add
textTrackElement
option toloadVideo
- api: add
textTrackMode
option toloadVideo
- api: add
nativeTextTracksChange
event - eme: it is now possible to directly set the reverse domain name of the wanted key system in the
type
property ofloadVideo
'skeySystems
option. - api: add property
percentage
to thestartAt
argument ofloadVideo
. - abr: add
bitrateEstimationChange
event - api: add
LogLevel
static property - api: a Date object can now be given to the
loadVideo
argumentstartAt.wallClockTime
. It will be automatically converted into seconds. - languages: add
normalizedLanguage
property in manifest-related-APIs to expose the ISO 639-3 language code of the audio and text tracks - languages: add
normalized
property in language-related-API to expose the ISO 639-3 language code of the audio and text tracks - loadVideo: add
codecs
property to supplementaryTextTracks - api: add
wantedBufferAhead
constructor option - api: add
maxBufferAhead
constructor option - api: add
maxBufferBehind
constructor option - api: add
getVideoBufferGap
method - api: add
isMute
method - api: add
getManualAudioBitrate
method - api: add
getManualVideoBitrate
method - config: add a global config file (src/config.js) to easily tweak the player behavior
- languages: switch from ISO 639-2 to ISO 639-3 language codes in various APIs
- languages: the
language
property returned by language and manifest related APIs now reflect the exact language as set in the manifest - api:
setVideoBitrate
can now be called even when no content is playing - api:
setAudioBitrate
can now be called even when no content is playing - api:
setVideoBitrate
can now be called even when no video track has the exact same bitrate - api:
setAudioBitrate
can now be called even when no audio track has the exact same bitrate - api: giving a number to
seekTo
now has the same effect than setting a position option in argument (seekTo({ position }) === seekTo(position)
) - api:
getUrl
now do not throw if no content is playing - api:
isLive
now do not throw if no content is playing - api:
loadVideo
does not return anything anymore - api: private (undocumented) variables have been isolated on a player instance to a
_priv
object. - api: the constructor option
throttleWhenHidden
is now set to false by default - api: the constructor option
limitVideoWidth
is now set to false by default
- api: remove
defaultAudioTrack
constructor option - api: remove
defaultTextTrack
constructor option - api: remove
transportOptions
constructor option - api: remove
transport
constructor option - api: remove
nativeTextTrackChange
event in favor ofnativeTextTracksChange
event (notice the "s") - api: remove
goToStart
method - api: remove
getStartTime
method - api: remove
getEndTime
method - api: remove
toggleDebug
method - api: remove
hideDebug
method - api: remove
showDebug
method - api: remove
getDebug
method - api: remove
getImageTrack
method - api: remove
setVideoBufferSize
method in favor ofsetWantedBufferAhead
method - api: remove
getVideoBufferSize
method in favor ofgetWantedBufferAhead
method - api: remove
setAudioBufferSize
method in favor ofsetWantedBufferAhead
method - api: remove
getAudioBufferSize
method in favor ofgetWantedBufferAhead
method - api: remove
maximumBufferTime
property frompositionUpdate
events - api: remove
getCurrentTime
method - api: remove
asObservable
method - api: remove
loadVideo
optionmanifests
in favor ofurl
andkeySystems
options - api: remove
loadVideo
optionsubtitles
in favor ofsupplementaryTextTracks
option - api: remove
loadVideo
optionimages
in favor ofsupplementaryImageTracks
option - api: remove constructor option
initVideoBitrate
in favor ofinitialVideoBitrate
option - api: remove constructor option
initAudioBitrate
in favor ofinitialVideoBitrate
option - api: remove constructor option
defaultLanguage
in favor ofdefaultAudioTrack
option - api: remove constructor option
defaultSubtitle
in favor ofdefaultTextTrack
option - position: remove
subtitleChange
event - position: remove
languageChange
event - position: remove
progress
event - position: remove
currentTimeChange
event in favor ofpositionUpdate
event - adaptive: remove
getMetrics
method - adaptive: remove
getAverageBitrates
method - adaptive: remove
getVideoMaxBitrate
method in favor ofgetMaxVideoBitrate
method - adaptive: remove
getAudioMaxBitrate
method in favor ofgetMaxAudioBitrate
method - errors: remove static method
getErrorTypes
in favor of the static propertyerrorTypes
- errors: remove static method
getErrorCodes
in favor of the static propertyerrorCodes
- languages: remove
normalizeLanguageCode
method - languages: remove
getAvailableLanguages
method - languages: remove
getAvailableSubtitles
method - languages: remove
isLanguageAvailable
method - languages: remove
isSubtitleAvailable
method - languages: remove
getLanguage
method - languages: remove
getSubtitle
method - languages: remove
setLanguage
method - languages: remove
setSubtitle
method
- dash: fix bug that prevented to play most dash contents with SegmentTemplate-based manifests
- dash: it's now possible to play SegmentTimeline-based contents with a numbering scheme
- dash/text: calculate the text track time offset for dynamic DASH contents (prevented most text tracks from live DASH contents to be displayed)
- eme: fix EME issues when loading multiple videos in IE/Edge
- api: The state of the player when ready to play with autoPlay === false is now
"LOADED"
and not"PAUSED"
- api: fix infinite loading bug when a new content is synchronously launched as soon as the previous one is ended or fell on error
- dash: allow absolute BaseURL in Periods
- languages: avoid excessive re-downloads if a
supplementaryTextTracks
is provided and either amaxBufferBehind
or amaxBufferAhead
is set. - eme: the
reason
for the eme errorKEY_STATUS_CHANGE_ERROR
is now correctly filled in - eme: do not set widevine robustnesses for non-widevine key systems
- languages: fix bug which led the text buffer to crash when the
wantedBufferBehind
option is set - languages: fix bug which led to TextTracks chunks being re-downloaded multiple times
- speed: fix playback rate bug when setting it while the player is stalled
- smooth: fix "fallback" callback in the segmentLoader API for smooth contents.
- smooth: fix some minor risks of infinite rebuffering for live contents, when the isobmff's tfrf box is not well parsed.
- buffer: avoid infinite player rebuffering when the manifest is not exactly aligned with the real duration of the content
- buffer: avoid multiple causes of infinite player rebuffering by managing segment garbage collection
- languages: getAudioTrack now always returns the currently set audio track
- languages: getTextTrack now always returns the currently set text track
- manifest: improve manifest refreshing logic, by not downloading it when unnecessary
- smooth: begin to play arround 10s before the live edge instead of 20 seconds for smooth contents
- network: the backoff algorithm has been refactored for better network error resilience
- adaptive: improved ABR management to provide a better, faster and more stable bandwidth estimation
- adaptive: add strategies for abrupt changes of bandwidth to avoid excessive re-buffering on network fluctuations
- adaptive: the adaptive algorithm now take into account the current playback rate
- doc: added file architecture documentation
- tests: fixed and added integration tests
- demo: the demo now manages most languages defined by in the ISO 639-3 standard
- eme: update EME workflow to improve support (especially chromebooks)
- buffer: improve buffer ranges "bookeeping" logic to avoid re-downloading the same segments
- eme: add audioRobustnesses to loadVideo's keySystems argument (/!\ undocumented API - can break without official notice)
- eme: add videoRobustnesses to loadVideo's keySystems argument (/!\ undocumented API - can break without official notice)
- eme: add serverCertificate to loadVideo's keySystems argument
- buffer: add {set,get}MaxBufferAhead methods
- buffer: add {set,get}MaxBufferBehind methods
- buffer: add {set,get}WantedBufferAhead methods replacing the deprecated buffer size methods
- setVideoBufferSize has been deprecated in favor of setWantedBufferAhead
- getVideoBufferSize has been deprecated in favor of getWantedBufferAhead
- setAudioBufferSize has been deprecated in favor of setWantedBufferAhead
- getAudioBufferSize has been deprecated in favor of getWantedBufferAhead
- buffer: avoid some infinite re-buffering by re-calculating buffer ranges at every tick
- eme: add eme support for some legacy browser without video or audio capabilities
- general: add support for older browsers (which does not support array.prototype.{find,findIndex,includes})
- general: use Object.assign ponyfill instead of the previous polyfill to avoid malicious interferences with other codebases
- adaptive: fix width limitation bug. Impacted limitVideoWidth + setMaxVideoBitrate APIs
- position: add maximumBufferPosition to the positionUpdate event's payload to replace the previous "liveGap" from currentTimeChange event
- upgrade to rxjs 5.4.1 to escape memory leak
- position: "liveGap" from currentTimeChange event now means the difference to the maximum "bufferisable" position to keep compatibility with the old API
- api: fix timeFragment.start handling
- stream: the BUFFER_APPEND_ERROR error, happening when a SourceBuffer.appendBuffer failed for an unknown reason, is now a fatal error for audio/video segments
- eme: fix rxjs timeout management which prevented from playing DRM-protected contents
- api: add securities to avoid useless errors to be thrown when the player (already) encounter an error
- position: fix bug which prevented to seek at the beginning of the content with the new api
- position: fix typo which prevented to perform absolute seeks with the new api
- buffer: automatically seek if there is discontinuity in a live stream
- adaptive: take the lowest bitrate (instead of the initial/default one) when the player is not displayed/too small
- hotfix: fixed rxjs imports
- hotfix: the player can now be imported through a commonjs require
- hotfix: the player could not play if the video element's width was too short
- manifest: segment id were not always the same on a segmentLoader and on the API calls.
- adaptive: setVideoBitrate now throw a more meaningful error if no content is playing
- adaptive: setAudioBitrate now throw a more meaningful error if no content is playing
- language: setSubtitle now throw a more meaningful error if no content is playing
- language: setLanguage now throw a more meaningful error if no content is playing
- language: isLanguageAvailable do not throw and return false if no content is playing
- language: isSubtitleAvailable do not throw and return false if no content is playing
- api: deprecated api now only warn once
- tests: integration tests have been added
- manifest: the manifest object and the management of its index has been refactored for future improvements
- images/dash: add BIF support in DASH MPD
- subtitles/smooth: add support for closed captions in smooth manifest
- subtitles: add closed caption support in supplementaryTextTracks loadVideo arguments
- position: add getMinimumPosition and getMaximumPosition methods
- position: add startAt loadVideo argument (replace the timeFragment API)
- position: add positionUpdate event
- images: add getImageTrackData method
- images: add imageTrackUpdate event
- position: add possibility to use relative, absolute and wall-clock time on seekTo API
- transport: add segmentLoader transportOption for constructor and loadVideo API
- api: add setMaxAudioBitrate and setMaxVideoBitrate method
- api: add exitFullscreen method
- api: add ErrorTypes and ErrorCodes static properties
- api: add getPosition method
- api: add getWallClockTime method
- manifest: add getCurrentRepresentations method
- manifest: add getCurrentAdaptations method
- api: add throttleWhenHidden option to constructor (to disable throttling when the current page is hidden for an extended time)
- api: add limitVideoWidth option to constructor (to disable throttling to match the video element's width)
- api: add initialAudioBitrate and initialVideoBitrate to constructor's options
- api: add defaultTextTrack and defaultAudioTrack to loadVideo and constructor's options
- languages: add getAvailableAudioTracks method with audio description support
- languages: add getAvailableTextTracks method with closed caption support
- languages: add getAudioTrack method with audio description support
- languages: add getTextTrack method with closed caption support
- languages: add setAudioTrack method with audio description support
- languages: add setTextTrack method with closed caption support
- audiotrack/dash: add audio description support in DASH MPD
- subtitles/dash: add closed captions support in DASH MPD
- subtitles/dash: add subtitles support in DASH MPD (only ttml for now)
- position: the timeFragment API is deprecated (loadVideo's timeFragment argument, getStartTime, getEndTime and goToStart)
- api: currentTimeChange event is replaced by the positionUpdate event
- api: progress event is deprecated and not replaced
- api: getImageTrack is replaced by the imageTrackUpdate event
- api: loadVideo parameter subtitles is replaced by supplementaryTextTracks
- api: loadVideo parameter images is replaced by supplementaryImageTracks
- api: getVideoMaxBitrate is replaced by getMaxVideoBitrate
- api: getAudioMaxBitrate is replaced by getMaxAudioBitrate
- api: toggleDebug is deprecated and not replaced
- api: hideDebug is deprecated and not replaced
- api: showDebug is deprecated and not replaced
- api: getDebug is deprecated and not replaced
- api: asObservable is deprecated and not replaced
- api: getAverageBitrates is deprecated and not replaced
- api: getMetrics is deprecated and not replaced
- position: using seekTo with a Number argument is deprecated.
- position: getCurrentTime is deprecated in favor of getWallClockTime
- api: setVideoMaxBitrate is replaced by setMaxVideoBitrate
- api: setAudioMaxBitrate is replaced by setMaxAudioBitrate
- api: using setFullscreen(false) is replaced by exitFullscreen
- api: getErrorTypes method has been deprecated in favor of the ErrorTypes property
- api: getErrorCodes method has been deprecated in favor of the ErrorCodes property
- languages: initAudioBitrate option in constructor is deprecated in favor of initialAudioBitrate
- languages: initVideoBitrate option in constructor is deprecated in favor of initialVideoBitrate
- languages: defaultSubtitle option in constructor and loadVideo is deprecated in favor of defaultTextTrack
- languages: defaultLanguage option in constructor and loadVideo is deprecated in favor of defaultAudioTrack
- languages: getAvailableLanguages is deprecated in favor of getAvailableAudioTracks
- languages: getAvailableSubtitles is deprecated in favor of getAvailableTextTracks
- languages: getLanguage is deprecated in favor of getAudioTrack
- languages: getSubtitle is deprecated in favor of getTextTrack
- languages: isLanguageAvailable is deprecated and not replaced
- languages: isSubtitleAvailable is deprecated and not replaced
- languages: setLanguage is deprecated in favor of setAudioTrack
- languages: setSubtitle is deprecated in favor of setTextTrack
- adaptive: fix a bug where it was impossible to switch between multiple videos representations with the same width
- languages: fix bug where the user could switch to a closed caption track unknowngly
- languages: fix bug where the user could switch to an audio description track unknowngly
- manifest: improved and documented getManifest's return value
- manifest: defined and documented a generic manifest object structure (slowly replacing the old object).
- images: image playlists are now not re-fetched if the request failed (no retry)
- dash: lowered security time raising the startup time for SegmentTemplate-based contents
- api: getLanguage/getSubtitle returns now the language of the last chunk received, not the last set
- manifest: fixed manifest-refreshing logic (mainly for live contents)
- dash: fixed support for dash SegmentTimeline-based contents
- api: differentiate unset default languages from empty strings
- languages: handle undefined languages (to an empty string)
- api: allow the player to be instanciated with no option
- mp4: fix minor bugs with isobmff parsing
- images: keep externally-given BIF track when the manifest is refreshed
- timings: fix timeFragment arguments RegExp
- subtitles: fix webVTT management for unsupported user agents
- timings: fix calculation of the position and duration for non-dynamic contetns
- documentation: The API documentation has been completely rewritten
- manifest: The DASH manifest handling has been refactored
- smooth: Smooth index handling has been completely separated from the DASH logic
- tests: fix and re-wrote unit tests
- documentation: Code documentation has been added
- demo: The Demo has been completely rewritten
- demo: The bundle has been removed from the code committed.
-
RxJS: use RxJS5.beta1
-
Promise: remove es6-promise dependency and stop relying completely on promises
-
eme: improve IE11 and Edge support on EME
-
smooth: activate patch in place on non IE targets for less memory allocation
-
player: deprecate directFile api and skip MediaSource assert for directfile
-
player: clone array for getAvailableBitrates methods
-
player: fix when no adaptation or no representation
-
player: record subtitle state as empty string
-
buffer: start with buffer infos to cache infos asap
-
stream: start stalling system after having first metadata
-
refacto: clean pipelined objects and POO where needed
-
lint: add new rules (no-var, prefer-const, enforce brackets)
- buffer: add garbage collector
- player: emit currentTimeChange synchronously
- player: add {defaultLanguage,defaultSubtitle} api
- log: warn to info for some logs
- player: fix getAvailable* for direct files
- player: fix subtle race on loadedmetadata after retry
- eme: remove compat code for old chrome versions with eme flags
- eme: always ask for temporary session type
- eme: fix template error message
- eme: improve persistent license support and compat
- smooth: fix index timeline if no duration
- allow to pass query parameters
- smooth: fix parseBoolean causing isLive to be always true
- eme: license persistency support
- timings: add progress sampling
- compat: add firefox workaround for autoplay
- stream: do not stall on loadedmetadata event
This release introduces the use of ES6 classes for all modules that depends on a sort of class hierarchy. It comes with an upgrade of RxJSv3.1.1.
We also started using eslint as our main linter instead of jshint.
- smooth: customizable parser (7b50ce9)
- smooth: add application/smil as SAMI content-type (e0aa2bb)
- improve video start time by ticking on loadedmetadata (27bd43c)
- dash: incremental id from adaptations/representations (c24fecb)
- stream: discontinuity check on each stalled tick (3a5b796)
- fix missing new on Promise (4679632)
- compat: fix IE11 compat for setMediaKeys (2ccb11f)
- player: fix synchronous dispose on loadVideo (dc79bd1)
- pipelines: fix audio/video init segment caches (ea3422f)
- stream: remove initial seek hack (ae0ac23)
- player: fix getVideoLoaded/PlayedTime (63bf304)
- player: fix getUrl (577ce87)
- manifest: enforce id setting to parsers (927d275)
- smoothstreaming transport support
- api for initial aubio/video bitrate choice
- simplify WebVTT support and implementation
- allow percentage values on start/end time values
- fix local buffer representation out-of-sync with native ones
- fix no retry for > 500 http codes
- fix no MediaKeySession reuse on Chrome
- fix quota error with MediaKeys attached to multiple video elements on Chrome
Initial public release.