Rewrite EventLogger to use new track APIs
PiperOrigin-RevId: 425595951
This commit is contained in:
parent
30feb077a0
commit
29a6280b1b
@ -181,7 +181,7 @@ public final class MainActivity extends Activity {
|
|||||||
Assertions.checkNotNull(this.videoProcessingGLSurfaceView);
|
Assertions.checkNotNull(this.videoProcessingGLSurfaceView);
|
||||||
videoProcessingGLSurfaceView.setPlayer(player);
|
videoProcessingGLSurfaceView.setPlayer(player);
|
||||||
Assertions.checkNotNull(playerView).setPlayer(player);
|
Assertions.checkNotNull(playerView).setPlayer(player);
|
||||||
player.addAnalyticsListener(new EventLogger(/* trackSelector= */ null));
|
player.addAnalyticsListener(new EventLogger());
|
||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ public class PlayerActivity extends AppCompatActivity
|
|||||||
.build();
|
.build();
|
||||||
player.setTrackSelectionParameters(trackSelectionParameters);
|
player.setTrackSelectionParameters(trackSelectionParameters);
|
||||||
player.addListener(new PlayerEventListener());
|
player.addListener(new PlayerEventListener());
|
||||||
player.addAnalyticsListener(new EventLogger(trackSelector));
|
player.addAnalyticsListener(new EventLogger());
|
||||||
player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true);
|
player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true);
|
||||||
player.setPlayWhenReady(startAutoPlay);
|
player.setPlayWhenReady(startAutoPlay);
|
||||||
playerView.setPlayer(player);
|
playerView.setPlayer(player);
|
||||||
|
@ -9,13 +9,10 @@ issues. `EventLogger` implements `AnalyticsListener`, so registering an instance
|
|||||||
with an `ExoPlayer` is easy:
|
with an `ExoPlayer` is easy:
|
||||||
|
|
||||||
```
|
```
|
||||||
player.addAnalyticsListener(new EventLogger(trackSelector));
|
player.addAnalyticsListener(new EventLogger());
|
||||||
```
|
```
|
||||||
{: .language-java}
|
{: .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
|
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 (
|
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
|
`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: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,
|
||||||
EventLogger: MediaCodecVideoRenderer [
|
EventLogger: group [
|
||||||
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: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: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: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: [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: [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES
|
|
||||||
EventLogger: ]
|
|
||||||
EventLogger: ]
|
EventLogger: ]
|
||||||
EventLogger: MediaCodecAudioRenderer [
|
EventLogger: group [
|
||||||
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: [ ] 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: [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES
|
|
||||||
EventLogger: ]
|
|
||||||
EventLogger: ]
|
EventLogger: ]
|
||||||
EventLogger: ]
|
EventLogger: ]
|
||||||
```
|
```
|
||||||
|
@ -193,12 +193,11 @@ logging purposes. It can be added to an `ExoPlayer` to enable useful
|
|||||||
additional logging with a single line.
|
additional logging with a single line.
|
||||||
|
|
||||||
```
|
```
|
||||||
player.addAnalyticsListener(new EventLogger(trackSelector));
|
player.addAnalyticsListener(new EventLogger());
|
||||||
```
|
```
|
||||||
{: .language-java }
|
{: .language-java }
|
||||||
|
|
||||||
Passing the `trackSelector` enables additional logging, but is optional and so
|
See the [debug logging page][] for more details.
|
||||||
`null` can be passed instead. See the [debug logging page][] for more details.
|
|
||||||
|
|
||||||
## Firing events at specified playback positions ##
|
## Firing events at specified playback positions ##
|
||||||
|
|
||||||
|
@ -15,11 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.exoplayer2.util;
|
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 com.google.android.exoplayer2.util.Util.getFormatSupportString;
|
||||||
import static java.lang.Math.min;
|
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.PlaybackParameters;
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.Player.PlaybackSuppressionReason;
|
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.Timeline;
|
||||||
|
import com.google.android.exoplayer2.TracksInfo;
|
||||||
import com.google.android.exoplayer2.analytics.AnalyticsListener;
|
import com.google.android.exoplayer2.analytics.AnalyticsListener;
|
||||||
import com.google.android.exoplayer2.audio.AudioAttributes;
|
import com.google.android.exoplayer2.audio.AudioAttributes;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
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.LoadEventInfo;
|
||||||
import com.google.android.exoplayer2.source.MediaLoadData;
|
import com.google.android.exoplayer2.source.MediaLoadData;
|
||||||
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.trackselection.MappingTrackSelector;
|
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.android.exoplayer2.video.VideoSize;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -71,37 +61,51 @@ public class EventLogger implements AnalyticsListener {
|
|||||||
TIME_FORMAT.setGroupingUsed(false);
|
TIME_FORMAT.setGroupingUsed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable private final MappingTrackSelector trackSelector;
|
|
||||||
private final String tag;
|
private final String tag;
|
||||||
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;
|
||||||
|
|
||||||
/**
|
/** Creates an instance. */
|
||||||
* Creates event logger.
|
public EventLogger() {
|
||||||
*
|
this(DEFAULT_TAG);
|
||||||
* @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 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.
|
* @param tag The tag used for logging.
|
||||||
*/
|
*/
|
||||||
public EventLogger(@Nullable MappingTrackSelector trackSelector, String tag) {
|
public EventLogger(String tag) {
|
||||||
this.trackSelector = trackSelector;
|
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
window = new Timeline.Window();
|
window = new Timeline.Window();
|
||||||
period = new Timeline.Period();
|
period = new Timeline.Period();
|
||||||
startTimeMs = SystemClock.elapsedRealtime();
|
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
|
// AnalyticsListener
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -255,97 +259,47 @@ public class EventLogger implements AnalyticsListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTracksChanged(
|
public void onTracksInfoChanged(EventTime eventTime, TracksInfo tracksInfo) {
|
||||||
EventTime eventTime, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
|
|
||||||
MappedTrackInfo mappedTrackInfo =
|
|
||||||
trackSelector != null ? trackSelector.getCurrentMappedTrackInfo() : null;
|
|
||||||
if (mappedTrackInfo == null) {
|
|
||||||
logd(eventTime, "tracks", "[]");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
logd("tracks [" + getEventTimeString(eventTime));
|
logd("tracks [" + getEventTimeString(eventTime));
|
||||||
// Log tracks associated to renderers.
|
// Log tracks associated to renderers.
|
||||||
int rendererCount = mappedTrackInfo.getRendererCount();
|
ImmutableList<TracksInfo.TrackGroupInfo> trackGroupInfos = tracksInfo.getTrackGroupInfos();
|
||||||
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
|
for (int groupIndex = 0; groupIndex < trackGroupInfos.size(); groupIndex++) {
|
||||||
TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
|
TracksInfo.TrackGroupInfo trackGroupInfo = trackGroupInfos.get(groupIndex);
|
||||||
TrackSelection trackSelection = trackSelections.get(rendererIndex);
|
TrackGroup trackGroup = trackGroupInfo.getTrackGroup();
|
||||||
if (rendererTrackGroups.length == 0) {
|
logd(" group [");
|
||||||
logd(" " + mappedTrackInfo.getRendererName(rendererIndex) + " []");
|
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
|
||||||
} else {
|
String status = getTrackStatusString(trackGroupInfo.isTrackSelected(trackIndex));
|
||||||
logd(" " + mappedTrackInfo.getRendererName(rendererIndex) + " [");
|
String formatSupport = getFormatSupportString(trackGroupInfo.getTrackSupport(trackIndex));
|
||||||
for (int groupIndex = 0; groupIndex < rendererTrackGroups.length; groupIndex++) {
|
logd(
|
||||||
TrackGroup trackGroup = rendererTrackGroups.get(groupIndex);
|
" "
|
||||||
String adaptiveSupport =
|
+ status
|
||||||
getAdaptiveSupportString(
|
+ " Track:"
|
||||||
trackGroup.length,
|
+ trackIndex
|
||||||
mappedTrackInfo.getAdaptiveSupport(
|
+ ", "
|
||||||
rendererIndex, groupIndex, /* includeCapabilitiesExceededTracks= */ false));
|
+ Format.toLogString(trackGroup.getFormat(trackIndex))
|
||||||
logd(" Group:" + trackGroup.id + ", adaptive_supported=" + adaptiveSupport + " [");
|
+ ", supported="
|
||||||
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
|
+ formatSupport);
|
||||||
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(" ]");
|
|
||||||
}
|
}
|
||||||
logd(" ]");
|
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("]");
|
logd("]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -650,33 +604,8 @@ public class EventLogger implements AnalyticsListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getAdaptiveSupportString(
|
private static String getTrackStatusString(boolean selected) {
|
||||||
int trackCount, @AdaptiveSupport int adaptiveSupport) {
|
return selected ? "[X]" : "[ ]";
|
||||||
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 getRepeatModeString(@Player.RepeatMode int repeatMode) {
|
private static String getRepeatModeString(@Player.RepeatMode int repeatMode) {
|
||||||
|
@ -136,7 +136,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
|
|||||||
player = buildExoPlayer(host, surface, trackSelector);
|
player = buildExoPlayer(host, surface, trackSelector);
|
||||||
player.play();
|
player.play();
|
||||||
player.addAnalyticsListener(this);
|
player.addAnalyticsListener(this);
|
||||||
player.addAnalyticsListener(new EventLogger(trackSelector, tag));
|
player.addAnalyticsListener(new EventLogger(tag));
|
||||||
// Schedule any pending actions.
|
// Schedule any pending actions.
|
||||||
actionHandler =
|
actionHandler =
|
||||||
Clock.DEFAULT.createHandler(Util.getCurrentOrMainLooper(), /* callback= */ null);
|
Clock.DEFAULT.createHandler(Util.getCurrentOrMainLooper(), /* callback= */ null);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user