Skip to content

Instantly share code, notes, and snippets.

@gordeyev
Created August 16, 2023 11:46
Show Gist options
  • Save gordeyev/221f12459f99e8861e1dda84c72f63b9 to your computer and use it in GitHub Desktop.
Save gordeyev/221f12459f99e8861e1dda84c72f63b9 to your computer and use it in GitHub Desktop.

Revisions

  1. gordeyev created this gist Aug 16, 2023.
    1,104 changes: 1,104 additions & 0 deletions hls.js.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1104 @@
    v0.10.1
    hotfix
    FIXES IE11 exception in broken array-copy wrapper (error message: "Function.prototype.call: 'this' is not a Function object)
    We attempted to use the recommended technique where available to do shallow copy operations on Array-like types (assuming Array.from where available would be better). All recent browsers are implementing the Array.from method, why we noticed this bug too late. The way we were calling Array.prototype.slice on IE11 was ineffective: our compatiblity-wrapper function was crafted in the wrong manner - as we have learned in a painful way.

    See #1786

    Our main take-away here is improving our CI acceptance testing in browser VMs, so we can have confident automated testing on IE11 as well, and notice such issues before we merge them :shipit:

    Also, we have now actually acknowledged that slice is usually more performant, which might be because of Array.from supporting a more wide range of parameters: https://jsperf.com/array-from-vs-array-prototype-slice

    v0.11.0
    Breaking Changes
    The dist folder has been removed from master. dist assets are now included as an attachment to the release. This shouldn't affect those installing via npm; developers deploying locally will need to build it themselves. Developers wanting to run the demo locally will need to build the library first.
    New Features
    Added support for server-side rendered builds
    #1841
    Enabled Typescript support in the codebase
    #1762
    Automate release via Travis
    #1810
    Added a bunch of new logos. Thanks for your support!
    Bugfixes
    Avoid fatal exception when the ABR controller sets up before the level has been loaded
    #1754
    Fixes custom JSON parsing in metadata tags by splitting the regex on the first found colon
    #1815
    Improve stall detection and resolution
    #1808
    Stop and cleanup level capping on MEDIA_DETACHING in order to avoid out-of-bound exceptions
    #1809
    Switch demo from HTTP to HTTPS to avoid mixed content errors
    #1839
    Clean up broken fragment-loader objects when errored or timed out
    #1823
    Fix PTS computation of AAC segments when the timestamp is 0
    #1840
    Fix a bunch of bugs related to stream synchronization via PROGRAM-DATE-TIME
    #1854
    Only select a default audio track when not previously set by the API
    #1853
    Reassign audio track IDs after filtering to avoid array index mismatches
    Fix AAC demuxing of alternate audio tracks with different timestamps
    Fix always-failing performance.now call
    #1867
    Ensure that initial FRAG_CHANGED event is fired if the bitrate test fragment is buffered
    #1872

    v0.12.0
    New Features
    Added a new config option, liveBackBufferLength, which allows developers to set the maximum amount of buffer behind the playhead during a live stream. Any buffer beyond the set max will be evicted; this should help in cases where the browser's natural buffer eviction was not sufficient. See https://github.com/video-dev/hls.js/blob/master/docs/API.md#livebackbufferlength for more info. #1845
    Enhancements
    Hls.js will now load VTT segments in sync with the corresponding media. This means that segments will load beginning at the playhead, and will only download up to the end of the buffer. Previous behaviour was to download and parse every VTT segment on start. #1882
    Key load failures will now cause Hls.js to immediately downswitch to a new variant on failure, instead of retrying 3 times before switching. #1836
    Bugfixes
    Ensure that streams are ended after the last fragment has buffered, even if has already been buffered. #2040
    Remux according to the initial video PTS so that streams begin at 0. This may fix stalling in streams with very small segments. #2030
    Fix missing alternate audio when the video codec is not specified in the manifest #1993
    Fixed an exception using Set in browsers which do not natively support it. #1984
    Restore response data in the load error events. #1977
    Fix stalling in Chrome when an abort error happens after seeking. #1925
    Fix playback of streams for which the segment URL looks like an mp4 fragment, but which are not mp4s. #1921
    Fix exceptions caused by attempting to load embedded audio tracks found in a manifest. #1907
    Fix parsing of segments which contain spaces in its URL. #1899
    Reuse textTracks when the track order between manifests is different. #1869
    Fix FRAG_CHANGED not firing on the first segment of the first level. #1872
    Fix performance.now usage in workers. #1866

    v0.12.1
    Hotfix
    Fixed a bug where cue start times were not correctly calculated. #2044

    V0.12.2
    Happy holidays, Hls.js-ers! Santa left a bit of coal under the WebVTT-tree; luckily, we managed to sweep it away before too many good developers noticed (we hope).

    Hotfixes
    Fixed a bug where WebVTT did not show after a discontinuity #2056
    Fixed a bug where WebVTT did not show when captions were enabled after a seek #2058. Thanks @mtoczko!

    v0.12.3
    Hotfixes
    Fixed uncaught exceptions in IE caused by using unpolyfilled ES6 functions #2117
    Addressed a few bugs with Live VTT subtitles #2148:
    Fixed subtitles disappearing after a few seconds
    Fixed VTT playlists continuing to refresh after being disabled, or while a live stream is paused

    v0.12.4
    Hotfixes
    Fixed an exception thrown while destroying a stream containing alternate audio #2177. Thanks for the fix @Korilakkuma!

    v0.13.0
    New Features
    Emit SEI packets with resolution payloadType 5 in FRAG_PARSING_USERDATA events #2126
    Expose Hls.js' bandwidth estimate (in bits per second) via hls.bandwidthEstimate getter on the Hls instance #2086
    Allow level capping (config.capLevelToPlayerSize) to be dynamically enabled/disabled #1986
    Bugfixes
    Fix React builds breaking with WebWorkers #2174
    Fix incorrect VTT cue offsets when X-TIMESTAMP-MAP is not present #2179
    Fix Hls not choosing the correct startup segment for fmp4 streams #2196
    Fix info and description fields being merged in TXXX ID3 frames #2217
    Fix cue positioning in Firefox #2229
    Fix Hls throwing exceptions when trying to load in non-MSE environments #2305
    Fix Hls not playing after loading a stream with alt audio before attaching #2172
    Fix startup stalling caused by alt audio tracks not loading at the correct time #2067
    Fix null console reference when using the logger class in WebWorkers (affects Tizen 2.3) #2095
    Fix RangeError exceptions ("Source is too large") when remuxing TS #2096
    Fix ID3 timestamps causing exceptions in IE/Edge #2120
    Fix timescale conversion in the remuxer #2354
    Fix Calling detatchMedia() followed by attachMedia() causes audio to not play #2099
    Fix Memory leak caused by VTT cues never being cleaned up, which caused long live streams to eventually crash #2309
    Fix various issues and regressions on gap-skipping and other "playback/buffer stall" handling (fixes wrongly emitted buffer-stall error on seeks into unbuffered regions) as well as other playhead-tracking related functionnality, done essentially on GapController: #2453
    Fix RangeError exception in TS demuxer #2415
    Fix unnecessary seek on start resulting in playback stalling and repeated logs of first segment loading #2438
    Fix #2400 - Cues doesn't show up on browsers which addCue doesn't throw error with invalid structure (WebOS)
    Misc. Improvements
    Huge strides have been made towards converting the codebase to TypeScript: #2144 #2130 #2129 #2119 #2107 #2106 #2097 #2076 #2075 #2073
    Remove IE8 code #2128
    Fix a bunch of ESLint warnings https://github.com/video-dev/hls.js/pulls/2116

    v0.13.1
    Improvements
    Added code of conduct #2482
    Removed TypeScript types build step #2475
    Bugfixes
    Fixed isSupported check in browsers missing SourceBuffer global #2490
    Resolves issues #2430 and duplicate #2476

    v0.13.2
    Enhancements
    Start loading the audio playlist once the parent manifest is loaded, rather then waiting for the first level to load (#2340)
    TS demuxer will use PTS/DTS of last PES when current PES does not contain PTS/DTS (#2109)
    Bugfixes
    Prevent from seeking backward when liveMaxLatencyDuration or liveMaxLatencyDurationCount * targetduration is less than liveSyncDuration or liveSyncDurationCount * targetduration (#2506 fixes #2494)
    Fixed PIPELINE_ERROR_DECODE error in Chrome by improving PES ACC overflow handling (#2530 fixes #2528)
    Misc
    Updated dependencies (#2538)

    v0.14.0
    Version 0.14 adds API features found in the feature/v1.0.0 branch. This is intended to make transitioning to v1.0.0 easier and also provide API parity for A/B testing the current release and next major update of hls.js.

    In addition to these features and bug fixes, we've made changes to how our CI versions preview builds which are published to npm to account for pre-releases while maintaining semver precedence. To do this, we have replaced the canary channel with an alpha channel. Previously, if we cut a beta or release candidate like 0.14.0-rc.2 the next commit would generate a canary, using the last release patch+1 - so 0.13.3-canary.5704. That worked following 0.13.2, but after 0.14.0-beta.1, it ignores that we are already heading on to the next minor release. To fix this, we now generate an alpha, using the last tag. So in the case of a prerelease - 0.14.0-rc.2.0.alpha.5718. And for releases we still increment the patch - so following this release you will see CI builds versions like 0.14.1-0.alpha.5720.

    Enhancements
    Add CEA-608 captions 4 channel support
    Adds config options for additional channels captionsTextTrack3Label, captionsTextTrack3LanguageCode, captionsTextTrack4Label, captionsTextTrack4LanguageCode
    Add renderTextTracksNatively config option (defaults to true) which allows for disabling the addition of captions/subtitle TextTracks to the video element for 608/VTT tracks
    When set to false rather than a new TextTrack being added for captions and subtitles, NON_NATIVE_TEXT_TRACKS_FOUND and CUES_PARSED events are emitted so that the application using hls.js can handle rendering of the track and its cue points.
    Add support for #EXT-X-SESSION-DATA tag in master playlist
    Add sessionData property to Hls.Events.MANIFEST_LOADED event
    Add removeLevel() method to API
    Can be used to remove a loaded level from the list of levels, or a level url in from a list of redundant level urls.
    Remove unnecessary files form the NPM distribution
    Only dist and src files are included in releases moving forward
    XHR loader and fetch loaders always read from globals window.XMLHttpRequest and window.fetch instead of once on script embed
    Add support for DRM system options audioRobustness and videoRobustness in hls.config. drmSystemOptions for requestMediaKeySystemAccess audioCapabilities and videoCapabilities configuration
    Media key sessions are closed and media keys cleared when media is detached
    Bugfixes
    Fix EME controller async error
    Fix an exception in a stream with an end fragment that contained only ID3 data and no valid elementary video or audio streams
    Fix false positive ADTS probes
    Improve handling of large start gaps
    Fix exception in abr-controller with missing levels
    Fix player size evaluation in cap-level-controller when video element includes width and height attributes that do not match actual size
    Fix Cannot read property 'realBitrate' of undefined exception
    Fix playback stops on short segment (DAI streams)
    Fix playback of audio-only streams (EXT-X-STREAM-INF) with with alternate audio tracks (EXT-X-MEDIA)
    Documentation
    Added entries for
    fpsDroppedMonitoringPeriod
    fpsDroppedMonitoringThreshold
    bufferController
    capLevelController
    fpsController
    emeEnabled
    widevineLicenseUrl
    drmSystemOptions
    requestMediaKeySystemAccessFunc
    Mark lowBufferWatchdogPeriod as deprecated
    Fix broken logo image urls and mixed content (insecure) urls
    Make the readme example work out of the box again
    Logging enhancements
    Include buffer size in playback stall warnings
    Reduce log output for unknown elementary stream types
    Fix audio gap output when injecting audio frames
    Distinguish functional test logs from player logs (CI)
    Misc
    Add Timeline chart tab to the demo page
    netlify CI improvements
    npm package updates
    TypeScript fixes
    Optional chaining
    Test improvements
    Functional tests run in a single browser session (CI)
    IE compatibility fixes
    "smooth switch" test improvements
    Add audio-only with alt audio track test streams

    v0.14.1
    Bugfixes and Improvements
    Fix frame dropping after discontinuities #2873
    For a list of MP4 remuxer improvements related to this patch see #2876

    v0.14.2
    Bugfixes and Improvements
    Fix IE11 regression in mp4 remuxer #2891

    v0.14.3
    Bugfixes and Improvements
    Fix gaps introduced in video buffer by remuxer work-around #2894
    This release fixes a regression in v0.13.0+ that introduced buffer gaps at segment boundaries in streams with variable frame rates, or when adapting to another rendition where the target segment has a high composition time (cts) on the first video frame. See #2894 for more details.

    v0.14.4
    Bugfixes and Improvements
    Fix playback disrupted when an audio stream uses multiple container formats #2900 resolves #2887
    Fix Safari video playback, and fragment timing #2902 resolves #1801, #2122
    This release comes with some long overdue improvements to how the start time of segment's media is estimated, which is key to the timing of each audio and video sample.

    When MSE buffering changed in Chrome 63 to report PTS times, this project switched from appending on DTS to PTS. The problem was, in one place in the mp4 remuxer, the next estimated PTS was being used to set the next estimated AVC DTS. This caused all sorts of errors, as workarounds, meant to fix bad streams, kicked in when they should not, misaligning video and audio and causing frames to be dropped or overwritten.

    That is now fixed, along with the estimated startPTS of the next segment. Fragment timing, the basis of the timeline hls.js uses to buffer media, is now much more stable. I hope this improves the stability of playback and reduces stalls in your apps. ✌️

    v0.14.5
    Bugfixes and Improvements
    Seek once into buffer start when starting a live stream #2907 resolves #2498, #2507, #1989
    This release fixes a long standing bug with IE11/Edge where video was not rendering when seeking to the start of a live stream just short of the buffer start. The bug is in IE11/Edge (it should render video once playback enters the buffered range containing video - it just doesn't when we perform two seeks before "seeked" moves into the range where playback starts), but doing a clean seek right into the start of the buffer avoids it. This was common in streams that have segments where audio samples start before video samples - or the buffered start is later than the manifest start time.

    v0.14.6
    Bugfixes and Improvements
    Fix stalling on discontinuity with audio track #2919 resolves #2913, #2545
    Fix initial audio video desync for fMP4 #2832
    Prevent immediate level switch from performing unnecessary pause and seeks #2918
    Misc
    Functional test improvements #2921
    This release is focused on stability in streams using alternate audio tracks. Live streams and streams with discontinuities frequently presented problems depending on the order in which playlists and media were received initially. With this release, regardless of that order, alt audio media will be synced to the variant playlist media, by deferring final parsing and appending of audio segments (not the fetching of) until they can be aligned with variant media PTS.

    v0.14.7
    Bugfixes and Improvements
    Fix regression in streams with PTS wrapping prior to DTS #2929
    Fix regression where stream duration became shorter prior to discontinuities in segments with misaligned audio and video #2932
    Prevent negative DTS time ranges in fragments #2908

    v0.14.8
    Bugfixes and Improvements
    Fix edge-case in main audio-only with track descriptions #2943 resolves #2837
    Fix PTS/DTS calculation on rollover #2930 resolves #1796
    Require min cue duration of 0.25 on ID3 cues #2951 ensures that TextTrack "change" events fire for all appended VTTCues
    Fix audio remuxer out of sequence sample drop regression #2960 resolves #2959
    Enhancements
    Silence redundant fragment selection logs
    Other Improvements
    Improve stability of function tests
    Minimal logging on functional tests
    Improve demo video size menu
    Show multiple demo test tabs using modifier key
    Big-big thanks to @itsjamie for the rollover timestamp handling and CI logging improvements, and all the review and feedback! 🥳
    And many thanks to @jnatalzia for the id3 cue duration fix. ⌚ 👀


    v0.14.9
    Bugfixes and Improvements
    Only apply minimum ID3 cue duration when cue does not have one. #2964 resolves #2963
    This patch fixes a regression introduced in v0.14.8 where we applied a minimum duration 0.25s to all metadata cues. All cues must have a positive duration, but we shouldn't modify valid ones, since those cue ranges may be considered critical to application logic.

    v0.14.10
    Bugfixes
    Fix mp4-remuxer CHUNK_DEMUXER_ERROR_APPEND_FAILED in Chrome 74 and lower, as well as Chromium based browsers like Opera 58. Reduces composition time of initial video samples in older browsers so that moof base decode time starts at 0 or higher. #2995
    This patch fixes a regression introduced around v0.14.4 where negative base decode times used to remove start gaps in the video track cause append errors:

    The video playback was aborted due to a corruption problem or because the video used features your browser did not support - CHUNK_DEMUXER_ERROR_APPEND_FAILED: video frame with PTS 40000us has negative DTS -40000us after applying timestampOffset, handling any discontinuity, and filtering against append window

    v0.14.11
    Bugfixes
    Fix handling of NULL delimiter when parsing ID3 WXXX tags #3006

    v0.14.12
    Bugfixes
    Allow mp3 data that does not contain ID3. Fixes #3037

    v0.14.13
    Bugfixes
    Fix remuxing of AVC with bad PTS #3049
    Misc
    Added saucelab-connect test fixes and updates to patch/v0.14.x branch

    v0.14.14
    Bugfixes
    Fix for subtitle loading after hls.stopload() was used and skip segments seeked over #3063
    Handle PTS rollover on initial sample of video or audio #3082

    v0.14.15
    Bugfixes
    Improve handling of PTS rollover initPTS calculation #3088

    v0.14.16
    Bugfixes
    Live to VOD playlist alignment #3124
    Sample AES decryption with 48 AVC #3131 fixes #3102

    v0.14.17
    Bugfixes
    Parse all ID3 tags (not just standard PRIV, TXXX and WXXX tags) #3284
    Misc
    Update workflow files in patch branch for releases

    v1.0.0-rc.6 Pre-release
    This is a preview release of version 1.0. It is feature complete and intended for testing purposes.

    Changes Since Last Release
    v1.0.0-rc.5...v1.0.0-rc.6

    Add support for delta playlist updates without blocking reload #3670 resolves #3644
    Improve fmp4 probing and codecs support #3672 resolves #3669
    Improve handling of SourceBuffer creation errors for unsupported codecs not signaled in manifest
    Safely read playlist response "age" header (thank you @radiantmediaplayer) #3685 and #3686 resolves #3680
    Calculate drift (live edge advance rate) and display live program date time in demo stats
    New Features
    Apple Low-Latency HLS support
    Improved support for redundant variants with tracks
    Improved audio and subtitle track selection with multiple media and stream variants containing different GROUP-ID values
    Improved support for fmp4 streams with alternate codecs
    Progressive streaming option (experimental)
    API Changes
    New config options:

    backBufferLength config applies to Live and VOD content. liveBackBufferLength is still supported but marked as deprecated.
    lowLatencyMode - set to false to disable Low-latency part loading and target latency playback rate adjustment
    progressive- (experimental) set to true to stream and append loaded audio and video data before each segment load completion. It is not recommended for production or small segments with only a single GoP or less.
    Event order and content have changed in some places. See Breaking Changes below, and please report any issues with breaking changes that impact your integrations

    hls.audioTracks and hls.subtitleTracks as well as AUDIO_TRACKS_UPDATED and SUBTITLE_TRACKS_UPDATED events only list tracks in the active level's audio/sub GROUP-ID after LEVEL_LOADING - #3293

    Added groupId to audio and subtitle track loading and loaded events

    Added additional error details to help identify the source of certain network error events:

    SUBTITLE_LOAD_ERROR
    SUBTITLE_TRACK_LOAD_TIMEOUT
    UNKNOWN
    The FRAG_DECRYPT_ERROR event is no longer emitted and is instead surfaced as a FRAG_PARSING_ERROR

    Added fatal BUFFER_INCOMPATIBLE_CODECS_ERROR media error when all attempts to add SourceBuffers fail.

    BUFFER_CREATED no longer fires right after BUFFER_ADD_CODEC_ERROR.

    Breaking Changes
    See the new MIGRATING guide for API changes between v1.0 and v0.14.

    Known Issues
    TTFB is factored into overall bandwidth and can impact quality selection when streaming smaller segments or LL-HLS parts #3563

    v1.0.0
    HLS.js v1.0.0 has arrived! Thank you to everyone who contributed to this release and hls.js in general.

    New Features
    Apple Low-Latency HLS support
    Improved support for redundant variants with tracks
    Improved support for GROUP-ID audio and subtitle track selection sets
    Improved support for fmp4 streams (including those with alternate codecs)
    Chunk-Transfer "progressive" streaming option (experimental)
    All src modules have been converted to TypeScript
    API and Breaking Changes
    See the new MIGRATING guide for API changes between v0.14.x and v1.0.0.

    Changes Since The Last Release Candidate
    v1.0.0-rc.6...v1.0.0

    Fixed PIPELINE_ERROR_DECODE error in streams with AAC segments - #3703
    Improved end-of-stream handling - #3704
    IE11, README v1, and Functional Test Fixes #3705
    Added drift to public API
    IE11 Functional Test Fixes
    Updated README for v1
    Fixed smooth switch stuck in PARSING state edge-case
    Code cleanup - #3687
    What's Next?
    The Release Planning and Backlog project highlights issues that are a top priority. Expect to see these in an upcoming minor or patch.

    The LL-HLS project is still open. A lot of great feedback came in at the eleventh hour. The availability of sample streams and community contributions will be a significant factor in moving the project forward. The only features not implemented in v1.0.0 are "Hinted Part and Map Preloading" (EXT-X-PRELOAD-HINT). Bugs and enhancements will continue to be added to this project as necessary.

    Some have asked when and if v0.15 will be released. While there is a version milestone set and a patch/v0.15.x branch in GitHub for that release, there has been no date set. Work on v0.15 has been paused indefinitely. Please test upgrading to this release. If something is preventing you from upgrading but still a problem in v0.14.x, file an issue explaining why upgrading does not work for you.

    v1.0.1
    Summary
    HLS.js v1.0.1 includes several bug fixes and improvements over the last release.

    Demo Page
    https://hls-js-214a1a90-214b-4c4d-a32a-d2d2f9d2824c.netlify.app/demo/

    Changes Since The Last Release
    v1.0.0...v1.0.1

    Fixed level and track switching after the last segment has been appended - #3774
    Fixed playback failure when the order of audio tracks within each group is inconsistent in the manifest - #3731 Resolves #3729
    Changed how the “age” header is accessed - #3763 Resolves #3680
    Fixed recursion when calling loadSource() in MEDIA_ATTACHED event - #3754 Resolves #3732
    Fixed use of config.startPosition to override live sync position in live streams - #3740 Resolves #3736
    Fixed audio group switching with fmp4 segmented audio tracks - #3748 Resolves #3741
    Improved detection of fmp4 segments in m3u8 parser for streams with SIDX and no EXT-X-MAP tags - #3758 Resolves #3756
    Made startLoad() and stopLoad() no-ops after destroy() - #3710
    Made a minor change to the Loader interface (see below) - #3711
    Fixed progressive fetch loader leaves video artifacts or glitches - #3755 Resolves #3747
    API and Breaking Changes
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    This release includes a change to the Loader interface. Loader.getResponseHeader() has been replaced with Loader.getCacheAge(). If you have developed a custom loader for v1.0.0 you may need to make changes for your build or type checks. There should be no runtime impact. We will try to avoid changes like this in patch versions in the future.

    v1.0.2
    Summary
    HLS.js v1.0.2 includes several bug fixes and improvements over the last release.

    Demo Page
    https://hls-js-9de24021-304f-45c8-9b76-3d123c91c697.netlify.app/demo/

    Changes Since The Last Release
    v1.0.1...v1.0.2

    Fixed DEFAULT=YES on caption tracks not being respected - #3781 resolves #3780
    Fixed audio-buffer stall with frequent audio group switching - #3800 resolves #3770
    Fixed AES-128 in streams with alt-audio tracks - #3782 resolves #3772
    Fixed setInterval/Timer regression in fps-controller - #3799 resolves #3790
    Fixed playlist URL search params being sorted and re-encoded - #3787 resolves #3786
    Fixed LL-HLS playlist requests with _HLS_part param starting at 0 for next sn - #3784 resolves #3571/#3771
    Fixed blocking playlist requests with lowLatencyMode set to false - #3792 resolves #3566
    Fixed fetch-loader progressive bandwidth sampling - #3801 resolves #3789
    API and Breaking Changes
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    v1.0.3
    Summary
    HLS.js v1.0.3 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.2...v1.0.3

    Fixed immediate and prioritized quality switching in FMP4 streams which muxes audio/video.
    Fix subtitle loading after seeking in tracks with #EXT-X-PROGRAM-DATE-TIME.
    Fixed frequent reloading of segments in certain circumstances with missing video keyframes.
    Improved performance in streams with segments that do not start with a video keyframe by performing preemptive backtracking.
    Improved performance of the demo Timeline chart when interacting with the chart using the mouse.
    Updated README to highlight "Features" and "Getting started with development".

    v1.0.4
    Summary
    HLS.js v1.0.4 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.3...v1.0.4

    Fixed audio drift in live DAI/SSAI streams with overlapping AAC samples - #3901
    Fixed redundant levels in streams with multiple CODECS and matching BANDWIDTH attributes - #3889 Resolves #3888
    Added support for multiple EXT-X-MAP tags - #3859 Resolves #1990
    Thanks to @elv-peter and @erkreutzer for contributing the multiple EXT-X-MAP fixes, @Sylvain228 for chiming in and providing a test vector, and to @ghouet for reporting the issue long ago.

    v1.0.5
    Summary
    HLS.js v1.0.5 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.4...v1.0.5

    Remove subtitle cues and data with the back-buffer - #3969
    Replace live playlist sliding warnings with improved logging - #3967 Resolves #3933
    Fixed last segment in live removed "context changed" error - #3965 Relates to #3913
    Fixed application of EXT-X-START: TIME-OFFSET - #3962 Relates to #3913
    Fixed forward buffer length estimation and error handling - #3961 Resolves #3914
    Fixed incorrect audio track segments loaded before video segment with > 0 startPosition - #3951 Fixes #3950
    Handle AAC overflow with error message - #3926 Resolves #3920

    v1.0.6
    Summary
    HLS.js v1.0.6 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.5...v1.0.6

    Fixed regression that impacted duration with mid-stream insertion of missing AAC audio frames - #3997 Resolves #3976
    Improved live subtitle and audio playlist alignment and fixed a regression where subtitle tracks were enabled when the backbuffer is cleared - #3993 Resolves #3987
    Align live WebVTT subtitle playlists with main variant using playlist start when program-date-time is unavailable
    Fix a regression in v1.0.5 where a subtitle track is enabled after back-buffer removal sets a track's mode to "hidden"
    Update audio-stream alignment with main to be simpler. Both subtitle and audio live playlists will wait for main before being aligned and loading fragments
    Subtitle playlists will be realigned with main if they get into a state where a loading fragment candidate cannot be found

    v1.0.7
    Summary
    HLS.js v1.0.7 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.6...v1.0.7

    Fix subtitle segment loading with current time less than target-duration (#4023)
    Add Release Drafter to project workflows (#4024)
    Demo Page
    https://hls-js-9a58b3b6-df2d-4582-9c4d-6227c559081a.netlify.app/demo/

    API and Breaking Changes
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    v1.0.9
    Summary
    HLS.js v1.0.9 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.7...v1.0.9

    Add missing fetchSetup in config.ts (#4217) @brvier
    use issue forms (#4093) @tjenkinson
    Only draft release on tag (#4056) @tjenkinson
    Update Release Drafter template for project workflows (#4025) @robwalch

    v1.0.10
    Summary
    HLS.js v1.0.10 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.9...v1.0.10

    Fix type for 'debug' field in config. (#4279) @jwalton

    v1.0.11
    Summary
    HLS.js v1.0.11 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.10...v1.0.11

    Update demo URL with pushState() (#4327) @Frenzie
    add space before version in demo page title (#4328) @tjenkinson
    Bugfix/live start bugs (#4303) @cjpillsbury

    v1.0.12
    Summary
    HLS.js v1.0.12 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.0.11...v1.0.12

    make it clear that the mux test stream is ll-hls fmp4 in the descript… (#4397) @cjpillsbury
    hold dependency updates back for 7 days (#4394) @tjenkinson
    add ll-hls stream from mux (#4392) @tjenkinson
    disable apple ll-hls streams that are unavailable (#4350) @tjenkinson

    v1.1.0
    Summary
    HLS.js v1.1.0 adds a base level of CMCD support (disabled by default).

    See this issue for more information.

    Changes Since The Last Release
    v1.0.12...v1.1.0

    Integrate CMCD data into outgoing requests. (#4346) @littlespex
    docs: Fix a few typos (#4415) @timgates42

    v1.1.1
    Summary
    HLS.js v1.1.1 fixes an error that happens when enabling CMCD with useHeaders: true.

    Changes Since The Last Release
    v1.1.0...v1.1.1

    set headers after XMLHttpRequest OPEN (#4424) @tjenkinson

    v1.1.2
    Summary
    HLS.js v1.1.2 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.1.1...v1.1.2

    Fix design.md comments problem (#4461) @albertdaurell
    Fix subtitle loading after switching subtitles off and on (#4457) @robwalch
    Bugfix: CC of low latency streams not displayed correctly (#4298) @hongfeih-es
    Fix trackid for audio and id3 tracks as per iso/iec 14496-12 spec (#4156) @SeJIya
    Fix repeated requests for initialization segments (#4452) @erkreutzer
    Bugfix: hardware accelerated decoding apple silicon (#4412) @lpommers

    v1.1.3
    Summary
    HLS.js v1.1.3 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.1.2...v1.1.3

    Fix off-by-one error in SAMPLE-AES decryption (#4358) @loganek
    Bugfix: Initial segment change without discontinuity (#4238) @hongfeih-es
    clear cue start time on reset (#4479) @SivanA-Kaltura
    Report only 1 FRAG_PARSING_ERROR per parsed TS file (#4481) @albertdaurell
    issue/4483-CMCD-tb (#4484) @littlespex
    bugfix: Ignore program-date-time in subtitle track switch (#4399) @NickCis
    Bugfix: Added --static . in order to fix demo page (#4477) @NickCis
    fix segment duration for VFR (#4337) @nklhtv

    v1.1.4
    Summary
    HLS.js v1.1.4 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.1.3...v1.1.4

    Bugfix: Encrypted VTT subtitles not rendered (#4554) @mtoczko
    Fixes #4182 #4293

    v1.1.5
    Summary
    HLS.js v1.1.5 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.1.4...v1.1.5

    Fixes a bug with ll-hls where ended events would not fire under certain conditions.

    v1.2.0
    Summary
    HLS.js v1.2.0 adds enhanced interoperability and accessibility via improved support for various timed metadata, captions, and subtitle formats, along with bug fixes and improvements.

    Changes Since The Last Release
    v1.1.5...v1.2.0

    Throttle audio stream controller based on main buffer state (#4809) @robwalch
    Make gap controller wait for active fragments while seeking (#4806) @robwalch
    Update functional test targets (#4812) @robwalch
    Bugfix: Use audio PTS over playlist time when aligned with video (#4808) @robwalch
    Simplify backtracking logic to handle segments without keyframes (#4807) @robwalch
    Remove Internet Explorer 11 support (#4802) @robwalch
    v1.2.0-beta.1...v1.2.0-beta.2
    Paused-but-seeking video buffer hole gap jump support (#4667) @karendolan
    Fix loop loading of segments caused by backtracking logic (#4801) @robwalch
    Fix stalls in streams with segments that have no media (#4800) @robwalch
    Bugfix: Handle single sample MPEG2-TS video segments (#4794) @robwalch
    Bugfix: Slow start on stream with CAN-BLOCK-RELOAD=YES (#4793) @robwalch
    Bugfix: Include NAL filler data in AVC samples (#4789) @robwalch
    Guard against exceptions caused by destroying player in buffer stall error callbacks (#4786) @robwalch
    Bugfix: hls.subtitleDisplay doesn't toggle visibility until track selection (#4785) @robwalch
    Fix typos in design doc (#4790) @saikatmitra91
    v1.1.5...v1.2.0-beta.1
    Add Support for EXT-X-DATERANGE enhanced parsing and metadata TextTrack Cues (#4720) @robwalch
    Add support for emsg ID3 metadata in fmp4 segments (#4458) @robwalch
    Config options to disable metadata TextTrack Cue processing (#4782) @robwalch
    Add support for CMAF SEI Captions (#4459) @robwalch (Thanks to @gkolb for #2623 and @ioppermann for #4242)
    Add ignoreDevicePixelRatio configuration option (#3765) @i8beef
    Add alternate HEVC box to fallback codec string. (#4734) @itsjamie
    Do not allow cues with negative startTimes to be added to the text track (#4757) @littlespex
    Update ID3 cues to span until playlist end, or next cue with same tag type (value.key) on cue append (#4719) @robwalch
    Include Panasonic Smart TVs and other old browsers in positive DTS gate (#4780) @jeremies
    Allow exact bitrate matches for minAutoLevel getter (#4629) @littlespex
    Fix nudge retries happening one time fewer than nudgeRetry config (#4485) @tjenkinson
    Bugfix: Store track info when buffer codec switched (#4308) @albertdaurell
    Fix handling encrypted AAC frames when there's no encrypted data in a frame (#4514) @loganek
    Fix AAC overflow when it occurs at ADTS header (#4781) @robwalch
    Fix sidx parsing (#4334) @nklhtv
    Fix: level playlist parse error of ProgramDateTime (#4498) @hongfeih-es
    Bugfix: Incorrect manifest parsing around init segments (#4237) @hongfeih-es
    Bugfix: Low-Latency HLS endofstream (#4516) @cjpillsbury
    Bugfix: IAvoid _appendCues exception (#4552) @albertdaurell
    Bugfix: freeze after buffer full error occur (#4686) @hongfeih-es
    Bugfix: Network hangs on streaming level switch using fetch loader (#4729) @robwalch
    Fix exception in fetch-loader error handler (#3929) @softworkz
    Bugfix: Failed to execute 'update' on 'MediaKeySession (#4577) @hongfeih-es
    Bugfix: Segmented VTT captions cease downloading on live time shifted streams (#4688) @littlespex
    Retry aligning audio playlist with main playlist if levelloaded came too early (#4600) @Frenzie
    Fix: don't re-write baseMediaDecodeTime in tfdt v0 to a negative value (#4670) @jwbrandon
    Prevent base stream from logging after stop (#4564) @wehriam
    Bugfix: forwardBufferLength calculation (#4608) @hongfeih-es
    Bugfix/webvtt-parse: cue offset (subtitle stream without X-TIMESTAMP-MAP) (#4557) @mtoczko
    Bugfix: IMSC1 parsing error (#4218) @mtoczko
    Refactor: replace deprecated String.prototype.substr() (#4605) @CommanderRoot
    Prepare for supporting more audio codecs (#3930) @softworkz
    Resolve linting issue causing build to fail. (#4604) @itsjamie
    Fix esllnt not running on precommit (#4593) @tjenkinson
    Update jsdelivr urls in readme to point at canary and v1 (#4715) @tjenkinson
    Update documentation on testBandwidth. (#4641) @itsjamie
    Fix: typos (#4603) @FredZeng
    chore: replace png logo with svg (#4601) @jungdaniel
    Add Brid.tv as a player solution that utilizes hls.js in README.md. (#4597) @Sovica

    v1.2.1
    Summary
    HLS.js v1.2.1 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.0...v1.2.1

    Determine text track kind based on CHARACTERISTICS (#4850) @lpommers
    Add WebVTT EXT-X-MAP support (#4839) @robwalch
    Forward worker logs to main thread logs (#4820) @lpommers
    Fix audio demuxer contiguity with segments not carrying ID3 timestamps (#4847) @robwalch
    Fix sidx duration (#4849) @nklhtv
    Fix attach/detach and recoverMediaError resume with alt audio (#4816) @robwalch
    Cleanup stream controller logger statements (#4838) @robwalch
    Docs: Update Loader Composition code example with code that does not produce runtime errors (#4845) @littlespex
    CI: switch to W3C WebDriver protocol (#4834) @tjenkinson
    CI: Fix safari on sauce labs: lock selenium-webdriver to 4.1.0 for now (#4827) @tjenkinson
    CI: Update workflows to use Node.js v16 (#4821) @robwalch

    v1.2.2
    Summary
    HLS.js v1.2.2 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.1...v1.2.2

    Fix handling of negative composition timestamps (#4885) @robwalch
    Fix segment error handling with live streams (#4858) @robwalch
    Resume streaming after bitrate test with low max buffer (#4866) @robwalch
    Bugfix: segment loading order with gaps (#4864) @robwalch
    Fix seek to live start regression in dev (#4887) @robwalch
    Fix subtitle buffered check (#4863) @robwalch
    bail if new tag does not directly follow previous version (#4855) @tjenkinson
    Update transmux state before decryption which can return early (#4857) @robwalch

    v1.2.3
    Summary
    HLS.js v1.2.3 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.2...v1.2.3

    Bugfix: Caption missing after seeking back to start when stream is played from discontinuity break (#4889) @littlespex
    Bugfix: Load last VTT fragment in infinite loop (WebVTT with AES-128) (#4901) @mtoczko
    Bugfix: Initial timestamps must be unsigned for tfdt v1 box for Safari iPad OS 16/Ventura (#4900) @robwalch
    CI: Fix npm publishes not happening (#4892) @tjenkinson

    v1.2.4
    Summary
    HLS.js v1.2.4 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.3...v1.2.4

    Patch for abandonRulesCheck sudden quality drops (#4917) @robwalch
    Disable 608 captions on levels with CLOSED-CAPTIONS=NONE (#4916) @robwalch
    Fixes for Dolby Vision level codecs and filtering of unknown codecs (#4907) @robwalch
    Fix broken loader link in table of contents (#4924) @littlespex
    Fix the sampling and channel spellings. (#4896) @kuroishi

    v1.2.5
    Summary
    HLS.js v1.2.5 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.4...v1.2.5

    Bugfixes and Improvements
    ID3: add duration to metadata samples, mimic Safari behavior on unbounded cues (#4967) @jprjr
    Bugfix: Subtitles not working on live with EXT-X-PROGRAM-DATE-TIME gaps (#4999) @erankor
    Bugfix: Exception when xhr.response is null (#4980) @asashakira
    Bugfix: MPEG-2 TS segments not starting with TS packet sync byte (#5006) @robwalch
    Bugfix: MPEG-2 TS DTS/PTS overlap between segments #4976 (#4977) @robwalch
    Bugfix: HEVC 608 captions (#4972) @erankor
    Bugfix: Support Opus lowercase CODECS entry (#4526) @stolen
    Bugfix: Live stream not seeking to start position (#4951) @kmamal
    Tasks
    Remove redundant discardEPB call & impl in tsdemuxer (#4983) @erankor
    Webpack 5 Upgrade (#5007) @robwalch
    Documentation
    Added deprecated event descriptions to API.md and MIGRATING.md (#5009) @tailgo

    v1.2.6
    Summary
    HLS.js v1.2.6 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.5...v1.2.6

    Update fragPrevious when attempting to load an already-buffered fragment (#5013) @erkreutzer
    Fallback to inline demuxing on Worker error (#5016) @robwalch
    Demo Page
    https://hls-js-ca8b2d52-fcac-4573-8aa7-4d4f55f49361.netlify.app/

    API and Breaking Changes
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    v1.2.7
    Summary
    HLS.js v1.2.7 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.6...v1.2.7

    Bugfix: Fix ID3 in AAC start time regression introduced in v1.2.1 (#5014) @jprjr
    Demo Page
    https://hls-js-c26d5ecc-3c7e-4c1c-81dd-05648534771d.netlify.app/

    API and Breaking Changes
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    v1.2.8
    Summary
    HLS.js v1.2.8 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.7...v1.2.8

    Improve webworkify handling of named functions where name is in quotes (#5036) by @robwalch
    Resolves #5015 (v1.2.5 throws an error in a next.js production build)
    Bugfix: Fragment LoadStats total set to 0 with progressive: true (#5054) by @robwalch
    Fixes #5050 (LoadStats properties loaded and total is 0 for a download fragment when using FetchLoader)
    Document new gap controller behaviour on v1.x (#5066) by @itsjamie
    In response to #4066 (Playback does not Start in 1.0.x Versions with A/V Offset in First Segment)

    v1.2.9
    Summary
    HLS.js v1.2.9 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.2.8...v1.2.9

    Fix audio and subtitle controller loading before player seeks to startPosition (#5098) @robwalch

    v1.3.0
    Summary
    HLS.js v1.3.0 adds support for FairPlay and PlayReady in addition to improved support for Widevine DRM. Improvements to key loading, key-system selection, key rotation, and error reporting, make HLS.js a robust choice for playing protected content.

    Changes Since The Last Release
    v1.2.9...v1.3.0

    New Features
    Multi-DRM Support (#4930) @robwalch
    Add support for com.apple.fps (#4474) @valotvince
    Implement maxHdcpLevel HDCP-LEVEL capping and EME error handling (#5150) @robwalch
    Bug Fixes and Improvements
    Parallelize key and segment requests (#4861) @robwalch
    Manage End of Stream state after flushing buffer (#5131) @robwalch
    Log additional information for EOS tests (#5130) @robwalch
    Eagerly match segments without tolerance offset (#5084) @robwalch
    m3u8-parser: fill missing rendition report attrs (#5110) @erankor
    Fix: Rendition Report switching with unnormalized relative URLs (#5124) @robwalch
    Fix Low-Latency HLS next part selection when switching mid segment (#5122) @robwalch
    Prevent missed software decrypt from skipping MP3 segment timestamp offset from being set (#5142) @robwalch
    Remove SIDX playlist MAP patching (#5139) @robwalch
    Documentation
    API.md: DRM documentation and FairPlay support improvements (#5117) @robwalch
    API.md: Clarify when LEVEL_LOADING is not called (#5144) @robwalch
    release-process.md: Mention that you need to be an admin or maintainer to push version tag (#5137) @tjenkinson
    README: Add kaltura player to players list (#5125) @giladna
    README: Added another modern IPTV player example (#5123) @JaroslavHerber
    Tasks
    downgrade netlify-cli for now as it breaks netlify (#5114) @tjenkinson
    Update GitHub stale bot rules (#5138) @robwalch
    Demo Page
    https://hls-js-75bc380c-9334-4db4-80bd-c8023729c6f3.netlify.app/

    API Changes
    See https://github.com/video-dev/hls.js/blob/v1.3.0/docs/API.md for API details and examples.

    API additions

    Added top-level hls.maxHdcpLevel getter-setter
    Config changes

    Added drmSystems for defining key-system specific license urls and certificates
    drmSystems['com.widevine.alpha'].licenseUrl replaces widevineLicenseUrl (deprecated but still supported)
    Use optional drmSystems['com.apple.fps'].serverCertificateUrl to specify FairPlay certificate url
    Use optional drmSystems[KEY-SYSTEM].generateRequest to map initData or generate initData for playlist keys before
    MediaKeySession generateRequest is called
    drmSystemOptions takes additional optional arguments used for defining MediaKeySystemConfiguration
    licenseXhrSetup
    includes additional keyContext and licenseChallenge arguments
    is optionally async: takes a return value of a Uint8Array, a Promise which resolves with a Uint8Array or undefined (returning a value transforms the licenseChallenge license request body)
    licenseResponseCallback includes an additional keyContext argument
    Changes to the integration of EMEController and KeyLoader may impact custom config.emeController implementations
    A new keyLoader constructor argument has been added to StreamController, AudioStreamController, and SubtitleStreamController via BaseStreamController (this allows all stream controllers to share a common KeyLoader instance)
    KeyLoader utilizes an instance of EMEController for handling HLS Keys
    New Error Event ErrorDetails constants have been added to help with identifying issues when negotiating with CDMs

    New KEY_SYSTEM_ERROR type error details:
    KEY_SYSTEM_NO_CONFIGURED_LICENSE Removed KEY_SYSTEM_NO_INIT_DATA from beta.1
    KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED
    KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED
    KEY_SYSTEM_SESSION_UPDATE_FAILED
    KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED
    KEY_SYSTEM_STATUS_INTERNAL_ERROR
    Event object additions

    MANIFEST_LOADED event data includes sessionKeys
    MANIFEST_PARSED event data includes sessionData and sessionKeys
    KEY_LOADED event data includes keyInfo
    Fragment object changes

    The levelkey property has been replaced by an array: levelkeys
    (levelkey has been deprecated and will not be supported)
    LevelDetails object additions

    encryptedFragments property has been added (assists in dealing with "clear-lead" streams where initial segments are not encrypted)
    If you are upgrading from version v0.14.17 or lower, see the MIGRATING guide for API changes between v0.14.x and v1.0.0.

    v1.3.1
    Summary
    HLS.js v1.3.1 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.3.0...v1.3.1

    Update CONTRIBUTING.md (#5164) @vt-idiot
    Prioritize MP4 demux probe over MPEG-TS (#5157) @robwalch

    v1.3.2
    Summary
    HLS.js v1.3.2 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.3.1...v1.3.2

    Fix bitrate test with variants under ~500kbps (#5200) @robwalch

    v1.3.3
    Summary
    HLS.js v1.3.3 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.3.2...v1.3.3

    Support AES-128 Encrypted Low-Latency HLS Parts (#5214) @robwalch
    MPEG-TS probe improvements (#5186) @robwalch
    Log error if MediaSource 'sourceopen' is interrupted by media.src being changed (#5206) @robwalch

    v1.3.4
    Summary
    HLS.js v1.3.4 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    Fix AES-128 key sharing across playlists (#5255) @yajin2021
    Fix MPEG-TS probing when PAT and PMT are not present in the first three TS packets (#5252) @robwalch
    Full Changelog: v1.3.3...v1.3.4

    v1.3.5
    Summary
    HLS.js v1.3.5 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    Do not filter out TextTracks with kind of "captions" from API subtitle track selection (#5297) @dstreet26
    Fixes #5292 (Tracks with CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog" or "public.accessibility.describes-music-and-sound" not displayed when selected via hls.subtitleTrack = trackIndex)
    Full Changelog: v1.3.4...v1.3.5

    v1.4.0
    Summary
    HLS.js v1.4.0 includes support for HLS Content Steering, EXT-X-DEFINE Variable Substitution, and preliminary support for GAP tags. An updated build process and packager provides ES module and worker script output with smaller script payloads. It also includes ABR improvements for short segments and Low-Latency HLS Parts, async xhrSetup support, new load policy error handling config options, and other bug fixes and enhancements.

    Demo Page
    https://eea405db.hls-js-dev.pages.dev/

    Changes Since The Last Release
    New Features
    Support for HLS Content Steering (#5191) @robwalch
    GAP Tag/Attribute Support with FRAG_GAP Error (#5257) @robwalch
    Implement EXT-X-DEFINE Variable Substitution (#5161) @robwalch
    Support QUERYPARAM Variable Substitution (#5265) @robwalch
    Promisify xhrSetup (#5290) @fegauthier
    Error Handling controller and LoadPolicies (#5241) @robwalch
    Support AES-128 Encrypted Low-Latency HLS Parts (#5214) @robwalch
    Migrate to Rollup with new ESM target and UMD Worker injection (#5299) @robwalch and @tjenkinson
    Enhancements and Bug Fixes
    Add playlist RTT and time-to-load given buffer ahead (#5329) @iamboorrito
    Live reload level switch and error handling improvements (#5317) @robwalch
    Support partial RENDITION-REPORT URI matches fallback (#5176) @robwalch
    Fix current quality reporting when seeking back from edge in Low-Latency streams (#5102) @robwalch
    Treat TARGETDURATION as a decimal-integer assigned a minimum value of 1 (#5159) @robwalch
    Log error and detach if MediaSource 'sourceopen' is interrupted (#5206) @robwalch
    Fix for SourceBuffer full error handling (#5332) @robwalch
    Fix M2TS probing when PAT packet is not found in first three packets (#5252) @robwalch
    Fix fallback to inline worker when exception is thrown in worker (worker.onerror) (#5270) @robwalch
    Fix initPTS change between variants (timescale or basetime change) (#5235) @robwalch
    Handle invalid signed "tfdt" decode time values (#5333) @robwalch
    Add cue id for date-range cues (#5169) @yajin2021
    Fix subtitle track selection when TextTrack kind is captions (#5297) @dstreet26
    Cleanup config on destroy since callbacks can have references to the player instance or other objects in their scope (#5279) @robwalch
    Add ES5 syntax check for UMD builds (#5301) @thornbill
    Fix demo bandwidth calculation / show estimated bitrate as line in bitrate graph (#4904) @silltho
    Fix type name error (#5295) @JackPu
    Only allow large gaps to be skipped if start gap or all fragments in range are partial (#5366) @robwalch
    Content-Steering fix: Do not clear and reload bit-identical subtitle content (#5365) @robwalch
    Relax TTFB timeout on manifest request (#5364) @robwalch
    Light build optimizations and fixes (#5160) @robwalch
    Improve bandwidth estimation and adaptive switching (#4825) @robwalch
    Cleanup Attribute RegEx (#5208) @robwalch
    Fix switching back to main audio from additional audio (#5170) @yajin2021
    Do not use optional chain operator for functional tests (#5246) @tjenkinson
    Play AES-128 stream failed sometimes (#5255) @yajin2021
    Clear subtitle-stream-controller buffered list on detach (#5355) @robwalch
    Remove fragments from FragmentTracker after transmux complete if fragment context changed (#5350) @tpaszun
    Remove fragments from FragmentTracker on BUFFER_FULL (#5354) @robwalch
    Use optional chaining operator in more places (#5243) @tjenkinson
    TypeScript enum optimizations (#5271) @robwalch
    CI and Documentation
    Switch from netlify to CloudFlare Pages (#5305) @tjenkinson
    Set the git user email when updating deployments file (#5247) @tjenkinson
    Fix Netlify redirects (#5177) @tjenkinson
    Add a .node-version file and use in actions (#5178) @tjenkinson
    Switch to node 18, unpin netlify-cli, and workaround npm ci then being broken (#5180) @tjenkinson
    Switch back to official saucelabs action (#5179) @tjenkinson
    Add a link to open in stackblitz to the readme (#5307) @tjenkinson
    Documentation - Add interface for AbrController (#4842) @lpommers
    Replace ESDocs generated api-docs with api-documenter markdown (#5163) @robwalch
    API and Breaking Changes
    New API Features and Deprecations since v1.3
    Note all deprecations are soft deprecations, meaning that none of the deprecated options or attributes were removed from the runtime player. They will remain available for backwards compatibility until v2.0.

    Added config.workerPath to support loading of a hosted hls.worker.js script over worker injection
    xhrSetup can optionally return a Promise for async setup of XMLHttpRequest instances
    ERROR Event enhancements:
    All ERROR events include an error property of type Error which references either a caught exception or an Error object instantiated at the point of failure with a friendly error message
    Added errorAction property to ERROR events, used by error-controller to resolve errors through retries and adaptive switching
    Added stats property to ERROR events, used to gather timing information from network errors
    Marked ERROR event err deprecated (replaced by error)
    Added LEVEL_PARSING_ERROR to ErrorDetails, triggered when the playlist parser encounters invalid HLS content (Variable Substitution)
    Added FRAG_GAP to ErrorDetails triggered when encountering a Segment or Part with a GAP tag or attribute, instead of attempting to load the media marked as unavailable. Error handling will attempt to switch renditions or jump the gap if a suitable replacement is not found.
    Marked lowBufferWatchdogPeriod as deprecated (implementation missing/removed)
    Deprecated loading timeout and retry config options in favor of new LoadPolicy options
    A warning is logged when configuring the player with the deprecated loading settings, as they are converted to the new load policy options.

    v1.4.1
    Summary
    HLS.js v1.4.1 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.0...v1.4.1

    Fix Low-Latency HLS Part and fragment tracking (#5423) @robwalch
    Fixes a v1.3.5 regression in Low-Latency HLS playback where additional segment are loaded while playing at the edge
    Fixes a v1.4.0 regression where partially loaded segments are not reloaded while catching up after seeking back
    Bugfix: Check for undefined audio track attribute in findTrackId() (#5431) @agajassi
    Fixes v1.4.0 regression that prevents initial audio track selection from being performed correctly when required option is not the first (#5430)
    Retry audio and subtitle media playlist loading when alternate is not found (#5420) @robwalch
    Fixes v1.4.0 regression where fragment loading retry settings are ignored for alternate audio and subtitle track segment loading errors (#5419)
    Bugfix: reset remainderData in resetContiguity (#5410) @WilliamChiu
    Fixes stalls after seeking with "progressive" option enabled on mp4 segmented content
    Fix incorrect HEVC main profile codec id (#5438) @StaZhu
    Always use MediaSource returned by utils module (#5448) @robwalch
    Setup npm provenance statements for signing builds (#5406) @tjenkinson
    Move package.json#exports types condition to the front (#5439) @Andarist
    Documentation: add Media Chrome for custom UI (#5391) @luwes
    Documentation: Fix readme logos & add Mux logo (#5390) @luwes

    v1.4.2
    Summary
    HLS.js v1.4.2 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.1...v1.4.2

    Allow live level loading to recover from network being suspended (#5473) @robwalch
    Fix AV desync regression in v1.4.0 with misaligned mp4 audio (#5471) @robwalch
    Fix handling of muxed mp4 ("audiovideo") segments in Low-Latency HLS and fragment-tracker (#5460) @TroyKomodo

    v1.4.3
    Summary
    HLS.js v1.4.3 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.2...v1.4.3

    Fix long VOD looping or seeking back to 0 after buffer ejection (#5480) @robwalch
    Remove startLoad() as recovery method from API.md doc (#5478) @robwalch

    v1.4.4
    Summary
    HLS.js v1.4.4 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.3...v1.4.4

    Fix regression in emsg metadata cue timing (#5505) @robwalch
    Fix regression where some AAC segments are treated as TS (#5503) @robwalch
    Fix regression where Playlist loading errors not fatal after all levels and retries exhausted (#5498) @robwalch
    Adjust parsed TS AVC samples when start PTS matches last DTS (#5500) @robwalch
    Provide light ESM dist file (#5486) @Chocobozzz

    v1.4.5
    Summary
    HLS.js v1.4.5 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.4...v1.4.5

    Resume fragment loading after level switch follows level error (f670acc cherry picked from #5537) @robwalch
    Fixes #5498
    Do not adjust the end time of metadata cues that overlap with cues of another type (id3, emsg, daterange)
    (a41088c cherry picked from #5546) @robwalch
    Fixes #5531

    v1.4.6
    Summary
    HLS.js v1.4.6 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.5...v1.4.6

    Keep level switch error actions within player constraints (#5570) @robwalch
    Fixes: Fatal error is never reached when capLevelToPlayerSize is true (#5566) @radiantmediaplayer

    v1.4.7
    Summary
    HLS.js v1.4.7 includes bug fixes and improvements over the last release.

    Changes Since The Last Release
    v1.4.6...v1.4.7

    Fix large subtitle target duration can result in subtitles not loading as needed (#5597) @robwalch
    Fixes subtitle segment finding when using start offset
    Improves subtitle segment finding at the start of discontinuity sequences
    Fixes subtitle segment loading when subtitle playlist does not have DISCONTINUITY tags matching media playlists
    Fix Multivariant Playlist and Key XHR loader retries (#5598) @robwalch
    Fixes XHR Loader retry logic (only used for key and MVP files)
    Fixes stream-controller state state change on key file errors that result in level switch