1*30877f79SAndroid Build Coastguard Worker---
2*30877f79SAndroid Build Coastguard Workertitle: Debug logging
3*30877f79SAndroid Build Coastguard Worker---
4*30877f79SAndroid Build Coastguard Worker
5*30877f79SAndroid Build Coastguard WorkerBy default ExoPlayer only logs errors. To log player events, the `EventLogger`
6*30877f79SAndroid Build Coastguard Workerclass can be used. The additional logging it provides can be helpful for
7*30877f79SAndroid Build Coastguard Workerunderstanding what the player is doing, as well as for debugging playback
8*30877f79SAndroid Build Coastguard Workerissues. `EventLogger` implements `AnalyticsListener`, so registering an instance
9*30877f79SAndroid Build Coastguard Workerwith an `ExoPlayer` is easy:
10*30877f79SAndroid Build Coastguard Worker
11*30877f79SAndroid Build Coastguard Worker```
12*30877f79SAndroid Build Coastguard Workerplayer.addAnalyticsListener(new EventLogger());
13*30877f79SAndroid Build Coastguard Worker```
14*30877f79SAndroid Build Coastguard Worker{: .language-java}
15*30877f79SAndroid Build Coastguard Worker
16*30877f79SAndroid Build Coastguard WorkerThe easiest way to observe the log is using Android Studio's [logcat tab][]. You
17*30877f79SAndroid Build Coastguard Workercan select your app as debuggable process by the package name (
18*30877f79SAndroid Build Coastguard Worker`com.google.android.exoplayer2.demo` if using the demo app) and tell the logcat
19*30877f79SAndroid Build Coastguard Workertab to log only for that app by selecting 'show only selected application'. It's
20*30877f79SAndroid Build Coastguard Workerpossible to further filter the logging with the expression
21*30877f79SAndroid Build Coastguard Worker`EventLogger|ExoPlayerImpl`, to get only logging from `EventLogger` and the
22*30877f79SAndroid Build Coastguard Workerplayer itself.
23*30877f79SAndroid Build Coastguard Worker
24*30877f79SAndroid Build Coastguard WorkerAn alternative to using Android Studio's logcat tab is to use the console. For
25*30877f79SAndroid Build Coastguard Workerexample:
26*30877f79SAndroid Build Coastguard Worker
27*30877f79SAndroid Build Coastguard Worker~~~
28*30877f79SAndroid Build Coastguard Workeradb logcat EventLogger:* ExoPlayerImpl:* *:s
29*30877f79SAndroid Build Coastguard Worker~~~
30*30877f79SAndroid Build Coastguard Worker{: .language-shell}
31*30877f79SAndroid Build Coastguard Worker
32*30877f79SAndroid Build Coastguard Worker### Player information ###
33*30877f79SAndroid Build Coastguard Worker
34*30877f79SAndroid Build Coastguard WorkerThe `ExoPlayerImpl` class delivers two important lines about the player version,
35*30877f79SAndroid Build Coastguard Workerthe device and OS the app is running on and the modules of ExoPlayer that have
36*30877f79SAndroid Build Coastguard Workerbeen loaded:
37*30877f79SAndroid Build Coastguard Worker
38*30877f79SAndroid Build Coastguard Worker```
39*30877f79SAndroid Build Coastguard WorkerExoPlayerImpl: Release 2cd6e65 [ExoPlayerLib/2.12.0] [marlin, Pixel XL, Google, 26] [goog.exo.core, goog.exo.ui, goog.exo.dash]
40*30877f79SAndroid Build Coastguard WorkerExoPlayerImpl: Init 2e5194c [ExoPlayerLib/2.12.0] [marlin, Pixel XL, Google, 26]
41*30877f79SAndroid Build Coastguard Worker```
42*30877f79SAndroid Build Coastguard Worker
43*30877f79SAndroid Build Coastguard Worker### Playback state ###
44*30877f79SAndroid Build Coastguard Worker
45*30877f79SAndroid Build Coastguard WorkerPlayer state changes are logged in lines like the ones below:
46*30877f79SAndroid Build Coastguard Worker
47*30877f79SAndroid Build Coastguard Worker```
48*30877f79SAndroid Build Coastguard WorkerEventLogger: playWhenReady [eventTime=0.00, mediaPos=0.00, window=0, true, USER_REQUEST]
49*30877f79SAndroid Build Coastguard WorkerEventLogger: state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]
50*30877f79SAndroid Build Coastguard WorkerEventLogger: state [eventTime=0.93, mediaPos=0.00, window=0, period=0, READY]
51*30877f79SAndroid Build Coastguard WorkerEventLogger: isPlaying [eventTime=0.93, mediaPos=0.00, window=0, period=0, true]
52*30877f79SAndroid Build Coastguard WorkerEventLogger: playWhenReady [eventTime=9.40, mediaPos=8.40, window=0, period=0, false, USER_REQUEST]
53*30877f79SAndroid Build Coastguard WorkerEventLogger: isPlaying [eventTime=9.40, mediaPos=8.40, window=0, period=0, false]
54*30877f79SAndroid Build Coastguard WorkerEventLogger: playWhenReady [eventTime=10.40, mediaPos=8.40, window=0, period=0, true, USER_REQUEST]
55*30877f79SAndroid Build Coastguard WorkerEventLogger: isPlaying [eventTime=10.40, mediaPos=8.40, window=0, period=0, true]
56*30877f79SAndroid Build Coastguard WorkerEventLogger: state [eventTime=20.40, mediaPos=18.40, window=0, period=0, ENDED]
57*30877f79SAndroid Build Coastguard WorkerEventLogger: isPlaying [eventTime=20.40, mediaPos=18.40, window=0, period=0, false]
58*30877f79SAndroid Build Coastguard Worker```
59*30877f79SAndroid Build Coastguard Worker
60*30877f79SAndroid Build Coastguard WorkerIn this example playback starts 0.93 seconds after the player is prepared. The
61*30877f79SAndroid Build Coastguard Workeruser pauses playback after 9.4 seconds, and resumes playback one second later at
62*30877f79SAndroid Build Coastguard Worker10.4 seconds. Playback ends ten seconds later at 20.4 seconds. The common
63*30877f79SAndroid Build Coastguard Workerelements within the square brackets are:
64*30877f79SAndroid Build Coastguard Worker
65*30877f79SAndroid Build Coastguard Worker* `[eventTime=float]`: The wall clock time since player creation.
66*30877f79SAndroid Build Coastguard Worker* `[mediaPos=float]`: The current playback position.
67*30877f79SAndroid Build Coastguard Worker* `[window=int]`: The current window index.
68*30877f79SAndroid Build Coastguard Worker* `[period=int]`: The current period in that window.
69*30877f79SAndroid Build Coastguard Worker
70*30877f79SAndroid Build Coastguard WorkerThe final elements in each line indicate the value of the state being reported.
71*30877f79SAndroid Build Coastguard Worker
72*30877f79SAndroid Build Coastguard Worker### Media tracks ###
73*30877f79SAndroid Build Coastguard Worker
74*30877f79SAndroid Build Coastguard WorkerTrack information is logged when the available or selected tracks change. This
75*30877f79SAndroid Build Coastguard Workerhappens at least once at the start of playback. The example below shows track
76*30877f79SAndroid Build Coastguard Workerlogging for an adaptive stream:
77*30877f79SAndroid Build Coastguard Worker
78*30877f79SAndroid Build Coastguard Worker```
79*30877f79SAndroid Build Coastguard WorkerEventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,
80*30877f79SAndroid Build Coastguard WorkerEventLogger:   group [
81*30877f79SAndroid Build Coastguard WorkerEventLogger:     [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES
82*30877f79SAndroid Build Coastguard WorkerEventLogger:     [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES
83*30877f79SAndroid Build Coastguard WorkerEventLogger:     [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES
84*30877f79SAndroid Build Coastguard WorkerEventLogger:     [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES
85*30877f79SAndroid Build Coastguard WorkerEventLogger:     [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES
86*30877f79SAndroid Build Coastguard WorkerEventLogger:   ]
87*30877f79SAndroid Build Coastguard WorkerEventLogger:   group [
88*30877f79SAndroid Build Coastguard WorkerEventLogger:     [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES
89*30877f79SAndroid Build Coastguard WorkerEventLogger:     [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES
90*30877f79SAndroid Build Coastguard WorkerEventLogger:   ]
91*30877f79SAndroid Build Coastguard WorkerEventLogger: ]
92*30877f79SAndroid Build Coastguard Worker```
93*30877f79SAndroid Build Coastguard Worker
94*30877f79SAndroid Build Coastguard WorkerIn this example, the player has selected four of the five available video
95*30877f79SAndroid Build Coastguard Workertracks. The fifth video track is not selected because it exceeds the
96*30877f79SAndroid Build Coastguard Workercapabilities of the device, as indicated by `supported=NO_EXCEEDS_CAPABILITIES`.
97*30877f79SAndroid Build Coastguard WorkerThe player will adapt between the selected video tracks during playback. When
98*30877f79SAndroid Build Coastguard Workerthe player adapts from one track to another, it's logged in a line like the one
99*30877f79SAndroid Build Coastguard Workerbelow:
100*30877f79SAndroid Build Coastguard Worker
101*30877f79SAndroid Build Coastguard Worker```
102*30877f79SAndroid Build Coastguard WorkerEventLogger: downstreamFormat [eventTime=3.64, mediaPos=3.00, window=0, period=0, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0]
103*30877f79SAndroid Build Coastguard Worker```
104*30877f79SAndroid Build Coastguard Worker
105*30877f79SAndroid Build Coastguard WorkerThis log line indicates that the player switched to the 640x360 resolution video
106*30877f79SAndroid Build Coastguard Workertrack three seconds into the media.
107*30877f79SAndroid Build Coastguard Worker
108*30877f79SAndroid Build Coastguard Worker### Decoder selection ###
109*30877f79SAndroid Build Coastguard Worker
110*30877f79SAndroid Build Coastguard WorkerIn most cases ExoPlayer renders media using a `MediaCodec` acquired from the
111*30877f79SAndroid Build Coastguard Workerunderlying platform. When a decoder is initialized, this is logged in lines like
112*30877f79SAndroid Build Coastguard Workerthe ones below:
113*30877f79SAndroid Build Coastguard Worker
114*30877f79SAndroid Build Coastguard Worker```
115*30877f79SAndroid Build Coastguard WorkerEventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX.qcom.video.decoder.avc]
116*30877f79SAndroid Build Coastguard WorkerEventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder]
117*30877f79SAndroid Build Coastguard Worker```
118*30877f79SAndroid Build Coastguard Worker
119*30877f79SAndroid Build Coastguard Worker[logcat tab]: https://developer.android.com/studio/debug/am-logcat
120