diff --git a/index.d.ts b/index.d.ts index 52b7d2f9b3..299ac02dc4 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1630,7 +1630,6 @@ declare namespace dashjs { applyServiceDescription?: boolean, applyProducerReferenceTime?: boolean, applyContentSteering?: boolean, - eventControllerRefreshDelay?: number, enableManifestDurationMismatchFix?: boolean, parseInbandPrft?: boolean, enableManifestTimescaleMismatchFix?: boolean, @@ -1643,6 +1642,10 @@ declare namespace dashjs { filterHDRMetadataFormatEssentialProperties?: boolean, filterVideoColometryEssentialProperties?: boolean }, + events?: { + eventControllerRefreshDelay?: number, + deleteEventMessageDataAfterEventStarted?: boolean + } timeShiftBuffer?: { calcFromSegmentTimeline?: boolean fallbackToSegmentTimeline?: boolean diff --git a/src/core/Settings.js b/src/core/Settings.js index 1c75759be2..f7ac781481 100644 --- a/src/core/Settings.js +++ b/src/core/Settings.js @@ -67,7 +67,6 @@ import Events from './events/Events.js'; * applyServiceDescription: true, * applyProducerReferenceTime: true, * applyContentSteering: true, - * eventControllerRefreshDelay: 100, * enableManifestDurationMismatchFix: true, * parseInbandPrft: false, * enableManifestTimescaleMismatchFix: false, @@ -86,6 +85,10 @@ import Events from './events/Events.js'; * filterVideoColorimetryEssentialProperties: false, * filterHDRMetadataFormatEssentialProperties: false * }, + * events: { + * eventControllerRefreshDelay: 100, + * deleteEventMessageDataAfterEventStarted: true + * } * timeShiftBuffer: { * calcFromSegmentTimeline: false, * fallbackToSegmentTimeline: true @@ -342,6 +345,16 @@ import Events from './events/Events.js'; * In case the MPD uses \. */ +/** + * @typedef {Object} EventSettings + * @property {number} [eventControllerRefreshDelay=100] + * Interval timer used by the EventController to check if events need to be triggered or removed. + * @property {boolean} [deleteEventMessageDataAfterEventStarted=true] + * If this flag is enabled the EventController will delete the message data of events after they have been started. This is to save memory in case events have a long duration and need to be persisted in the EventController. + * Note: Applications will receive a copy of the original event data when they subscribe to an event. This copy contains the original message data and is not affected by this setting. + * Only if an event is dispatched for the second time (e.g. when the user seeks back) the message data will not be included in the dispatched event. + */ + /** * @typedef {Object} LiveDelay * @property {number} [liveDelayFragmentCount=NaN] @@ -937,8 +950,6 @@ import Events from './events/Events.js'; * Set to true if dash.js should use the parameters defined in ProducerReferenceTime elements in combination with ServiceDescription elements. * @property {boolean} [applyContentSteering=true] * Set to true if dash.js should apply content steering during playback. - * @property {number} [eventControllerRefreshDelay=100] - * For multi-period streams, overwrite the manifest mediaPresentationDuration attribute with the sum of period durations if the manifest mediaPresentationDuration is greater than the sum of period durations * @property {boolean} [enableManifestDurationMismatchFix=true] * Overwrite the manifest segments base information timescale attributes with the timescale set in initialization segments * @property {boolean} [enableManifestTimescaleMismatchFix=false] @@ -947,6 +958,7 @@ import Events from './events/Events.js'; * Set to true if dash.js should parse inband prft boxes (ProducerReferenceTime) and trigger events. * @property {module:Settings~Metrics} metrics Metric settings * @property {module:Settings~LiveDelay} delay Live Delay settings + * @property {module:Settings~EventSettings} events Event settings * @property {module:Settings~TimeShiftBuffer} timeShiftBuffer TimeShiftBuffer settings * @property {module:Settings~Protection} protection DRM related settings * @property {module:Settings~Capabilities} capabilities Capability related settings @@ -1078,7 +1090,6 @@ function Settings() { applyServiceDescription: true, applyProducerReferenceTime: true, applyContentSteering: true, - eventControllerRefreshDelay: 100, enableManifestDurationMismatchFix: true, parseInbandPrft: false, enableManifestTimescaleMismatchFix: false, @@ -1099,6 +1110,10 @@ function Settings() { filterVideoColorimetryEssentialProperties: false, filterHDRMetadataFormatEssentialProperties: false }, + events: { + eventControllerRefreshDelay: 100, + deleteEventMessageDataAfterEventStarted: true + }, timeShiftBuffer: { calcFromSegmentTimeline: false, fallbackToSegmentTimeline: true diff --git a/src/streaming/controllers/EventController.js b/src/streaming/controllers/EventController.js index 837bcabf2e..01864a9121 100644 --- a/src/streaming/controllers/EventController.js +++ b/src/streaming/controllers/EventController.js @@ -118,7 +118,7 @@ function EventController() { try { checkConfig(); logger.debug('Start Event Controller'); - const refreshDelay = settings.get().streaming.eventControllerRefreshDelay; + const refreshDelay = settings.get().streaming.events.eventControllerRefreshDelay; if (!isStarted && !isNaN(refreshDelay)) { isStarted = true; eventInterval = setInterval(_onEventTimer, refreshDelay); @@ -474,7 +474,7 @@ function EventController() { if (mode === MediaPlayerEvents.EVENT_MODE_ON_RECEIVE && !event.triggeredReceivedEvent) { logger.debug(`Received event ${eventId}`); event.triggeredReceivedEvent = true; - eventBus.trigger(event.eventStream.schemeIdUri, { event: event }, { mode }); + eventBus.trigger(event.eventStream.schemeIdUri, { event: JSON.parse(JSON.stringify(event)) }, { mode }); return; } @@ -490,7 +490,11 @@ function EventController() { _sendCallbackRequest(event.messageData); } else { logger.debug(`Starting event ${eventId} from period ${event.eventStream.period.id} at ${currentVideoTime}`); - eventBus.trigger(event.eventStream.schemeIdUri, { event: event }, { mode }); + eventBus.trigger(event.eventStream.schemeIdUri, { event: JSON.parse(JSON.stringify(event)) }, { mode }); + if (settings.get().streaming.events.deleteEventMessageDataAfterEventStarted) { + delete event.messageData; + delete event.parsedMessageData; + } } event.triggeredStartEvent = true; }