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
f0382585
authored
Dec 14, 2021
by
bachinger
Committed by
Ian Baker
Dec 14, 2021
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add AdPlaybackStateUpdater
PiperOrigin-RevId: 416314200
parent
5bd22c3a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
41 additions
and
13 deletions
library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java
library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSourceTest.java
library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java
View file @
f0382585
...
...
@@ -79,10 +79,32 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
public
final
class
ServerSideAdInsertionMediaSource
extends
BaseMediaSource
implements
MediaSource
.
MediaSourceCaller
,
MediaSourceEventListener
,
DrmSessionEventListener
{
/**
* Receives ad playback state update requests when the {@link Timeline} of the content media
* source has changed.
*/
public
interface
AdPlaybackStateUpdater
{
/**
* Called when the content source has refreshed the timeline.
*
* <p>If true is returned the source refresh publication is deferred, to wait for an {@link
* #setAdPlaybackState(AdPlaybackState) ad playback state update}. If false is returned, the
* source refresh is immediately published.
*
* <p>Called on the playback thread.
*
* @param contentTimeline The {@link Timeline} of the wrapped content media source.
* @return true to defer the source refresh publication, or false to immediately publish the
* source refresh.
*/
boolean
onAdPlaybackStateUpdateRequested
(
Timeline
contentTimeline
);
}
private
final
MediaSource
mediaSource
;
private
final
ListMultimap
<
Long
,
SharedMediaPeriod
>
mediaPeriods
;
private
final
MediaSourceEventListener
.
EventDispatcher
mediaSourceEventDispatcherWithoutId
;
private
final
DrmSessionEventListener
.
EventDispatcher
drmEventDispatcherWithoutId
;
@Nullable
private
final
AdPlaybackStateUpdater
adPlaybackStateUpdater
;
@GuardedBy
(
"this"
)
@Nullable
...
...
@@ -96,11 +118,15 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource
* Creates the media source.
*
* @param mediaSource The {@link MediaSource} to wrap.
* @param adPlaybackStateUpdater The optional {@link AdPlaybackStateUpdater} to be called before a
* source refresh is published.
*/
// Calling BaseMediaSource.createEventDispatcher from the constructor.
@SuppressWarnings
(
"nullness:method.invocation"
)
public
ServerSideAdInsertionMediaSource
(
MediaSource
mediaSource
)
{
public
ServerSideAdInsertionMediaSource
(
MediaSource
mediaSource
,
@Nullable
AdPlaybackStateUpdater
adPlaybackStateUpdater
)
{
this
.
mediaSource
=
mediaSource
;
this
.
adPlaybackStateUpdater
=
adPlaybackStateUpdater
;
mediaPeriods
=
ArrayListMultimap
.
create
();
adPlaybackState
=
AdPlaybackState
.
NONE
;
mediaSourceEventDispatcherWithoutId
=
createEventDispatcher
(
/* mediaPeriodId= */
null
);
...
...
@@ -190,10 +216,11 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource
@Override
public
void
onSourceInfoRefreshed
(
MediaSource
source
,
Timeline
timeline
)
{
this
.
contentTimeline
=
timeline
;
if
(
AdPlaybackState
.
NONE
.
equals
(
adPlaybackState
))
{
return
;
if
((
adPlaybackStateUpdater
==
null
||
!
adPlaybackStateUpdater
.
onAdPlaybackStateUpdateRequested
(
timeline
))
&&
!
AdPlaybackState
.
NONE
.
equals
(
adPlaybackState
))
{
refreshSourceInfo
(
new
ServerSideAdInsertionTimeline
(
timeline
,
adPlaybackState
));
}
refreshSourceInfo
(
new
ServerSideAdInsertionTimeline
(
timeline
,
adPlaybackState
));
}
@Override
...
...
library/core/src/test/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSourceTest.java
View file @
f0382585
...
...
@@ -81,7 +81,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
/* windowOffsetInFirstPeriodUs= */
42_000_000L
,
AdPlaybackState
.
NONE
));
ServerSideAdInsertionMediaSource
mediaSource
=
new
ServerSideAdInsertionMediaSource
(
new
FakeMediaSource
(
wrappedTimeline
));
new
ServerSideAdInsertionMediaSource
(
new
FakeMediaSource
(
wrappedTimeline
),
/* adPlaybackStateUpdater= */
null
);
// Test with one ad group before the window, and the window starting within the second ad group.
AdPlaybackState
adPlaybackState
=
new
AdPlaybackState
(
...
...
@@ -154,8 +155,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
ServerSideAdInsertionMediaSource
mediaSource
=
new
ServerSideAdInsertionMediaSource
(
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
))
);
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
)),
/* adPlaybackStateUpdater= */
null
);
AdPlaybackState
adPlaybackState
=
new
AdPlaybackState
(
/* adsId= */
new
Object
());
adPlaybackState
=
addAdGroupToAdPlaybackState
(
...
...
@@ -213,8 +214,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
ServerSideAdInsertionMediaSource
mediaSource
=
new
ServerSideAdInsertionMediaSource
(
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
))
);
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
)),
/* adPlaybackStateUpdater= */
null
);
AdPlaybackState
adPlaybackState
=
new
AdPlaybackState
(
/* adsId= */
new
Object
());
adPlaybackState
=
addAdGroupToAdPlaybackState
(
...
...
@@ -273,8 +274,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
ServerSideAdInsertionMediaSource
mediaSource
=
new
ServerSideAdInsertionMediaSource
(
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
))
);
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
)),
/* adPlaybackStateUpdater= */
null
);
AdPlaybackState
adPlaybackState
=
new
AdPlaybackState
(
/* adsId= */
new
Object
());
adPlaybackState
=
addAdGroupToAdPlaybackState
(
...
...
@@ -327,8 +328,8 @@ public final class ServerSideAdInsertionMediaSourceTest {
ServerSideAdInsertionMediaSource
mediaSource
=
new
ServerSideAdInsertionMediaSource
(
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
))
);
new
DefaultMediaSourceFactory
(
context
)
.
createMediaSource
(
MediaItem
.
fromUri
(
TEST_ASSET
)),
/* adPlaybackStateUpdater= */
null
);
AdPlaybackState
adPlaybackState
=
new
AdPlaybackState
(
/* adsId= */
new
Object
());
adPlaybackState
=
addAdGroupToAdPlaybackState
(
...
...
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