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
13f1f3b3
authored
Oct 13, 2020
by
christosts
Committed by
kim-vde
Oct 13, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add live configuration to MediaItem
Issue: #4904 PiperOrigin-RevId: 336839370
parent
ed873322
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
145 additions
and
2 deletions
library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java
library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java
library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java
View file @
13f1f3b3
...
@@ -76,6 +76,9 @@ public final class MediaItem {
...
@@ -76,6 +76,9 @@ public final class MediaItem {
@Nullable
private
Uri
adTagUri
;
@Nullable
private
Uri
adTagUri
;
@Nullable
private
Object
tag
;
@Nullable
private
Object
tag
;
@Nullable
private
MediaMetadata
mediaMetadata
;
@Nullable
private
MediaMetadata
mediaMetadata
;
private
long
liveTargetOffsetMs
;
private
float
liveMinPlaybackSpeed
;
private
float
liveMaxPlaybackSpeed
;
/** Creates a builder. */
/** Creates a builder. */
public
Builder
()
{
public
Builder
()
{
...
@@ -84,6 +87,9 @@ public final class MediaItem {
...
@@ -84,6 +87,9 @@ public final class MediaItem {
drmLicenseRequestHeaders
=
Collections
.
emptyMap
();
drmLicenseRequestHeaders
=
Collections
.
emptyMap
();
streamKeys
=
Collections
.
emptyList
();
streamKeys
=
Collections
.
emptyList
();
subtitles
=
Collections
.
emptyList
();
subtitles
=
Collections
.
emptyList
();
liveTargetOffsetMs
=
C
.
TIME_UNSET
;
liveMinPlaybackSpeed
=
C
.
RATE_UNSET
;
liveMaxPlaybackSpeed
=
C
.
RATE_UNSET
;
}
}
private
Builder
(
MediaItem
mediaItem
)
{
private
Builder
(
MediaItem
mediaItem
)
{
...
@@ -95,6 +101,9 @@ public final class MediaItem {
...
@@ -95,6 +101,9 @@ public final class MediaItem {
clipStartsAtKeyFrame
=
mediaItem
.
clippingProperties
.
startsAtKeyFrame
;
clipStartsAtKeyFrame
=
mediaItem
.
clippingProperties
.
startsAtKeyFrame
;
mediaId
=
mediaItem
.
mediaId
;
mediaId
=
mediaItem
.
mediaId
;
mediaMetadata
=
mediaItem
.
mediaMetadata
;
mediaMetadata
=
mediaItem
.
mediaMetadata
;
liveTargetOffsetMs
=
mediaItem
.
liveConfiguration
.
targetLiveOffsetMs
;
liveMinPlaybackSpeed
=
mediaItem
.
liveConfiguration
.
minPlaybackSpeed
;
liveMaxPlaybackSpeed
=
mediaItem
.
liveConfiguration
.
maxPlaybackSpeed
;
@Nullable
PlaybackProperties
playbackProperties
=
mediaItem
.
playbackProperties
;
@Nullable
PlaybackProperties
playbackProperties
=
mediaItem
.
playbackProperties
;
if
(
playbackProperties
!=
null
)
{
if
(
playbackProperties
!=
null
)
{
adTagUri
=
playbackProperties
.
adTagUri
;
adTagUri
=
playbackProperties
.
adTagUri
;
...
@@ -415,6 +424,45 @@ public final class MediaItem {
...
@@ -415,6 +424,45 @@ public final class MediaItem {
}
}
/**
/**
* Sets the optional target offset from the live edge for live streams, in milliseconds.
*
* <p>See {@code Player#getCurrentLiveOffset()}.
*
* @param liveTargetOffsetMs The target live offset, in milliseconds, or {@link C#TIME_UNSET} to
* use the media-defined default.
*/
public
Builder
setLiveTargetOffsetMs
(
long
liveTargetOffsetMs
)
{
this
.
liveTargetOffsetMs
=
liveTargetOffsetMs
;
return
this
;
}
/**
* Sets the optional minimum playback speed for live stream speed adjustment.
*
* <p>This value is ignored for other stream types.
*
* @param minPlaybackSpeed The minimum playback speed for live streams, or {@link C#RATE_UNSET}
* to use the media-defined default.
*/
public
Builder
setLiveMinPlaybackSpeed
(
float
minPlaybackSpeed
)
{
this
.
liveMinPlaybackSpeed
=
minPlaybackSpeed
;
return
this
;
}
/**
* Sets the optional maximum playback speed for live stream speed adjustment.
*
* <p>This value is ignored for other stream types.
*
* @param maxPlaybackSpeed The maximum playback speed for live streams, or {@link C#RATE_UNSET}
* to use the media-defined default.
*/
public
Builder
setLiveMaxPlaybackSpeed
(
float
maxPlaybackSpeed
)
{
this
.
liveMaxPlaybackSpeed
=
maxPlaybackSpeed
;
return
this
;
}
/**
* Sets the optional tag for custom attributes. The tag for the media source which will be
* Sets the optional tag for custom attributes. The tag for the media source which will be
* published in the {@code com.google.android.exoplayer2.Timeline} of the source as {@code
* published in the {@code com.google.android.exoplayer2.Timeline} of the source as {@code
* com.google.android.exoplayer2.Timeline.Window#tag}.
* com.google.android.exoplayer2.Timeline.Window#tag}.
...
@@ -471,6 +519,7 @@ public final class MediaItem {
...
@@ -471,6 +519,7 @@ public final class MediaItem {
clipRelativeToDefaultPosition
,
clipRelativeToDefaultPosition
,
clipStartsAtKeyFrame
),
clipStartsAtKeyFrame
),
playbackProperties
,
playbackProperties
,
new
LiveConfiguration
(
liveTargetOffsetMs
,
liveMinPlaybackSpeed
,
liveMaxPlaybackSpeed
),
mediaMetadata
!=
null
?
mediaMetadata
:
new
MediaMetadata
.
Builder
().
build
());
mediaMetadata
!=
null
?
mediaMetadata
:
new
MediaMetadata
.
Builder
().
build
());
}
}
}
}
...
@@ -658,6 +707,66 @@ public final class MediaItem {
...
@@ -658,6 +707,66 @@ public final class MediaItem {
}
}
}
}
/** Live playback configuration. */
public
static
final
class
LiveConfiguration
{
/** A live playback configuration with unset values. */
public
static
final
LiveConfiguration
UNSET
=
new
LiveConfiguration
(
C
.
TIME_UNSET
,
C
.
RATE_UNSET
,
C
.
RATE_UNSET
);
/**
* Target live offset, in milliseconds, or {@link C#TIME_UNSET} to use the media-defined
* default.
*/
public
final
long
targetLiveOffsetMs
;
/** Minimum playback speed, or {@link C#RATE_UNSET} to use the media-defined default. */
public
final
float
minPlaybackSpeed
;
/** Maximum playback speed, or {@link C#RATE_UNSET} to use the media-defined default. */
public
final
float
maxPlaybackSpeed
;
/**
* Creates a live playback configuration.
*
* @param targetLiveOffsetMs Target live offset, in milliseconds, or {@link C#TIME_UNSET} to use
* the media-defined default.
* @param minPlaybackSpeed Minimum playback speed, or {@link C#RATE_UNSET} to use the
* media-defined default.
* @param maxPlaybackSpeed Maximum playback speed, or {@link C#RATE_UNSET} to use the
* media-defined default.
*/
public
LiveConfiguration
(
long
targetLiveOffsetMs
,
float
minPlaybackSpeed
,
float
maxPlaybackSpeed
)
{
this
.
targetLiveOffsetMs
=
targetLiveOffsetMs
;
this
.
minPlaybackSpeed
=
minPlaybackSpeed
;
this
.
maxPlaybackSpeed
=
maxPlaybackSpeed
;
}
@Override
public
boolean
equals
(
@Nullable
Object
obj
)
{
if
(
this
==
obj
)
{
return
true
;
}
if
(!(
obj
instanceof
LiveConfiguration
))
{
return
false
;
}
LiveConfiguration
other
=
(
LiveConfiguration
)
obj
;
return
targetLiveOffsetMs
==
other
.
targetLiveOffsetMs
&&
minPlaybackSpeed
==
other
.
minPlaybackSpeed
&&
maxPlaybackSpeed
==
other
.
maxPlaybackSpeed
;
}
@Override
public
int
hashCode
()
{
int
result
=
(
int
)
(
targetLiveOffsetMs
^
(
targetLiveOffsetMs
>>>
32
));
result
=
31
*
result
+
(
minPlaybackSpeed
!=
0
?
Float
.
floatToIntBits
(
minPlaybackSpeed
)
:
0
);
result
=
31
*
result
+
(
maxPlaybackSpeed
!=
0
?
Float
.
floatToIntBits
(
maxPlaybackSpeed
)
:
0
);
return
result
;
}
}
/** Properties for a text track. */
/** Properties for a text track. */
public
static
final
class
Subtitle
{
public
static
final
class
Subtitle
{
...
@@ -784,8 +893,8 @@ public final class MediaItem {
...
@@ -784,8 +893,8 @@ public final class MediaItem {
@Override
@Override
public
int
hashCode
()
{
public
int
hashCode
()
{
int
result
=
Long
.
valueOf
(
startPositionMs
).
hashCode
(
);
int
result
=
(
int
)
(
startPositionMs
^
(
startPositionMs
>>>
32
)
);
result
=
31
*
result
+
Long
.
valueOf
(
endPositionMs
).
hashCode
(
);
result
=
31
*
result
+
(
int
)
(
endPositionMs
^
(
endPositionMs
>>>
32
)
);
result
=
31
*
result
+
(
relativeToLiveWindow
?
1
:
0
);
result
=
31
*
result
+
(
relativeToLiveWindow
?
1
:
0
);
result
=
31
*
result
+
(
relativeToDefaultPosition
?
1
:
0
);
result
=
31
*
result
+
(
relativeToDefaultPosition
?
1
:
0
);
result
=
31
*
result
+
(
startsAtKeyFrame
?
1
:
0
);
result
=
31
*
result
+
(
startsAtKeyFrame
?
1
:
0
);
...
@@ -799,6 +908,9 @@ public final class MediaItem {
...
@@ -799,6 +908,9 @@ public final class MediaItem {
/** Optional playback properties. Maybe be {@code null} if shared over process boundaries. */
/** Optional playback properties. Maybe be {@code null} if shared over process boundaries. */
@Nullable
public
final
PlaybackProperties
playbackProperties
;
@Nullable
public
final
PlaybackProperties
playbackProperties
;
/** The live playback configuration. */
public
final
LiveConfiguration
liveConfiguration
;
/** The media metadata. */
/** The media metadata. */
public
final
MediaMetadata
mediaMetadata
;
public
final
MediaMetadata
mediaMetadata
;
...
@@ -809,9 +921,11 @@ public final class MediaItem {
...
@@ -809,9 +921,11 @@ public final class MediaItem {
String
mediaId
,
String
mediaId
,
ClippingProperties
clippingProperties
,
ClippingProperties
clippingProperties
,
@Nullable
PlaybackProperties
playbackProperties
,
@Nullable
PlaybackProperties
playbackProperties
,
LiveConfiguration
liveConfiguration
,
MediaMetadata
mediaMetadata
)
{
MediaMetadata
mediaMetadata
)
{
this
.
mediaId
=
mediaId
;
this
.
mediaId
=
mediaId
;
this
.
playbackProperties
=
playbackProperties
;
this
.
playbackProperties
=
playbackProperties
;
this
.
liveConfiguration
=
liveConfiguration
;
this
.
mediaMetadata
=
mediaMetadata
;
this
.
mediaMetadata
=
mediaMetadata
;
this
.
clippingProperties
=
clippingProperties
;
this
.
clippingProperties
=
clippingProperties
;
}
}
...
@@ -835,6 +949,7 @@ public final class MediaItem {
...
@@ -835,6 +949,7 @@ public final class MediaItem {
return
Util
.
areEqual
(
mediaId
,
other
.
mediaId
)
return
Util
.
areEqual
(
mediaId
,
other
.
mediaId
)
&&
clippingProperties
.
equals
(
other
.
clippingProperties
)
&&
clippingProperties
.
equals
(
other
.
clippingProperties
)
&&
Util
.
areEqual
(
playbackProperties
,
other
.
playbackProperties
)
&&
Util
.
areEqual
(
playbackProperties
,
other
.
playbackProperties
)
&&
Util
.
areEqual
(
liveConfiguration
,
other
.
liveConfiguration
)
&&
Util
.
areEqual
(
mediaMetadata
,
other
.
mediaMetadata
);
&&
Util
.
areEqual
(
mediaMetadata
,
other
.
mediaMetadata
);
}
}
...
@@ -842,6 +957,7 @@ public final class MediaItem {
...
@@ -842,6 +957,7 @@ public final class MediaItem {
public
int
hashCode
()
{
public
int
hashCode
()
{
int
result
=
mediaId
.
hashCode
();
int
result
=
mediaId
.
hashCode
();
result
=
31
*
result
+
(
playbackProperties
!=
null
?
playbackProperties
.
hashCode
()
:
0
);
result
=
31
*
result
+
(
playbackProperties
!=
null
?
playbackProperties
.
hashCode
()
:
0
);
result
=
31
*
result
+
liveConfiguration
.
hashCode
();
result
=
31
*
result
+
clippingProperties
.
hashCode
();
result
=
31
*
result
+
clippingProperties
.
hashCode
();
result
=
31
*
result
+
mediaMetadata
.
hashCode
();
result
=
31
*
result
+
mediaMetadata
.
hashCode
();
return
result
;
return
result
;
...
...
library/common/src/test/java/com/google/android/exoplayer2/MediaItemTest.java
View file @
13f1f3b3
...
@@ -288,6 +288,30 @@ public class MediaItemTest {
...
@@ -288,6 +288,30 @@ public class MediaItemTest {
}
}
@Test
@Test
public
void
builderSetLiveTargetLatencyMs_setsLiveTargetLatencyMs
()
{
MediaItem
mediaItem
=
new
MediaItem
.
Builder
().
setUri
(
URI_STRING
).
setLiveTargetOffsetMs
(
10_000
).
build
();
assertThat
(
mediaItem
.
liveConfiguration
.
targetLiveOffsetMs
).
isEqualTo
(
10_000
);
}
@Test
public
void
builderSetMinLivePlaybackSpeed_setsMinLivePlaybackSpeed
()
{
MediaItem
mediaItem
=
new
MediaItem
.
Builder
().
setUri
(
URI_STRING
).
setLiveMinPlaybackSpeed
(.
9
f
).
build
();
assertThat
(
mediaItem
.
liveConfiguration
.
minPlaybackSpeed
).
isEqualTo
(.
9
f
);
}
@Test
public
void
builderSetMaxLivePlaybackSpeed_setsMaxLivePlaybackSpeed
()
{
MediaItem
mediaItem
=
new
MediaItem
.
Builder
().
setUri
(
URI_STRING
).
setLiveMaxPlaybackSpeed
(
1.1f
).
build
();
assertThat
(
mediaItem
.
liveConfiguration
.
maxPlaybackSpeed
).
isEqualTo
(
1.1f
);
}
@Test
public
void
buildUpon_equalsToOriginal
()
{
public
void
buildUpon_equalsToOriginal
()
{
MediaItem
mediaItem
=
MediaItem
mediaItem
=
new
MediaItem
.
Builder
()
new
MediaItem
.
Builder
()
...
@@ -318,6 +342,9 @@ public class MediaItemTest {
...
@@ -318,6 +342,9 @@ public class MediaItemTest {
Uri
.
parse
(
URI_STRING
+
"/en"
),
Uri
.
parse
(
URI_STRING
+
"/en"
),
MimeTypes
.
APPLICATION_TTML
,
MimeTypes
.
APPLICATION_TTML
,
/* language= */
"en"
)))
/* language= */
"en"
)))
.
setLiveTargetOffsetMs
(
20_000
)
.
setLiveMinPlaybackSpeed
(.
9
f
)
.
setLiveMaxPlaybackSpeed
(
1.1f
)
.
setTag
(
new
Object
())
.
setTag
(
new
Object
())
.
build
();
.
build
();
...
...
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