Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
29a6280b
authored
Feb 01, 2022
by
olly
Committed by
Ian Baker
Feb 02, 2022
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Rewrite EventLogger to use new track APIs
PiperOrigin-RevId: 425595951
parent
30feb077
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
80 additions
and
159 deletions
demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
docs/debug-logging.md
docs/listening-to-player-events.md
library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java
View file @
29a6280b
...
...
@@ -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
;
}
...
...
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
View file @
29a6280b
...
...
@@ -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
);
...
...
docs/debug-logging.md
View file @
29a6280b
...
...
@@ -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: ]
```
...
...
docs/listening-to-player-events.md
View file @
29a6280b
...
...
@@ -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 ##
...
...
library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
View file @
29a6280b
...
...
@@ -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,35 +61,49 @@ 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 an instance. */
public
EventLogger
()
{
this
(
DEFAULT_TAG
);
}
/**
* Creates an instance.
*
* @param tag The tag used for logging.
*/
public
EventLogger
(
String
tag
)
{
this
.
tag
=
tag
;
window
=
new
Timeline
.
Window
();
period
=
new
Timeline
.
Period
();
startTimeMs
=
SystemClock
.
elapsedRealtime
();
}
/**
* Creates
event logger
.
* Creates
an instance
.
*
* @param trackSelector Th
e mapping track selector used by the player. May be null if detailed
*
logging of track mapping is not required.
* @param trackSelector Th
is parameter is ignored.
*
@deprecated Use {@link EventLogger()}
*/
@Deprecated
public
EventLogger
(
@Nullable
MappingTrackSelector
trackSelector
)
{
this
(
trackSelector
,
DEFAULT_TAG
);
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 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
.
trackSelector
=
trackSelector
;
this
.
tag
=
tag
;
window
=
new
Timeline
.
Window
();
period
=
new
Timeline
.
Period
();
startTimeMs
=
SystemClock
.
elapsedRealtime
();
this
(
tag
);
}
// AnalyticsListener
...
...
@@ -255,96 +259,46 @@ 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
(
" ]"
);
ImmutableList
<
TracksInfo
.
TrackGroupInfo
>
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
(
" ]"
);
}
// 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
);
// 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
(
" ]"
);
}
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
)
{
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
View file @
29a6280b
...
...
@@ -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
(
t
rackSelector
,
t
ag
));
player
.
addAnalyticsListener
(
new
EventLogger
(
tag
));
// Schedule any pending actions.
actionHandler
=
Clock
.
DEFAULT
.
createHandler
(
Util
.
getCurrentOrMainLooper
(),
/* callback= */
null
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment