diff --git a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 91330e7be7..683db1ecbc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -15,9 +15,11 @@ */ package com.google.android.exoplayer2; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static java.lang.Math.max; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer.InsufficientCapacityException; import com.google.android.exoplayer2.source.SampleStream; @@ -26,6 +28,7 @@ import com.google.android.exoplayer2.source.SampleStream.ReadFlags; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MediaClock; import java.io.IOException; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** An abstract base class suitable for most {@link Renderer} implementations. */ public abstract class BaseRenderer implements Renderer, RendererCapabilities { @@ -35,6 +38,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { @Nullable private RendererConfiguration configuration; private int index; + private @MonotonicNonNull PlayerId playerId; private int state; @Nullable private SampleStream stream; @Nullable private Format[] streamFormats; @@ -65,8 +69,9 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { } @Override - public final void setIndex(int index) { + public final void init(int index, PlayerId playerId) { this.index = index; + this.playerId = playerId; } @Override @@ -328,11 +333,24 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { return Assertions.checkNotNull(configuration); } - /** Returns the index of the renderer within the player. */ + /** + * Returns the index of the renderer within the player. + * + *

Must only be used after the renderer has been initialized by the player. + */ protected final int getIndex() { return index; } + /** + * Returns the {@link PlayerId} of the player using this renderer. + * + *

Must only be used after the renderer has been initialized by the player. + */ + protected final PlayerId getPlayerId() { + return checkNotNull(playerId); + } + /** * Creates an {@link ExoPlaybackException} of type {@link ExoPlaybackException#TYPE_RENDERER} for * this renderer. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 61a1d41b82..f3043f9d1a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -22,6 +22,7 @@ import static java.lang.Math.max; import static java.lang.Math.min; import android.annotation.SuppressLint; +import android.media.metrics.LogSessionId; import android.os.Handler; import android.os.Looper; import android.util.Pair; @@ -30,9 +31,11 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.TextureView; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener; import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.MediaSource; @@ -246,6 +249,7 @@ import java.util.concurrent.CopyOnWriteArraySet; addListener(analyticsCollector); bandwidthMeter.addEventListener(new Handler(applicationLooper), analyticsCollector); } + PlayerId playerId = Util.SDK_INT < 31 ? new PlayerId() : Api31.createPlayerId(); internalPlayer = new ExoPlayerImplInternal( renderers, @@ -262,7 +266,8 @@ import java.util.concurrent.CopyOnWriteArraySet; pauseAtEndOfMediaItems, applicationLooper, clock, - playbackInfoUpdateListener); + playbackInfoUpdateListener, + playerId); } /** @@ -1856,4 +1861,14 @@ import java.util.concurrent.CopyOnWriteArraySet; return timeline; } } + + @RequiresApi(31) + private static final class Api31 { + private Api31() {} + + public static PlayerId createPlayerId() { + // TODO: Create a MediaMetricsListener and obtain LogSessionId from it. + return new PlayerId(LogSessionId.LOG_SESSION_ID_NONE); + } + } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index d6f1e1f73a..6c766045ea 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.Player.PlayWhenReadyChangeReason; import com.google.android.exoplayer2.Player.PlaybackSuppressionReason; import com.google.android.exoplayer2.Player.RepeatMode; import com.google.android.exoplayer2.analytics.AnalyticsCollector; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.BehindLiveWindowException; @@ -229,7 +230,8 @@ import java.util.concurrent.atomic.AtomicBoolean; boolean pauseAtEndOfWindow, Looper applicationLooper, Clock clock, - PlaybackInfoUpdateListener playbackInfoUpdateListener) { + PlaybackInfoUpdateListener playbackInfoUpdateListener, + PlayerId playerId) { this.playbackInfoUpdateListener = playbackInfoUpdateListener; this.renderers = renderers; this.trackSelector = trackSelector; @@ -252,7 +254,7 @@ import java.util.concurrent.atomic.AtomicBoolean; playbackInfoUpdate = new PlaybackInfoUpdate(playbackInfo); rendererCapabilities = new RendererCapabilities[renderers.length]; for (int i = 0; i < renderers.length; i++) { - renderers[i].setIndex(i); + renderers[i].init(/* index= */ i, playerId); rendererCapabilities[i] = renderers[i].getCapabilities(); } mediaClock = new DefaultMediaClock(this, clock); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java index 0038b9ab8f..9be14c71b1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MediaClock; @@ -45,7 +46,7 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities } @Override - public final void setIndex(int index) { + public final void init(int index, PlayerId playerId) { this.index = index; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java index b7b8f6bb3c..efefe4c61c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -20,6 +20,7 @@ import android.view.Surface; import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.PlayerMessage.Target; +import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.source.SampleStream; @@ -248,11 +249,12 @@ public interface Renderer extends PlayerMessage.Target { RendererCapabilities getCapabilities(); /** - * Sets the index of this renderer within the player. + * Initializes the renderer for playback with a player. * - * @param index The renderer index. + * @param index The renderer index within the player. + * @param playerId The {@link PlayerId} of the player. */ - void setIndex(int index); + void init(int index, PlayerId playerId); /** * If the renderer advances its own playback position then this method returns a corresponding