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
f28de9de
authored
Feb 01, 2022
by
olly
Committed by
Andrew Lewis
Feb 01, 2022
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Rewrite EventLogger to use new track APIs
PiperOrigin-RevId: 425595951
parent
38713960
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
68 additions
and
139 deletions
demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java
demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java
libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java
demos/gl/src/main/java/androidx/media3/demo/gl/MainActivity.java
View file @
f28de9de
...
...
@@ -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/androidx/media3/demo/main/PlayerActivity.java
View file @
f28de9de
...
...
@@ -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
);
...
...
libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java
View file @
f28de9de
...
...
@@ -16,11 +16,6 @@
package
androidx
.
media3
.
exoplayer
.
util
;
import
static
androidx
.
media3
.
common
.
util
.
Util
.
getFormatSupportString
;
import
static
androidx
.
media3
.
exoplayer
.
RendererCapabilities
.
DECODER_SUPPORT_FALLBACK
;
import
static
androidx
.
media3
.
exoplayer
.
RendererCapabilities
.
HARDWARE_ACCELERATION_SUPPORTED
;
import
static
androidx
.
media3
.
exoplayer
.
RendererCapabilities
.
getDecoderSupport
;
import
static
androidx
.
media3
.
exoplayer
.
RendererCapabilities
.
getFormatSupport
;
import
static
androidx
.
media3
.
exoplayer
.
RendererCapabilities
.
getHardwareAccelerationSupport
;
import
static
java
.
lang
.
Math
.
min
;
import
android.os.SystemClock
;
...
...
@@ -37,23 +32,18 @@ import androidx.media3.common.Player;
import
androidx.media3.common.Player.PlaybackSuppressionReason
;
import
androidx.media3.common.Timeline
;
import
androidx.media3.common.TrackGroup
;
import
androidx.media3.common.TrackGroupArray
;
import
androidx.media3.common.TrackSelection
;
import
androidx.media3.common.TrackSelectionArray
;
import
androidx.media3.common.TracksInfo
;
import
androidx.media3.common.VideoSize
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.UnstableApi
;
import
androidx.media3.exoplayer.DecoderCounters
;
import
androidx.media3.exoplayer.DecoderReuseEvaluation
;
import
androidx.media3.exoplayer.RendererCapabilities
;
import
androidx.media3.exoplayer.RendererCapabilities.AdaptiveSupport
;
import
androidx.media3.exoplayer.RendererCapabilities.Capabilities
;
import
androidx.media3.exoplayer.analytics.AnalyticsListener
;
import
androidx.media3.exoplayer.drm.DrmSession
;
import
androidx.media3.exoplayer.source.LoadEventInfo
;
import
androidx.media3.exoplayer.source.MediaLoadData
;
import
androidx.media3.exoplayer.trackselection.MappingTrackSelector
;
import
androidx.media3.exoplayer.trackselection.MappingTrackSelector.MappedTrackInfo
;
import
com.google.common.collect.ImmutableList
;
import
java.io.IOException
;
import
java.text.NumberFormat
;
import
java.util.Locale
;
...
...
@@ -74,35 +64,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
...
...
@@ -258,96 +262,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
(
"]"
);
}
...
...
@@ -653,33 +607,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
)
{
...
...
libraries/test_utils/src/main/java/androidx/media3/test/utils/ExoHostedTest.java
View file @
f28de9de
...
...
@@ -138,7 +138,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