From fc528ebed7d774751d8d59fc5d96e962b72f7ff6 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 1 Feb 2022 14:25:04 +0000 Subject: [PATCH] Avoid creating empty playback metrics In some cases we create empty playback metrics with no corresponding events (e.g. when an app seeks to a new media item and immediately releases the player). There is no benefit in having completely empty metrics entries, so it's cleaner to not report them in such cases. #minor-release PiperOrigin-RevId: 425609010 --- .../analytics/MediaMetricsListener.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java index e42a751a34..cc4780b0de 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java @@ -134,6 +134,7 @@ public final class MediaMetricsListener private int droppedFrames; private int playedFrames; private int audioUnderruns; + private boolean reportedEventsForCurrentSession; /** * Creates the listener. @@ -359,6 +360,7 @@ public final class MediaMetricsListener .setSubErrorCode(errorInfo.subErrorCode) .setException(error) .build()); + reportedEventsForCurrentSession = true; pendingPlayerError = null; } @@ -429,6 +431,7 @@ public final class MediaMetricsListener int newPlaybackState = resolveNewPlaybackState(player); if (currentPlaybackState != newPlaybackState) { currentPlaybackState = newPlaybackState; + reportedEventsForCurrentSession = true; playbackSession.reportPlaybackStateEvent( new PlaybackStateEvent.Builder() .setState(currentPlaybackState) @@ -561,6 +564,7 @@ public final class MediaMetricsListener } else { builder.setTrackState(TrackChangeEvent.TRACK_STATE_OFF); } + reportedEventsForCurrentSession = true; playbackSession.reportTrackChangeEvent(builder.build()); } @@ -586,26 +590,26 @@ public final class MediaMetricsListener } metricsBuilder.setPlaybackType( window.isLive() ? PlaybackMetrics.PLAYBACK_TYPE_LIVE : PlaybackMetrics.PLAYBACK_TYPE_VOD); + reportedEventsForCurrentSession = true; } private void finishCurrentSession() { - if (metricsBuilder == null) { - return; + if (metricsBuilder != null && reportedEventsForCurrentSession) { + metricsBuilder.setAudioUnderrunCount(audioUnderruns); + metricsBuilder.setVideoFramesDropped(droppedFrames); + metricsBuilder.setVideoFramesPlayed(playedFrames); + @Nullable Long networkTimeMs = bandwidthTimeMs.get(activeSessionId); + metricsBuilder.setNetworkTransferDurationMillis(networkTimeMs == null ? 0 : networkTimeMs); + // TODO(b/181121847): Report localBytesRead. This requires additional callbacks or plumbing. + @Nullable Long networkBytes = bandwidthBytes.get(activeSessionId); + metricsBuilder.setNetworkBytesRead(networkBytes == null ? 0 : networkBytes); + // TODO(b/181121847): Detect stream sources mixed and local depending on localBytesRead. + metricsBuilder.setStreamSource( + networkBytes != null && networkBytes > 0 + ? PlaybackMetrics.STREAM_SOURCE_NETWORK + : PlaybackMetrics.STREAM_SOURCE_UNKNOWN); + playbackSession.reportPlaybackMetrics(metricsBuilder.build()); } - metricsBuilder.setAudioUnderrunCount(audioUnderruns); - metricsBuilder.setVideoFramesDropped(droppedFrames); - metricsBuilder.setVideoFramesPlayed(playedFrames); - @Nullable Long networkTimeMs = bandwidthTimeMs.get(activeSessionId); - metricsBuilder.setNetworkTransferDurationMillis(networkTimeMs == null ? 0 : networkTimeMs); - // TODO(b/181121847): Report localBytesRead. This requires additional callbacks or plumbing. - @Nullable Long networkBytes = bandwidthBytes.get(activeSessionId); - metricsBuilder.setNetworkBytesRead(networkBytes == null ? 0 : networkBytes); - // TODO(b/181121847): Detect stream sources mixed and local depending on localBytesRead. - metricsBuilder.setStreamSource( - networkBytes != null && networkBytes > 0 - ? PlaybackMetrics.STREAM_SOURCE_NETWORK - : PlaybackMetrics.STREAM_SOURCE_UNKNOWN); - playbackSession.reportPlaybackMetrics(metricsBuilder.build()); metricsBuilder = null; activeSessionId = null; audioUnderruns = 0; @@ -614,6 +618,7 @@ public final class MediaMetricsListener currentVideoFormat = null; currentAudioFormat = null; currentTextFormat = null; + reportedEventsForCurrentSession = false; } private static int getTrackChangeReason(@C.SelectionReason int trackSelectionReason) {