diff --git a/demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java b/demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java index bc26c037e2..9a4e5c5dc3 100644 --- a/demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java +++ b/demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java @@ -181,7 +181,7 @@ public final class MainActivity extends Activity { Assertions.checkNotNull(this.videoProcessingGLSurfaceView); videoProcessingGLSurfaceView.setPlayer(player); Assertions.checkNotNull(playerView).setPlayer(player); - player.addAnalyticsListener(new EventLogger(/* trackSelector= */ null)); + player.addAnalyticsListener(new EventLogger()); this.player = player; } diff --git a/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java b/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java index 59e65eb7b9..fb93c46238 100644 --- a/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java +++ b/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java @@ -276,7 +276,7 @@ public class PlayerActivity extends AppCompatActivity .build(); player.setTrackSelectionParameters(trackSelectionParameters); player.addListener(new PlayerEventListener()); - player.addAnalyticsListener(new EventLogger(trackSelector)); + player.addAnalyticsListener(new EventLogger()); player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true); player.setPlayWhenReady(startAutoPlay); playerView.setPlayer(player); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java index 197370a1b4..6999c90005 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java @@ -16,11 +16,6 @@ package androidx.media3.exoplayer.util; import static androidx.media3.common.util.Util.getFormatSupportString; -import static androidx.media3.exoplayer.RendererCapabilities.DECODER_SUPPORT_FALLBACK; -import static androidx.media3.exoplayer.RendererCapabilities.HARDWARE_ACCELERATION_SUPPORTED; -import static androidx.media3.exoplayer.RendererCapabilities.getDecoderSupport; -import static androidx.media3.exoplayer.RendererCapabilities.getFormatSupport; -import static androidx.media3.exoplayer.RendererCapabilities.getHardwareAccelerationSupport; import static java.lang.Math.min; import android.os.SystemClock; @@ -37,23 +32,18 @@ import androidx.media3.common.Player; import androidx.media3.common.Player.PlaybackSuppressionReason; import androidx.media3.common.Timeline; import androidx.media3.common.TrackGroup; -import androidx.media3.common.TrackGroupArray; -import androidx.media3.common.TrackSelection; -import androidx.media3.common.TrackSelectionArray; +import androidx.media3.common.TracksInfo; import androidx.media3.common.VideoSize; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.DecoderCounters; import androidx.media3.exoplayer.DecoderReuseEvaluation; -import androidx.media3.exoplayer.RendererCapabilities; -import androidx.media3.exoplayer.RendererCapabilities.AdaptiveSupport; -import androidx.media3.exoplayer.RendererCapabilities.Capabilities; import androidx.media3.exoplayer.analytics.AnalyticsListener; import androidx.media3.exoplayer.drm.DrmSession; import androidx.media3.exoplayer.source.LoadEventInfo; import androidx.media3.exoplayer.source.MediaLoadData; import androidx.media3.exoplayer.trackselection.MappingTrackSelector; -import androidx.media3.exoplayer.trackselection.MappingTrackSelector.MappedTrackInfo; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.text.NumberFormat; import java.util.Locale; @@ -74,37 +64,51 @@ public class EventLogger implements AnalyticsListener { TIME_FORMAT.setGroupingUsed(false); } - @Nullable private final MappingTrackSelector trackSelector; private final String tag; private final Timeline.Window window; private final Timeline.Period period; private final long startTimeMs; - /** - * Creates event logger. - * - * @param trackSelector The mapping track selector used by the player. May be null if detailed - * logging of track mapping is not required. - */ - public EventLogger(@Nullable MappingTrackSelector trackSelector) { - this(trackSelector, DEFAULT_TAG); + /** Creates an instance. */ + public EventLogger() { + this(DEFAULT_TAG); } /** - * Creates event logger. + * Creates an instance. * - * @param trackSelector The mapping track selector used by the player. May be null if detailed - * logging of track mapping is not required. * @param tag The tag used for logging. */ - public EventLogger(@Nullable MappingTrackSelector trackSelector, String tag) { - this.trackSelector = trackSelector; + public EventLogger(String tag) { this.tag = tag; window = new Timeline.Window(); period = new Timeline.Period(); startTimeMs = SystemClock.elapsedRealtime(); } + /** + * Creates an instance. + * + * @param trackSelector This parameter is ignored. + * @deprecated Use {@link EventLogger()} + */ + @Deprecated + public EventLogger(@Nullable MappingTrackSelector trackSelector) { + this(DEFAULT_TAG); + } + + /** + * Creates an instance. + * + * @param trackSelector This parameter is ignored. + * @param tag The tag used for logging. + * @deprecated Use {@link EventLogger(String)} + */ + @Deprecated + public EventLogger(@Nullable MappingTrackSelector trackSelector, String tag) { + this(tag); + } + // AnalyticsListener @Override @@ -258,97 +262,47 @@ public class EventLogger implements AnalyticsListener { } @Override - public void onTracksChanged( - EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - MappedTrackInfo mappedTrackInfo = - trackSelector != null ? trackSelector.getCurrentMappedTrackInfo() : null; - if (mappedTrackInfo == null) { - logd(eventTime, "tracks", "[]"); - return; - } + public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) { logd("tracks [" + getEventTimeString(eventTime)); // Log tracks associated to renderers. - int rendererCount = mappedTrackInfo.getRendererCount(); - for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { - TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(rendererIndex); - TrackSelection trackSelection = trackSelections.get(rendererIndex); - if (rendererTrackGroups.length == 0) { - logd(" " + mappedTrackInfo.getRendererName(rendererIndex) + " []"); - } else { - logd(" " + mappedTrackInfo.getRendererName(rendererIndex) + " ["); - for (int groupIndex = 0; groupIndex < rendererTrackGroups.length; groupIndex++) { - TrackGroup trackGroup = rendererTrackGroups.get(groupIndex); - String adaptiveSupport = - getAdaptiveSupportString( - trackGroup.length, - mappedTrackInfo.getAdaptiveSupport( - rendererIndex, groupIndex, /* includeCapabilitiesExceededTracks= */ false)); - logd(" Group:" + trackGroup.id + ", adaptive_supported=" + adaptiveSupport + " ["); - for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { - String status = getTrackStatusString(trackSelection, trackGroup, trackIndex); - @Capabilities - int capabilities = - mappedTrackInfo.getCapabilities(rendererIndex, groupIndex, trackIndex); - String formatSupport = getFormatSupportString(getFormatSupport(capabilities)); - String hardwareAccelerationSupport = - getHardwareAccelerationSupport(capabilities) == HARDWARE_ACCELERATION_SUPPORTED - ? ", accelerated=YES" - : ""; - String decoderSupport = - getDecoderSupport(capabilities) == DECODER_SUPPORT_FALLBACK ? ", fallback=YES" : ""; - logd( - " " - + status - + " Track:" - + trackIndex - + ", " - + Format.toLogString(trackGroup.getFormat(trackIndex)) - + ", supported=" - + formatSupport - + hardwareAccelerationSupport - + decoderSupport); - } - logd(" ]"); - } - // Log metadata for at most one of the tracks selected for the renderer. - if (trackSelection != null) { - for (int selectionIndex = 0; selectionIndex < trackSelection.length(); selectionIndex++) { - Metadata metadata = trackSelection.getFormat(selectionIndex).metadata; - if (metadata != null) { - logd(" Metadata ["); - printMetadata(metadata, " "); - logd(" ]"); - break; - } - } - } - logd(" ]"); - } - } - // Log tracks not associated with a renderer. - TrackGroupArray unassociatedTrackGroups = mappedTrackInfo.getUnmappedTrackGroups(); - if (unassociatedTrackGroups.length > 0) { - logd(" Unmapped ["); - for (int groupIndex = 0; groupIndex < unassociatedTrackGroups.length; groupIndex++) { - logd(" Group:" + groupIndex + " ["); - TrackGroup trackGroup = unassociatedTrackGroups.get(groupIndex); - for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { - String status = getTrackStatusString(false); - String formatSupport = getFormatSupportString(C.FORMAT_UNSUPPORTED_TYPE); - logd( - " " - + status - + " Track:" - + trackIndex - + ", " - + Format.toLogString(trackGroup.getFormat(trackIndex)) - + ", supported=" - + formatSupport); - } - logd(" ]"); + ImmutableList trackGroupInfos = tracksInfo.getTrackGroupInfos(); + for (int groupIndex = 0; groupIndex < trackGroupInfos.size(); groupIndex++) { + TracksInfo.TrackGroupInfo trackGroupInfo = trackGroupInfos.get(groupIndex); + TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); + logd(" group ["); + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + String status = getTrackStatusString(trackGroupInfo.isTrackSelected(trackIndex)); + String formatSupport = getFormatSupportString(trackGroupInfo.getTrackSupport(trackIndex)); + logd( + " " + + status + + " Track:" + + trackIndex + + ", " + + Format.toLogString(trackGroup.getFormat(trackIndex)) + + ", supported=" + + formatSupport); } logd(" ]"); } + // TODO: Replace this with an override of onMediaMetadataChanged. + // Log metadata for at most one of the selected tracks. + for (int groupIndex = 0; groupIndex < trackGroupInfos.size(); groupIndex++) { + TracksInfo.TrackGroupInfo trackGroupInfo = trackGroupInfos.get(groupIndex); + TrackGroup trackGroup = trackGroupInfo.getTrackGroup(); + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + if (!trackGroupInfo.isTrackSelected(trackIndex)) { + continue; + } + @Nullable Metadata metadata = trackGroup.getFormat(trackIndex).metadata; + if (metadata != null) { + logd(" Metadata ["); + printMetadata(metadata, " "); + logd(" ]"); + break; + } + } + } logd("]"); } @@ -653,33 +607,8 @@ public class EventLogger implements AnalyticsListener { } } - private static String getAdaptiveSupportString( - int trackCount, @AdaptiveSupport int adaptiveSupport) { - if (trackCount < 2) { - return "N/A"; - } - switch (adaptiveSupport) { - case RendererCapabilities.ADAPTIVE_SEAMLESS: - return "YES"; - case RendererCapabilities.ADAPTIVE_NOT_SEAMLESS: - return "YES_NOT_SEAMLESS"; - case RendererCapabilities.ADAPTIVE_NOT_SUPPORTED: - return "NO"; - default: - throw new IllegalStateException(); - } - } - - private static String getTrackStatusString( - @Nullable TrackSelection selection, TrackGroup group, int trackIndex) { - return getTrackStatusString( - selection != null - && selection.getTrackGroup().equals(group) - && selection.indexOf(trackIndex) != C.INDEX_UNSET); - } - - private static String getTrackStatusString(boolean enabled) { - return enabled ? "[X]" : "[ ]"; + private static String getTrackStatusString(boolean selected) { + return selected ? "[X]" : "[ ]"; } private static String getRepeatModeString(@Player.RepeatMode int repeatMode) { diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java index b375184a77..5c44ffb8b8 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java @@ -138,7 +138,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest { player = buildExoPlayer(host, surface, trackSelector); player.play(); player.addAnalyticsListener(this); - player.addAnalyticsListener(new EventLogger(trackSelector, tag)); + player.addAnalyticsListener(new EventLogger(tag)); // Schedule any pending actions. actionHandler = Clock.DEFAULT.createHandler(Util.getCurrentOrMainLooper(), /* callback= */ null);