diff --git a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java index 1f10cd2c59..531c1a96c9 100644 --- a/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java +++ b/demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/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/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index eaff9a185a..0d05d9b71b 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/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/docs/debug-logging.md b/docs/debug-logging.md index c7d5a652ea..b93f03b9ff 100644 --- a/docs/debug-logging.md +++ b/docs/debug-logging.md @@ -9,13 +9,10 @@ issues. `EventLogger` implements `AnalyticsListener`, so registering an instance with an `ExoPlayer` is easy: ``` -player.addAnalyticsListener(new EventLogger(trackSelector)); +player.addAnalyticsListener(new EventLogger()); ``` {: .language-java} -Passing the `trackSelector` enables additional logging, but is optional and so -`null` can be passed instead. - The easiest way to observe the log is using Android Studio's [logcat tab][]. You can select your app as debuggable process by the package name ( `com.google.android.exoplayer2.demo` if using the demo app) and tell the logcat @@ -80,20 +77,16 @@ logging for an adaptive stream: ``` EventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0, -EventLogger: MediaCodecVideoRenderer [ -EventLogger: Group:0, adaptive_supported=YES [ -EventLogger: [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES -EventLogger: [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES -EventLogger: [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES -EventLogger: [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES -EventLogger: [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES -EventLogger: ] +EventLogger: group [ +EventLogger: [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES +EventLogger: [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES +EventLogger: [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES +EventLogger: [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES +EventLogger: [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES EventLogger: ] -EventLogger: MediaCodecAudioRenderer [ -EventLogger: Group:0, adaptive_supported=YES_NOT_SEAMLESS [ -EventLogger: [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES -EventLogger: [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES -EventLogger: ] +EventLogger: group [ +EventLogger: [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES +EventLogger: [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES EventLogger: ] EventLogger: ] ``` diff --git a/docs/listening-to-player-events.md b/docs/listening-to-player-events.md index e3918dd942..d46bb9fc91 100644 --- a/docs/listening-to-player-events.md +++ b/docs/listening-to-player-events.md @@ -193,12 +193,11 @@ logging purposes. It can be added to an `ExoPlayer` to enable useful additional logging with a single line. ``` -player.addAnalyticsListener(new EventLogger(trackSelector)); +player.addAnalyticsListener(new EventLogger()); ``` {: .language-java } -Passing the `trackSelector` enables additional logging, but is optional and so -`null` can be passed instead. See the [debug logging page][] for more details. +See the [debug logging page][] for more details. ## Firing events at specified playback positions ## diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 00eb88cb80..fe07ddcdbe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -15,11 +15,6 @@ */ package com.google.android.exoplayer2.util; -import static com.google.android.exoplayer2.RendererCapabilities.DECODER_SUPPORT_FALLBACK; -import static com.google.android.exoplayer2.RendererCapabilities.HARDWARE_ACCELERATION_SUPPORTED; -import static com.google.android.exoplayer2.RendererCapabilities.getDecoderSupport; -import static com.google.android.exoplayer2.RendererCapabilities.getFormatSupport; -import static com.google.android.exoplayer2.RendererCapabilities.getHardwareAccelerationSupport; import static com.google.android.exoplayer2.util.Util.getFormatSupportString; import static java.lang.Math.min; @@ -33,10 +28,8 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.PlaybackSuppressionReason; -import com.google.android.exoplayer2.RendererCapabilities; -import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport; -import com.google.android.exoplayer2.RendererCapabilities.Capabilities; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.decoder.DecoderCounters; @@ -46,12 +39,9 @@ import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.TrackGroup; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; -import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.video.VideoSize; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.text.NumberFormat; import java.util.Locale; @@ -71,37 +61,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 @@ -255,97 +259,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("]"); } @@ -650,33 +604,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/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java index 3e303f047a..8cb7938816 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java @@ -136,7 +136,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);