Use AnalyticsListener in EventLogger.

This replaces the existing listeners and provides some additional meta data
for each event.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=194770421
This commit is contained in:
tonihei 2018-04-30 04:54:11 -07:00 committed by Oliver Woodman
parent c0fdbde903
commit d1fdc518fb
2 changed files with 232 additions and 204 deletions

View File

@ -406,17 +406,8 @@ public class PlayerActivity extends Activity
player = player =
ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager); ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager);
player.addListener(new PlayerEventListener()); player.addListener(new PlayerEventListener());
EventLogger eventLogger = new EventLogger(trackSelector);
player.addListener(eventLogger);
player.addMetadataOutput(eventLogger);
player.addAudioDebugListener(eventLogger);
player.addVideoDebugListener(eventLogger);
if (drmSessionManager != null) {
drmSessionManager.addListener(mainHandler, eventLogger);
}
player.setPlayWhenReady(startAutoPlay); player.setPlayWhenReady(startAutoPlay);
player.addAnalyticsListener(new EventLogger(trackSelector));
playerView.setPlayer(player); playerView.setPlayer(player);
playerView.setPlaybackPreparer(this); playerView.setPlaybackPreparer(this);
debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper = new DebugTextViewHelper(player, debugTextView);
@ -437,8 +428,7 @@ public class PlayerActivity extends Activity
releaseAdsLoader(); releaseAdsLoader();
loadedAdTagUri = adTagUri; loadedAdTagUri = adTagUri;
} }
MediaSource adsMediaSource = MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString));
createAdsMediaSource(mediaSource, Uri.parse(adTagUriString), eventLogger);
if (adsMediaSource != null) { if (adsMediaSource != null) {
mediaSource = adsMediaSource; mediaSource = adsMediaSource;
} else { } else {
@ -447,7 +437,6 @@ public class PlayerActivity extends Activity
} else { } else {
releaseAdsLoader(); releaseAdsLoader();
} }
mediaSource.addEventListener(mainHandler, eventLogger);
} }
boolean haveStartPosition = startWindow != C.INDEX_UNSET; boolean haveStartPosition = startWindow != C.INDEX_UNSET;
if (haveStartPosition) { if (haveStartPosition) {
@ -508,10 +497,8 @@ public class PlayerActivity extends Activity
keyRequestPropertiesArray[i + 1]); keyRequestPropertiesArray[i + 1]);
} }
} }
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager = return new DefaultDrmSessionManager<>(
new DefaultDrmSessionManager<>(
uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession); uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession);
return drmSessionManager;
} }
private void releasePlayer() { private void releasePlayer() {
@ -572,8 +559,7 @@ public class PlayerActivity extends Activity
} }
/** Returns an ads media source, reusing the ads loader if one exists. */ /** Returns an ads media source, reusing the ads loader if one exists. */
private @Nullable MediaSource createAdsMediaSource( private @Nullable MediaSource createAdsMediaSource(MediaSource mediaSource, Uri adTagUri) {
MediaSource mediaSource, Uri adTagUri, EventLogger eventLogger) {
// Load the extension source using reflection so the demo app doesn't have to depend on it. // Load the extension source using reflection so the demo app doesn't have to depend on it.
// The ads loader is reused for multiple playbacks, so that ad playback can resume. // The ads loader is reused for multiple playbacks, so that ad playback can resume.
try { try {
@ -604,7 +590,12 @@ public class PlayerActivity extends Activity
} }
}; };
return new AdsMediaSource( return new AdsMediaSource(
mediaSource, adMediaSourceFactory, adsLoader, adUiViewGroup, mainHandler, eventLogger); mediaSource,
adMediaSourceFactory,
adsLoader,
adUiViewGroup,
mainHandler,
player.getAnalyticsCollector());
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// IMA extension not loaded. // IMA extension not loaded.
return null; return null;

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.util; package com.google.android.exoplayer2.util;
import android.net.NetworkInfo;
import android.os.SystemClock; import android.os.SystemClock;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.util.Log; import android.util.Log;
@ -26,34 +27,23 @@ import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DefaultDrmSessionEventListener;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.MediaSourceEventListener.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSourceEventListener.MediaLoadData;
import com.google.android.exoplayer2.source.MediaSourceEventListener;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.video.VideoRendererEventListener;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.Locale; import java.util.Locale;
/** Logs events from {@link Player} and other core components using {@link Log}. */ /** Logs events from {@link Player} and other core components using {@link Log}. */
public class EventLogger public class EventLogger implements AnalyticsListener {
implements Player.EventListener,
MetadataOutput,
AudioRendererEventListener,
VideoRendererEventListener,
MediaSourceEventListener,
AdsMediaSource.EventListener,
DefaultDrmSessionEventListener {
private static final String TAG = "EventLogger"; private static final String TAG = "EventLogger";
private static final int MAX_TIMELINE_ITEM_LINES = 3; private static final int MAX_TIMELINE_ITEM_LINES = 3;
@ -65,81 +55,89 @@ public class EventLogger
TIME_FORMAT.setGroupingUsed(false); TIME_FORMAT.setGroupingUsed(false);
} }
private final MappingTrackSelector trackSelector; private final @Nullable MappingTrackSelector trackSelector;
private final Timeline.Window window; private final Timeline.Window window;
private final Timeline.Period period; private final Timeline.Period period;
private final long startTimeMs; private final long startTimeMs;
public EventLogger(MappingTrackSelector trackSelector) { /**
* 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 = trackSelector; this.trackSelector = trackSelector;
window = new Timeline.Window(); window = new Timeline.Window();
period = new Timeline.Period(); period = new Timeline.Period();
startTimeMs = SystemClock.elapsedRealtime(); startTimeMs = SystemClock.elapsedRealtime();
} }
// Player.EventListener // AnalyticsListener
@Override @Override
public void onLoadingChanged(boolean isLoading) { public void onLoadingChanged(EventTime eventTime, boolean isLoading) {
logd("loading [" + isLoading + "]"); logd(eventTime, "loading", Boolean.toString(isLoading));
} }
@Override @Override
public void onPlayerStateChanged(boolean playWhenReady, int state) { public void onPlayerStateChanged(EventTime eventTime, boolean playWhenReady, int state) {
logd( logd(eventTime, "state", playWhenReady + ", " + getStateString(state));
"state [" }
+ getSessionTimeString()
+ ", " @Override
+ playWhenReady public void onRepeatModeChanged(EventTime eventTime, @Player.RepeatMode int repeatMode) {
+ ", " logd(eventTime, "repeatMode", getRepeatModeString(repeatMode));
+ getStateString(state) }
+ "]");
} @Override
public void onShuffleModeChanged(EventTime eventTime, boolean shuffleModeEnabled) {
@Override logd(eventTime, "shuffleModeEnabled", Boolean.toString(shuffleModeEnabled));
public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) { }
logd("repeatMode [" + getRepeatModeString(repeatMode) + "]");
} @Override
public void onPositionDiscontinuity(EventTime eventTime, @Player.DiscontinuityReason int reason) {
@Override logd(eventTime, "positionDiscontinuity", getDiscontinuityReasonString(reason));
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { }
logd("shuffleModeEnabled [" + shuffleModeEnabled + "]");
} @Override
public void onSeekStarted(EventTime eventTime) {
@Override logd(eventTime, "seekStarted");
public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) { }
logd("positionDiscontinuity [" + getDiscontinuityReasonString(reason) + "]");
} @Override
public void onPlaybackParametersChanged(
@Override EventTime eventTime, PlaybackParameters playbackParameters) {
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
logd( logd(
eventTime,
"playbackParameters",
Util.formatInvariant( Util.formatInvariant(
"playbackParameters [speed=%.2f, pitch=%.2f, skipSilence=%s]", "speed=%.2f, pitch=%.2f, skipSilence=%s",
playbackParameters.speed, playbackParameters.pitch, playbackParameters.skipSilence)); playbackParameters.speed, playbackParameters.pitch, playbackParameters.skipSilence));
} }
@Override @Override
public void onTimelineChanged( public void onTimelineChanged(EventTime eventTime, @Player.TimelineChangeReason int reason) {
Timeline timeline, Object manifest, @Player.TimelineChangeReason int reason) { int periodCount = eventTime.timeline.getPeriodCount();
int periodCount = timeline.getPeriodCount(); int windowCount = eventTime.timeline.getWindowCount();
int windowCount = timeline.getWindowCount();
logd( logd(
"timelineChanged [periodCount=" "timelineChanged ["
+ getEventTimeString(eventTime)
+ ", periodCount="
+ periodCount + periodCount
+ ", windowCount=" + ", windowCount="
+ windowCount + windowCount
+ ", reason=" + ", reason="
+ getTimelineChangeReasonString(reason)); + getTimelineChangeReasonString(reason));
for (int i = 0; i < Math.min(periodCount, MAX_TIMELINE_ITEM_LINES); i++) { for (int i = 0; i < Math.min(periodCount, MAX_TIMELINE_ITEM_LINES); i++) {
timeline.getPeriod(i, period); eventTime.timeline.getPeriod(i, period);
logd(" " + "period [" + getTimeString(period.getDurationMs()) + "]"); logd(" " + "period [" + getTimeString(period.getDurationMs()) + "]");
} }
if (periodCount > MAX_TIMELINE_ITEM_LINES) { if (periodCount > MAX_TIMELINE_ITEM_LINES) {
logd(" ..."); logd(" ...");
} }
for (int i = 0; i < Math.min(windowCount, MAX_TIMELINE_ITEM_LINES); i++) { for (int i = 0; i < Math.min(windowCount, MAX_TIMELINE_ITEM_LINES); i++) {
timeline.getWindow(i, window); eventTime.timeline.getWindow(i, window);
logd( logd(
" " " "
+ "window [" + "window ["
@ -157,18 +155,20 @@ public class EventLogger
} }
@Override @Override
public void onPlayerError(ExoPlaybackException e) { public void onPlayerError(EventTime eventTime, ExoPlaybackException e) {
loge("playerFailed [" + getSessionTimeString() + "]", e); loge(eventTime, "playerFailed", e);
} }
@Override @Override
public void onTracksChanged(TrackGroupArray ignored, TrackSelectionArray trackSelections) { public void onTracksChanged(
MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); EventTime eventTime, TrackGroupArray ignored, TrackSelectionArray trackSelections) {
MappedTrackInfo mappedTrackInfo =
trackSelector != null ? trackSelector.getCurrentMappedTrackInfo() : null;
if (mappedTrackInfo == null) { if (mappedTrackInfo == null) {
logd("Tracks []"); logd(eventTime, "tracksChanged", "[]");
return; return;
} }
logd("Tracks ["); logd("tracksChanged [" + getEventTimeString(eventTime) + ", ");
// Log tracks associated to renderers. // Log tracks associated to renderers.
int rendererCount = mappedTrackInfo.getRendererCount(); int rendererCount = mappedTrackInfo.getRendererCount();
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
@ -244,201 +244,183 @@ public class EventLogger
} }
@Override @Override
public void onSeekProcessed() { public void onSeekProcessed(EventTime eventTime) {
logd("seekProcessed"); logd(eventTime, "seekProcessed");
} }
// MetadataOutput
@Override @Override
public void onMetadata(Metadata metadata) { public void onMetadata(EventTime eventTime, Metadata metadata) {
logd("onMetadata ["); logd("metadata [" + getEventTimeString(eventTime) + ", ");
printMetadata(metadata, " "); printMetadata(metadata, " ");
logd("]"); logd("]");
} }
// AudioRendererEventListener
@Override @Override
public void onAudioEnabled(DecoderCounters counters) { public void onDecoderEnabled(EventTime eventTime, int trackType, DecoderCounters counters) {
logd("audioEnabled [" + getSessionTimeString() + "]"); logd(eventTime, "decoderEnabled", getTrackTypeString(trackType));
} }
@Override @Override
public void onAudioSessionId(int audioSessionId) { public void onAudioSessionId(EventTime eventTime, int audioSessionId) {
logd("audioSessionId [" + audioSessionId + "]"); logd(eventTime, "audioSessionId", Integer.toString(audioSessionId));
} }
@Override @Override
public void onAudioDecoderInitialized( public void onDecoderInitialized(
String decoderName, long elapsedRealtimeMs, long initializationDurationMs) { EventTime eventTime, int trackType, String decoderName, long initializationDurationMs) {
logd("audioDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]"); logd(eventTime, "decoderInitialized", getTrackTypeString(trackType) + ", " + decoderName);
} }
@Override @Override
public void onAudioInputFormatChanged(Format format) { public void onDecoderInputFormatChanged(EventTime eventTime, int trackType, Format format) {
logd("audioFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format) + "]"); logd(
eventTime,
"decoderInputFormatChanged",
getTrackTypeString(trackType) + ", " + Format.toLogString(format));
} }
@Override @Override
public void onAudioDisabled(DecoderCounters counters) { public void onDecoderDisabled(EventTime eventTime, int trackType, DecoderCounters counters) {
logd("audioDisabled [" + getSessionTimeString() + "]"); logd(eventTime, "decoderDisabled", getTrackTypeString(trackType));
} }
@Override @Override
public void onAudioSinkUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) { public void onAudioUnderrun(
printInternalError("audioTrackUnderrun [" + bufferSize + ", " + bufferSizeMs + ", " EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {
+ elapsedSinceLastFeedMs + "]", null); loge(
} eventTime,
"audioTrackUnderrun",
// VideoRendererEventListener bufferSize + ", " + bufferSizeMs + ", " + elapsedSinceLastFeedMs + "]",
null);
@Override
public void onVideoEnabled(DecoderCounters counters) {
logd("videoEnabled [" + getSessionTimeString() + "]");
} }
@Override @Override
public void onVideoDecoderInitialized( public void onDroppedVideoFrames(EventTime eventTime, int count, long elapsedMs) {
String decoderName, long elapsedRealtimeMs, long initializationDurationMs) { logd(eventTime, "droppedFrames", Integer.toString(count));
logd("videoDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]");
}
@Override
public void onVideoInputFormatChanged(Format format) {
logd("videoFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format) + "]");
}
@Override
public void onVideoDisabled(DecoderCounters counters) {
logd("videoDisabled [" + getSessionTimeString() + "]");
}
@Override
public void onDroppedFrames(int count, long elapsed) {
logd("droppedFrames [" + getSessionTimeString() + ", " + count + "]");
} }
@Override @Override
public void onVideoSizeChanged( public void onVideoSizeChanged(
int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { EventTime eventTime,
logd("videoSizeChanged [" + width + ", " + height + "]"); int width,
int height,
int unappliedRotationDegrees,
float pixelWidthHeightRatio) {
logd(eventTime, "videoSizeChanged", width + ", " + height);
} }
@Override @Override
public void onRenderedFirstFrame(Surface surface) { public void onRenderedFirstFrame(EventTime eventTime, Surface surface) {
logd("renderedFirstFrame [" + surface + "]"); logd(eventTime, "renderedFirstFrame", surface.toString());
}
// DefaultDrmSessionManager.EventListener
@Override
public void onDrmSessionManagerError(Exception e) {
printInternalError("drmSessionManagerError", e);
} }
@Override @Override
public void onDrmKeysRestored() { public void onMediaPeriodCreated(EventTime eventTime) {
logd("drmKeysRestored [" + getSessionTimeString() + "]"); logd(eventTime, "mediaPeriodCreated");
} }
@Override @Override
public void onDrmKeysRemoved() { public void onMediaPeriodReleased(EventTime eventTime) {
logd("drmKeysRemoved [" + getSessionTimeString() + "]"); logd(eventTime, "mediaPeriodReleased");
}
@Override
public void onDrmKeysLoaded() {
logd("drmKeysLoaded [" + getSessionTimeString() + "]");
}
// MediaSourceEventListener
@Override
public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) {
// Do nothing.
}
@Override
public void onMediaPeriodReleased(int windowIndex, MediaPeriodId mediaPeriodId) {
// Do nothing.
} }
@Override @Override
public void onLoadStarted( public void onLoadStarted(
int windowIndex, EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
@Nullable MediaPeriodId mediaPeriodId,
LoadEventInfo loadEventInfo,
MediaLoadData mediaLoadData) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void onLoadError( public void onLoadError(
int windowIndex, EventTime eventTime,
@Nullable MediaPeriodId mediaPeriodId,
LoadEventInfo loadEventInfo, LoadEventInfo loadEventInfo,
MediaLoadData mediaLoadData, MediaLoadData mediaLoadData,
IOException error, IOException error,
boolean wasCanceled) { boolean wasCanceled) {
printInternalError("loadError", error); printInternalError(eventTime, "loadError", error);
} }
@Override @Override
public void onLoadCanceled( public void onLoadCanceled(
int windowIndex, EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
@Nullable MediaPeriodId mediaPeriodId,
LoadEventInfo loadEventInfo,
MediaLoadData mediaLoadData) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void onLoadCompleted( public void onLoadCompleted(
int windowIndex, EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
@Nullable MediaPeriodId mediaPeriodId,
LoadEventInfo loadEventInfo,
MediaLoadData mediaLoadData) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void onReadingStarted(int windowIndex, MediaPeriodId mediaPeriodId) { public void onReadingStarted(EventTime eventTime) {
logd(eventTime, "mediaPeriodReadingStarted");
}
@Override
public void onBandwidthEstimate(
EventTime eventTime, int totalLoadTimeMs, long totalBytesLoaded, long bitrateEstimate) {
// Do nothing. // Do nothing.
} }
@Override @Override
public void onUpstreamDiscarded( public void onViewportSizeChange(EventTime eventTime, int width, int height) {
int windowIndex, @Nullable MediaPeriodId mediaPeriodId, MediaLoadData mediaLoadData) { logd(eventTime, "viewportSizeChanged", width + ", " + height);
// Do nothing.
} }
@Override @Override
public void onDownstreamFormatChanged( public void onNetworkTypeChanged(EventTime eventTime, @Nullable NetworkInfo networkInfo) {
int windowIndex, @Nullable MediaPeriodId mediaPeriodId, MediaLoadData mediaLoadData) { logd(eventTime, "networkTypeChanged", networkInfo == null ? "none" : networkInfo.toString());
// Do nothing.
}
// AdsMediaSource.EventListener
@Override
public void onAdLoadError(IOException error) {
printInternalError("adLoadError", error);
} }
@Override @Override
public void onInternalAdLoadError(RuntimeException error) { public void onUpstreamDiscarded(EventTime eventTime, MediaLoadData mediaLoadData) {
printInternalError("internalAdLoadError", error); logd(eventTime, "upstreamDiscarded", Format.toLogString(mediaLoadData.trackFormat));
} }
@Override @Override
public void onAdClicked() { public void onDownstreamFormatChanged(EventTime eventTime, MediaLoadData mediaLoadData) {
// Do nothing. logd(eventTime, "downstreamFormatChanged", Format.toLogString(mediaLoadData.trackFormat));
} }
@Override @Override
public void onAdTapped() { public void onDrmSessionManagerError(EventTime eventTime, Exception e) {
// Do nothing. printInternalError(eventTime, "drmSessionManagerError", e);
}
@Override
public void onDrmKeysRestored(EventTime eventTime) {
logd(eventTime, "drmKeysRestored");
}
@Override
public void onDrmKeysRemoved(EventTime eventTime) {
logd(eventTime, "drmKeysRemoved");
}
@Override
public void onDrmKeysLoaded(EventTime eventTime) {
logd(eventTime, "drmKeysLoaded");
}
@Override
public void onAdLoadError(EventTime eventTime, IOException error) {
printInternalError(eventTime, "adLoadError", error);
}
@Override
public void onInternalAdLoadError(EventTime eventTime, RuntimeException error) {
printInternalError(eventTime, "internalAdLoadError", error);
}
@Override
public void onAdClicked(EventTime eventTime) {
logd(eventTime, "adClicked");
}
@Override
public void onAdTapped(EventTime eventTime) {
logd(eventTime, "adTapped");
} }
/** /**
@ -462,8 +444,25 @@ public class EventLogger
// Internal methods // Internal methods
private void printInternalError(String type, Exception e) { private void logd(EventTime eventTime, String eventName) {
loge("internalError [" + getSessionTimeString() + ", " + type + "]", e); logd(getEventString(eventTime, eventName));
}
private void logd(EventTime eventTime, String eventName, String eventDescription) {
logd(getEventString(eventTime, eventName, eventDescription));
}
private void loge(EventTime eventTime, String eventName, Throwable throwable) {
loge(getEventString(eventTime, eventName), throwable);
}
private void loge(
EventTime eventTime, String eventName, String eventDescription, Throwable throwable) {
loge(getEventString(eventTime, eventName, eventDescription), throwable);
}
private void printInternalError(EventTime eventTime, String type, Exception e) {
loge(eventTime, "internalError", type, e);
} }
private void printMetadata(Metadata metadata, String prefix) { private void printMetadata(Metadata metadata, String prefix) {
@ -472,8 +471,28 @@ public class EventLogger
} }
} }
private String getSessionTimeString() { private String getEventString(EventTime eventTime, String eventName) {
return getTimeString(SystemClock.elapsedRealtime() - startTimeMs); return eventName + " [" + getEventTimeString(eventTime) + "]";
}
private String getEventString(EventTime eventTime, String eventName, String eventDescription) {
return eventName + " [" + getEventTimeString(eventTime) + ", " + eventDescription + "]";
}
private String getEventTimeString(EventTime eventTime) {
String windowPeriodString = "window=" + eventTime.windowIndex;
if (eventTime.mediaPeriodId != null) {
windowPeriodString += ", period=" + eventTime.mediaPeriodId.periodIndex;
if (eventTime.mediaPeriodId.isAd()) {
windowPeriodString += ", adGroup=" + eventTime.mediaPeriodId.adGroupIndex;
windowPeriodString += ", ad=" + eventTime.mediaPeriodId.adIndexInAdGroup;
}
}
return getTimeString(eventTime.realtimeMs - startTimeMs)
+ ", "
+ getTimeString(eventTime.currentPlaybackPositionMs)
+ ", "
+ windowPeriodString;
} }
private static String getTimeString(long timeMs) { private static String getTimeString(long timeMs) {
@ -483,13 +502,13 @@ public class EventLogger
private static String getStateString(int state) { private static String getStateString(int state) {
switch (state) { switch (state) {
case Player.STATE_BUFFERING: case Player.STATE_BUFFERING:
return "B"; return "BUFFERING";
case Player.STATE_ENDED: case Player.STATE_ENDED:
return "E"; return "ENDED";
case Player.STATE_IDLE: case Player.STATE_IDLE:
return "I"; return "IDLE";
case Player.STATE_READY: case Player.STATE_READY:
return "R"; return "READY";
default: default:
return "?"; return "?";
} }
@ -584,4 +603,22 @@ public class EventLogger
} }
} }
private static String getTrackTypeString(int trackType) {
switch (trackType) {
case C.TRACK_TYPE_AUDIO:
return "audio";
case C.TRACK_TYPE_DEFAULT:
return "default";
case C.TRACK_TYPE_METADATA:
return "metadata";
case C.TRACK_TYPE_NONE:
return "none";
case C.TRACK_TYPE_TEXT:
return "text";
case C.TRACK_TYPE_VIDEO:
return "video";
default:
return trackType >= C.TRACK_TYPE_CUSTOM_BASE ? "custom (" + trackType + ")" : "?";
}
}
} }