Open
Conversation
littlespex
reviewed
May 22, 2025
littlespex
reviewed
Jun 23, 2025
littlespex
reviewed
Jul 2, 2025
cdbf737 to
18964ea
Compare
042af7e to
7a9cff6
Compare
* cmcd reporter initialization * request mode migration * event mode migration * cmcd model migration * fix cmcd model unit tests * fixes for cmcd parameters and cleanup - protection controller fixes WIP * cleanup and update unit tests * refactor unit tests and fixes * fix unit tests and remove batchTimer
* ab, lab and tab inner list and request mode * ab, tab and lab inner list for v2 * bl inner list and event mode * br inner list and event mode * toInnerList helper * bsd inner list * mtp inner list and event mode * nor inner list * pb inner list and event mode * tp inner list and event mode * tpb inner list and event mode * fix unit tests
…rum#4925) * Catch errors triggered by changeType * If changeType() triggers a NotSupportedError then disable changeType and resetSourceBuffer for track switches * Remove firstFragmentedSubtitleStart from cts calculation as it leads to wrong buffered ranges for multiperiod content * Refactoring
* chore: update CML dependencies * fix: update common media request * fix: update resourceTiming properties to use performance.now() * fix: update cmcd data formatting * fix: remove redundant rr values * refactor: simplify cmcd reporting * fix: test mock requests missing parameters * chore: update cml cmcd version * should not send report if events are undefined * fix unit tests --------- Co-authored-by: cotid-qualabs <constanzad@qualabs.com>
* Run npm audit fix * Sort by k attribute in case all parameters like bandwidth etc are the same to avoid oscillating ABR switches * For SegmentSequenceProperties use information about bootstrap representations when ordering * Refactor _getMaxFragmentDurationForLiveDelayCalculation * Fix a typo
…m#4937) * perf(abr): replace Object.keys().forEach with for..in loop Replace nested Object.keys().forEach calls with for..in loops in _onVideoElementResized to avoid array allocations on video resize events. This reduces memory pressure on devices with limited resources like Smart TVs. * perf(net): replace Object.keys().map with for..in loop Replace Object.keys().map() with a for..in loop in _addPathwayCloningParameters to reduce array allocations during HTTP requests with query parameters. This optimization benefits devices with constrained memory like Smart TVs. * perf(events): optimize Object.keys usage in hot paths - Add _isEmptyObject() helper to avoid array allocation for length check - Replace Object.keys() loops with for..in in _iterateAndTriggerCallback - Replace .forEach() with standard for loop for array iteration These functions are called every 100ms during playback, so reducing allocations helps minimize garbage collection on resource-constrained devices like Smart TVs.
…ash-Industry-Forum#4943) Replace hardcoded 100ms GAP_HANDLER_INTERVAL with configurable settings.get().streaming.gaps.checkInterval (default 250ms), replace Object.keys().some() with for..in loop, and cache settings.get().streaming.gaps in _jumpGap to eliminate redundant property traversals. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…mer cleanup (Dash-Industry-Forum#4946) The `1` was incorrectly passed as the `fromIndex` parameter to `indexOf()` instead of as the `deleteCount` parameter to `splice()`. This caused two bugs: 1. `indexOf(timer, 1)` skips index 0, so timers at position 0 are never found 2. `splice(index)` without a second argument removes ALL elements from that index onward, instead of removing just the one timer This results in timer references leaking in the array and valid timers being incorrectly removed, causing memory leaks during long content steering sessions. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…try-Forum#4947) The while loop that removes segments prior to the DVR availability start time did not check if the segments array became empty after each splice. When all segments fall before availabilityStartTime, the array is fully emptied and accessing segments[0] throws a TypeError. Add array length checks both in the loop condition and after the loop before accessing segments[0] for the DVR range update. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…try-Forum#4949) Co-authored-by: Michal Wrobel <michal.wrobel@dolby.com>
…try-Forum#4951) In scalable dual-track mode, newRepresentation.bandwidth contains the combined bandwidth of the base and enhancement layers. However, in the base layer stream processor (type VIDEO), request.bandwidth refers only to the base layer. Therefore, the comparison should use the base layer bandwidth only, i.e. the bandwidth of the dependentRepresentation.
* Fix a nullpointer when trying to access accessibility on the media object * Revert unneccessary change
…#4935) * fix(streaming): add LRU cache limit to InitCache InitCache now enforces a maximum of 50 entries using LRU eviction to prevent unbounded memory growth during multi-period playback or frequent stream switches. Changes: - Add MAX_CACHE_SIZE constant (50 entries) - Implement LRU eviction when cache exceeds limit - Add removeStream() method for explicit cleanup - Track access order for proper LRU behavior This addresses memory accumulation on long-form content with many periods, particularly important for Smart TV devices with limited RAM. Fixes Dash-Industry-Forum#4932 * test(samples): add InitCache LRU test page with 3 test modes - Add getStats() method to InitCache for debugging/testing - Expose getInitCache() in MediaPlayer API - Create comprehensive test page at samples/cache/initcache-test.html Test page includes: 1. Quality Switch Stress Test - cycles through quality levels 2. Stream Switch Stress Test - switches between multiple streams 3. Cache Overflow Test (Synthetic) - directly tests LRU eviction Also includes: - Real-time cache statistics monitoring - Memory profiling instructions for Chrome DevTools - Metrics export functionality Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test(samples): add report generation and comparison to InitCache test - Add test results storage for all 3 test modes - Add generateReport() function with formatted output - Add compareReports() for side-by-side branch comparison - Store reports in localStorage for persistence - Add UI controls for branch name input and report buttons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(review): address PR feedback for InitCache LRU cache - Make cache size configurable via Settings.js (cacheInitSegmentsLimit) - Remove unused removeStream() method - Move test page to samples/performance-tests/ - Fix deprecated v4 API usage (getBitrateInfoListFor -> getRepresentationsByType) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Dash-Industry-Forum#4957) * Allow the preload functionality to work even when the setting cacheInitSegments is false * Amend comment on discharge function * Don't hold outstanding init segment after discharge
* Add warning when AdaptationSet is filtered because of unsupported EssentialProperty * Allow COLOUR_PRIMARIES_SCHEME_ID_URI and MATRIX_COEFFICIENTS_SCHEME_ID_URI with value 9 * Enable filterVideoColorimetryEssentialProperties and filterHDRMetadataFormatEssentialProperties by default * Adjust unit tests according to new config * Remove console.log
* Add a new method getUnfilteredRepresentationsByType * Add a new method getRepresentationsByTypeUnfiltered. This allows applications to get all Representations regardless of any filter settings * Fix wrong JSDoc
* CertUrl support added Co-authored-by: Daniel Silhavy <daniel.silhavy@fokus.fraunhofer.de> Co-authored-by: bjoern altmann <bjoern.altmann@fokus.fraunhofer.de>
* add check for properties in areTracksEqual add some info to logger * making use of feature in utils adding unit tests
* Fix: DVB buffer level always zero if subs disabled * Feat: Provide setting to override DVB reporting URL * Feat: Add maxDrift to reference player, allow it to be negative for disabling * Feat: Add step algorithm to catchup controller * Feat: Add liveThreshold to catchup controller * Fix: Typo "in In" * Update JSDocs for default maxDrift settings * Clarify liveThreshold setting description * Fix: dvb_reportingUrl updated to dvbReportingUrl * Simplify _updateBufferLevel logic
…try-Forum#4934) EventBus: use splice() instead of setting handlers to null on off(). Setting to null left ghost entries in the handlers array, causing it to grow indefinitely over the lifetime of the player. XHRLoader: clear onabort and ontimeout handlers after abort() to prevent stale references from keeping the XHR object in memory. Fixes Dash-Industry-Forum#4933
* Drop CERT_URL_LOWER_CASE constant and use case-insensitive lookup instead * Add Apple FairPlay Streaming (FPS) DRM support * Sort ProtectionConstants.js * Additional refactoring * WiP: Rework certificate logic in ProtectionController.js and work with model classes CertificateRequest.js and CertificateResponse.js. Allow adding filters * Further refactoring of the Fairplay flow * Catch the error in case certificate was invalid * Remove certificate URL for clearkey from reference UI * Change smoke vector config * Rework verify_pull_request.yml workflow * Checkout outside of action.yml * Expose certificate request and response filters * Add example for certificate wrapping * Add Fairplay example * Add API to query protection data * Add missing typescript definitions * Add missing typescript definition for certificate request and response filters --------- Co-authored-by: Torbjörn Einarsson <torbjorn@einarssons.se>
* Claude generated reference UI - First version * Add light mode * Fix DRM errors * Fix controlbar issues * Fix controlbar issues * Fix controlbar issues * Fix quality change * Use settings from Settings.js * Fix playback ended seek bug * Add option to increase playback rate * Add additional color schemes * Enable fast switching * WiP: Commit ID * Make new Reference UI the default one * Add external libraries * Reformatting * Remove unneccessary folder * Sync ref options with settings * Settings changes * Add tooltips to reference UI * Move controlbar to contrib directory * Fix visualization of playback rate * Add framerate to metrics panel * Additional metrics and controlbar changes * Remove outdated contributor entry * Remove custom throughput rule from reference ui * Only rename new ref ui before merge * Add catchup options to referenceUI * Update list of contributors * Add option to set server certificate URLs * Additional changes to controlbar * Fix thumbnail rendering * Add missing fields to be synced from the URL parameters * Add additional unit tests * Add Qualabs as a contributor * Rename current reference UI to "old" and use the new one by default * Reuse images and fix paths * Add link to dashjs.org
* Refactor GitHub actions * Add comments to explain how things are merged
* feat: add CMCD v2 Playwright E2E tests with spec validation Adds comprehensive E2E tests using Playwright to validate CMCD v2 payloads at the network level during real playback. Uses @svta/cml-cmcd validation functions (validateCmcd, validateCmcdHeaders, validateCmcdEvent, validateCmcdKeys) for spec-level compliance checks across query, header, and event modes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: replace Playwright E2E tests with Karma functional tests for CMCD v2 Replace the Playwright-based E2E test suite with Karma functional tests that use XHR interceptors to validate CMCD v2 spec compliance. This eliminates the @playwright/test dependency (~100MB) while maintaining full test coverage across all three transmission modes (query, header, event), key filtering, and version validation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove double parsing from CMCD v2 tests CmcdRequestCollector now stores raw CMCD strings instead of pre-parsed objects, removing its dependency on @svta/cml-cmcd entirely. Tests use validation function return values (result.data) for both spec validation and data assertions in a single pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: update cml packages * fix: add logging to xhr collector * refactor: use unified collector and validateCmcdRequest for CMCD v2 tests Rewrite CmcdRequestCollector with a single requests array storing httpRequest objects compatible with CML's validateCmcdRequest(). Replace mode-specific validators (validateCmcd, validateCmcdHeaders) with the unified validateCmcdRequest() and remove the invalid validateCmcdKeys test that was passing a string to a function expecting a parsed object. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* make track filtering more verbose * add missing methods to JSDoc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This Pull Request introduces comprehensive support for CMCD (Common Media Client Data) Version 2, significantly expanding the player's capabilities for media analytics and client-side data reporting. The changes allow for more granular control over what data is sent, how it's sent, and to where, aligning with the latest CMCD specifications.
Key Features & Enhancements:
CMCD v2 Specification Adherence:
ltc-rc-bg-sta-ttfb-ttlb-ts-url-ec-msd-e-cmsdd-cmsds-df-sn-pb-tpb-bsdNew CMCD Reporting Modes:
event): Enables CMCD data reporting triggered by specific player events (e.g., playback state changes, errors) or at configurable time intervals. This allows for real-time or near real-time feedback on player behavior.ps-e-ts-p-k-r-a-w-e-fresponse): Facilitates CMCD data reporting after a media segment or manifest response is received. This mode includes response-specific metrics like Time To First Byte (ttfb), Time To Last Byte (ttlb), and response code (rc).Multiple Reporting Targets & Granular Configuration:
streaming.cmcd.targetsarray in the player settings. This allows developers to configure multiple CMCD reporting endpoints.url: The destination URL for the CMCD report.mode: The data transmission mode to use for this target (queryorheader).cmcdMode: The reporting mode to use for this target (eventorresponse).enabledKeys: A specific list of CMCD keys to include for this target. If not defined, sends all available keys for the target. If the list is empty, no keys are sent.events(for event mode): An array of player events that should trigger a CMCD report. If events is not defined, all available events trigger a CMCD report. If the array is empty, no event-specific CMCD data will be sent.timeInterval(for event mode): The interval in seconds for periodic CMCD reports. If value is 0, periodic reports are disabled.includeInRequests(for request/response modes): Specifies which types of HTTP requests (e.g.,manifest,mediaSegmentInit,mediaSegment) should include CMCD data for this target.Refined Orchestration of CMCD data via
CmcdController:CmcdControlleris responsible for orchestrating all CMCD v2 data collection, formatting, and reporting.Refined State Management via
CmcdModel:CmcdModelhas been updated to manage and provide the necessary player and media state for all supported CMCD modes and keys, including new v2 parameters.Request/Response Interceptors:
_cmcdRequestModeInterceptorinjects CMCD data into outgoing requests (forqueryandheadermodes)._cmcdResponseModeInterceptorprocesses incoming responses to gather data forresponsemode and triggers reports.New Sample Pages
CMCD v2 Reportingsample page showcases how to set up CMCD v2 and its new target configurations for each new mode.CMCD v2 Callbacks with Network Interceptorssample page introduces a demonstration of using Interceptors to add custom keys as a callback before a report and also processing CMCD data on a callback after the server response.Batching
The CmcdBatchController is a new component designed to efficiently manage and send Common Media Client Data (CMCD) reports. Instead of sending each report as a separate HTTP request, this controller aggregates them into batches, reducing network traffic and server load.
batchTimer): You can configure abatchTimer(in seconds) for a reporting target. When the first report for a target is received, a timer is started. When the timer expires, all collected reports for that target are sent as a single batch.batchSize): You can configure abatchSizefor a reporting target. The controller tracks the number of reports in the current batch. Once the count reaches thebatchSize, the batch is sent immediately, even if thebatchTimerhas not expired.CmcdBatchControllerincludes logic to handle specific HTTP error responsesUnit Testing
Common Media Library Integration
Main Files Affected:
src/streaming/controllers/CmcdController.js: Contains the core logic for CMCD v2, including handling for new modes, multiple targets, key filtering, and integration with the CMCD library.src/streaming/models/CmcdModel.js: Updated to store and manage state for new CMCD v2 parameters and reporting modes.src/core/Settings.js(implied changes): Updated to include new configuration options for CMCD v2, particularly thestreaming.cmcd.targetsarray and CMCD version selection.These changes provide a much more flexible and powerful CMCD implementation, enabling richer analytics and better interoperability with CDNs and other services that consume CMCD data.
Future Work
While the current implementation of CMCD v2 in dash.js provides basic functionality, there are several areas identified for future enhancements and development: