Open
Conversation
Add QOE_AGGREGATE action name and kpi.* attribute constants to NRVideoDefs.h. Add qoeAggregateEnabled, qoeAggregateIntervalMultiplier, and isQoeAggregateEnabled to NRVAVideoConfiguration for controlling QoE event frequency relative to harvest cycles. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce NRQoEAggregator to compute Quality of Experience metrics: - Time-weighted average bitrate and peak bitrate tracking - Rebuffering ratio from connection-type buffer events - Startup time (timeSinceRequested minus pre-roll ad duration) - Startup and playback failure flags Uses a static dispatch table for action routing and @synchronized for thread safety. Reads fully-assembled attributes from the tracker pipeline (no parallel state or direct player API calls). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add qoeEventProvider callback and enqueueFinalQoeEvent to NRVAHarvestManager. QoE events are generated at harvest time (not heartbeat time) and injected directly into the batch array, bypassing the crash-safe buffer. Key design: - Provider block called only when batch contains VideoAction events - Multiplier formula (count-1)%N controls QoE frequency - enqueueFinalQoeEvent accepts pre-built events from sendEnd to avoid race conditions with tracker thread cleanup - pendingFinalQoe takes priority and auto-clears the provider Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
NRVideoTracker changes: - Initialize QoE aggregator when feature is enabled - Snapshot content event attributes in preSendAction for QoE reuse - Register qoeEventProvider block at sendStart (content path) - Build final QoE eagerly at sendEnd and enqueue via enqueueFinalQoeEvent to avoid race with aggregator reset - buildQoeEvent composes attributes from lastContentEventAttributes (filtering timeSince*/bufferType) overlaid with KPI metrics NRVAVideo facade: - Add setQoeEventProvider and enqueueFinalQoeEvent pass-throughs - Add isQoeAggregateEnabled for tracker feature check Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace dead CDN URLs for Sintel and Airshow with working streams: - Sintel -> Apple bipbop HEVC test stream (~30 min adaptive VOD) - Airshow -> Akamai live HLS test stream Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ll others The previous implementation only counted "connection"-type buffers. Android and JS SDKs use a simpler approach: skip the first CONTENT_BUFFER_END (initial buffer) and accumulate all subsequent ones regardless of bufferType. This aligns rebuffering metrics across all three platforms. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…upError/hadPlaybackError Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ering Use explicit bufferType check rather than skipping the first CONTENT_BUFFER_END by position. This is more correct — it skips the actual initial buffer type regardless of event ordering. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Align with Android and JS SDKs which emit unprefixed attribute names (e.g. startupTime, not kpi.startupTime). QOE_PREFIX set to empty string. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… the same viewId as their content Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace blocklist approach with strict whitelist of 19 context attributes carried over from the last content event. Removes 17 attributes not produced by the iOS video core (asn, device, page, etc.). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…d centralized KPI keys Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tegration Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…by session flag Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…on attributes to QoE whitelist Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
47 tests covering NRQoEAggregator KPI computation (startup time, bitrate tracking, rebuffering skip-first logic, error flags, reset) and NRVAHarvestManager QoE integration (multiplier gate, dirty check, pending final QoE priority). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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.
Summary
Introduces a
QOE_AGGREGATEaction underVideoActionthat periodically reports Quality of Experience KPIs during video playback. QoE events are generated at harvest time and injected directly into the harvest batch, independent of the regular event buffer.KPIs Tracked
startupTimeCONTENT_REQUESTtoCONTENT_START, minus pre-roll ad time (wall-clocktotalPreRollAdTime), clamped to >= 0peakBitratecontentBitrateduring the sessionaverageBitratecontentBitrateduring active playback only; non-play time (pause, buffer, seek) is excludedtotalPlaytimetotalRebufferingTimeCONTENT_BUFFER_ENDevents except the first one in the session (initial load), regardless ofbufferTyperebufferingRatio(totalRebufferingTime / totalPlaytime) * 100, recomputed at harvest with real-time totalPlaytimehadStartupErrortrueif aCONTENT_ERRORoccurred beforeCONTENT_STARThadPlaybackErrortrueif aCONTENT_ERRORoccurred afterCONTENT_STARTHow It Works
CONTENT_REQUEST, the tracker registers a QoE provider on the harvest manager — ensuring QoE is sent even ifCONTENT_STARTnever happens (e.g., startup error)totalPlaytimeis computed in real-time at harvest using a read-only peek, avoiding stale values between eventsCONTENT_END, the final QoE event is built eagerly while tracker state is still valid and enqueued for the next harvest, avoiding race conditionstotalPreRollAdTime) instead of ad playtime for accurate startup KPIFixes
viewIdIndexincrement fromsendStarttosendRequestso post-roll ads share the sameviewIdas their contentConfiguration
qoeAggregateEnabledfalseqoeAggregateIntervalMultiplier1