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
d77d661e
authored
Jul 29, 2019
by
olly
Committed by
Oliver Woodman
Jul 29, 2019
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Default viewport constraints to match primary display
PiperOrigin-RevId: 260479923
parent
7703676c
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
255 additions
and
127 deletions
RELEASENOTES.md
demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java
demos/gvr/src/main/java/com/google/android/exoplayer2/gvrdemo/PlayerActivity.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java
extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java
extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java
library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java
library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java
library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java
library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/DownloadHelperTest.java
library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/DownloadHelperTest.java
playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
RELEASENOTES.md
View file @
d77d661e
...
...
@@ -2,6 +2,8 @@
### dev-v2 (not yet released) ###
*
Update
`DefaultTrackSelector`
to apply a viewport constraint for the default
display by default.
*
Add
`PlaybackStatsListener`
to collect
`PlaybackStats`
for playbacks analysis
and analytics reporting (TODO: link to developer guide page/blog post).
*
Add basic DRM support to the Cast demo app.
...
...
demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java
View file @
d77d661e
...
...
@@ -21,13 +21,11 @@ import androidx.annotation.Nullable;
import
android.view.KeyEvent
;
import
android.view.View
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.DefaultRenderersFactory
;
import
com.google.android.exoplayer2.ExoPlayerFactory
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Player.DiscontinuityReason
;
import
com.google.android.exoplayer2.Player.EventListener
;
import
com.google.android.exoplayer2.Player.TimelineChangeReason
;
import
com.google.android.exoplayer2.RenderersFactory
;
import
com.google.android.exoplayer2.SimpleExoPlayer
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.Timeline.Period
;
...
...
@@ -40,7 +38,6 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import
com.google.android.exoplayer2.source.dash.DashMediaSource
;
import
com.google.android.exoplayer2.source.hls.HlsMediaSource
;
import
com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.ui.PlayerControlView
;
import
com.google.android.exoplayer2.ui.PlayerView
;
import
com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
;
...
...
@@ -99,9 +96,7 @@ import org.json.JSONObject;
currentItemIndex
=
C
.
INDEX_UNSET
;
concatenatingMediaSource
=
new
ConcatenatingMediaSource
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
();
RenderersFactory
renderersFactory
=
new
DefaultRenderersFactory
(
context
);
exoPlayer
=
ExoPlayerFactory
.
newSimpleInstance
(
context
,
renderersFactory
,
trackSelector
);
exoPlayer
=
ExoPlayerFactory
.
newSimpleInstance
(
context
);
exoPlayer
.
addListener
(
this
);
localPlayerView
.
setPlayer
(
exoPlayer
);
...
...
demos/gvr/src/main/java/com/google/android/exoplayer2/gvrdemo/PlayerActivity.java
View file @
d77d661e
...
...
@@ -35,7 +35,6 @@ import com.google.android.exoplayer2.source.TrackGroupArray;
import
com.google.android.exoplayer2.source.dash.DashMediaSource
;
import
com.google.android.exoplayer2.source.hls.HlsMediaSource
;
import
com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource
;
import
com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
;
import
com.google.android.exoplayer2.trackselection.TrackSelectionArray
;
...
...
@@ -135,7 +134,7 @@ public class PlayerActivity extends GvrPlayerActivity implements PlaybackPrepare
DefaultRenderersFactory
renderersFactory
=
new
DefaultRenderersFactory
(
this
);
trackSelector
=
new
DefaultTrackSelector
(
new
AdaptiveTrackSelection
.
Factory
()
);
trackSelector
=
new
DefaultTrackSelector
(
/* context= */
this
);
lastSeenTrackGroupArray
=
null
;
player
=
...
...
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
View file @
d77d661e
...
...
@@ -30,6 +30,7 @@ import com.google.android.exoplayer2.offline.DownloadIndex;
import
com.google.android.exoplayer2.offline.DownloadManager
;
import
com.google.android.exoplayer2.offline.DownloadRequest
;
import
com.google.android.exoplayer2.offline.DownloadService
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
;
import
com.google.android.exoplayer2.upstream.DataSource
;
import
com.google.android.exoplayer2.util.Log
;
...
...
@@ -55,6 +56,7 @@ public class DownloadTracker {
private
final
CopyOnWriteArraySet
<
Listener
>
listeners
;
private
final
HashMap
<
Uri
,
Download
>
downloads
;
private
final
DownloadIndex
downloadIndex
;
private
final
DefaultTrackSelector
.
Parameters
trackSelectorParameters
;
@Nullable
private
StartDownloadDialogHelper
startDownloadDialogHelper
;
...
...
@@ -65,6 +67,7 @@ public class DownloadTracker {
listeners
=
new
CopyOnWriteArraySet
<>();
downloads
=
new
HashMap
<>();
downloadIndex
=
downloadManager
.
getDownloadIndex
();
trackSelectorParameters
=
DownloadHelper
.
getDefaultTrackSelectorParameters
(
context
);
downloadManager
.
addListener
(
new
DownloadManagerListener
());
loadDownloads
();
}
...
...
@@ -123,13 +126,13 @@ public class DownloadTracker {
int
type
=
Util
.
inferContentType
(
uri
,
extension
);
switch
(
type
)
{
case
C
.
TYPE_DASH
:
return
DownloadHelper
.
forDash
(
uri
,
dataSourceFactory
,
renderersFactory
);
return
DownloadHelper
.
forDash
(
context
,
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_SS
:
return
DownloadHelper
.
forSmoothStreaming
(
uri
,
dataSourceFactory
,
renderersFactory
);
return
DownloadHelper
.
forSmoothStreaming
(
context
,
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_HLS
:
return
DownloadHelper
.
forHls
(
uri
,
dataSourceFactory
,
renderersFactory
);
return
DownloadHelper
.
forHls
(
context
,
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_OTHER
:
return
DownloadHelper
.
forProgressive
(
uri
);
return
DownloadHelper
.
forProgressive
(
context
,
uri
);
default
:
throw
new
IllegalStateException
(
"Unsupported type: "
+
type
);
}
...
...
@@ -202,7 +205,7 @@ public class DownloadTracker {
TrackSelectionDialog
.
createForMappedTrackInfoAndParameters
(
/* titleId= */
R
.
string
.
exo_download_description
,
mappedTrackInfo
,
/* initialParameters= */
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
,
trackSelectorParameters
,
/* allowAdaptiveSelections =*/
false
,
/* allowMultipleOverrides= */
true
,
/* onClickListener= */
this
,
...
...
@@ -212,9 +215,7 @@ public class DownloadTracker {
@Override
public
void
onPrepareError
(
DownloadHelper
helper
,
IOException
e
)
{
Toast
.
makeText
(
context
.
getApplicationContext
(),
R
.
string
.
download_start_error
,
Toast
.
LENGTH_LONG
)
.
show
();
Toast
.
makeText
(
context
,
R
.
string
.
download_start_error
,
Toast
.
LENGTH_LONG
).
show
();
Log
.
e
(
TAG
,
"Failed to start download"
,
e
);
}
...
...
@@ -229,7 +230,7 @@ public class DownloadTracker {
downloadHelper
.
addTrackSelectionForSingleRenderer
(
periodIndex
,
/* rendererIndex= */
i
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
,
trackSelectorParameters
,
trackSelectionDialog
.
getOverrides
(
/* rendererIndex= */
i
));
}
}
...
...
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
View file @
d77d661e
...
...
@@ -195,7 +195,7 @@ public class PlayerActivity extends AppCompatActivity
startWindow
=
savedInstanceState
.
getInt
(
KEY_WINDOW
);
startPosition
=
savedInstanceState
.
getLong
(
KEY_POSITION
);
}
else
{
trackSelectorParameters
=
new
DefaultTrackSelector
.
ParametersBuilder
().
build
(
);
trackSelectorParameters
=
DefaultTrackSelector
.
Parameters
.
getDefaults
(
/* context= */
this
);
clearStartPosition
();
}
}
...
...
@@ -411,7 +411,7 @@ public class PlayerActivity extends AppCompatActivity
RenderersFactory
renderersFactory
=
((
DemoApplication
)
getApplication
()).
buildRenderersFactory
(
preferExtensionDecoders
);
trackSelector
=
new
DefaultTrackSelector
(
trackSelectionFactory
);
trackSelector
=
new
DefaultTrackSelector
(
/* context= */
this
,
trackSelectionFactory
);
trackSelector
.
setParameters
(
trackSelectorParameters
);
lastSeenTrackGroupArray
=
null
;
...
...
extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java
View file @
d77d661e
...
...
@@ -82,7 +82,7 @@ public class FlacPlaybackTest {
public
void
run
()
{
Looper
.
prepare
();
LibflacAudioRenderer
audioRenderer
=
new
LibflacAudioRenderer
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
(
context
);
player
=
ExoPlayerFactory
.
newInstance
(
context
,
new
Renderer
[]
{
audioRenderer
},
trackSelector
);
player
.
addListener
(
this
);
MediaSource
mediaSource
=
...
...
extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java
View file @
d77d661e
...
...
@@ -82,7 +82,7 @@ public class OpusPlaybackTest {
public
void
run
()
{
Looper
.
prepare
();
LibopusAudioRenderer
audioRenderer
=
new
LibopusAudioRenderer
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
(
context
);
player
=
ExoPlayerFactory
.
newInstance
(
context
,
new
Renderer
[]
{
audioRenderer
},
trackSelector
);
player
.
addListener
(
this
);
MediaSource
mediaSource
=
...
...
extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java
View file @
d77d661e
...
...
@@ -115,7 +115,7 @@ public class VpxPlaybackTest {
public
void
run
()
{
Looper
.
prepare
();
LibvpxVideoRenderer
videoRenderer
=
new
LibvpxVideoRenderer
(
0
);
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
();
DefaultTrackSelector
trackSelector
=
new
DefaultTrackSelector
(
context
);
player
=
ExoPlayerFactory
.
newInstance
(
context
,
new
Renderer
[]
{
videoRenderer
},
trackSelector
);
player
.
addListener
(
this
);
MediaSource
mediaSource
=
...
...
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerFactory.java
View file @
d77d661e
...
...
@@ -102,7 +102,7 @@ public final class ExoPlayerFactory {
* @param context A {@link Context}.
*/
public
static
SimpleExoPlayer
newSimpleInstance
(
Context
context
)
{
return
newSimpleInstance
(
context
,
new
DefaultTrackSelector
());
return
newSimpleInstance
(
context
,
new
DefaultTrackSelector
(
context
));
}
/**
...
...
library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java
View file @
d77d661e
...
...
@@ -15,6 +15,7 @@
*/
package
com
.
google
.
android
.
exoplayer2
.
offline
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
...
...
@@ -82,12 +83,25 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
*/
public
final
class
DownloadHelper
{
/** Default track selection parameters for downloading, but without any viewport constraints. */
public
static
final
Parameters
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
=
Parameters
.
DEFAULT_WITHOUT_VIEWPORT
.
buildUpon
().
setForceHighestSupportedBitrate
(
true
).
build
();
/**
*
The default parameters used for track selection for downloading. This default selects the
*
highest bitrate audio and video tracks which are supported by the renderers
.
*
@deprecated This instance does not have viewport constraints configured for the primary
*
display. Use {@link #getDefaultTrackSelectorParameters(Context)} instead
.
*/
@Deprecated
public
static
final
DefaultTrackSelector
.
Parameters
DEFAULT_TRACK_SELECTOR_PARAMETERS
=
new
DefaultTrackSelector
.
ParametersBuilder
().
setForceHighestSupportedBitrate
(
true
).
build
();
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
;
/** Returns the default parameters used for track selection for downloading. */
public
static
DefaultTrackSelector
.
Parameters
getDefaultTrackSelectorParameters
(
Context
context
)
{
return
Parameters
.
getDefaults
(
context
)
.
buildUpon
()
.
setForceHighestSupportedBitrate
(
true
)
.
build
();
}
/** A callback to be notified when the {@link DownloadHelper} is prepared. */
public
interface
Callback
{
...
...
@@ -120,36 +134,70 @@ public final class DownloadHelper {
private
static
final
Constructor
<?
extends
MediaSourceFactory
>
HLS_FACTORY_CONSTRUCTOR
=
getConstructor
(
"com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory"
);
/** @deprecated Use {@link #forProgressive(Context, Uri)} */
@Deprecated
@SuppressWarnings
(
"deprecation"
)
public
static
DownloadHelper
forProgressive
(
Uri
uri
)
{
return
forProgressive
(
uri
,
/* cacheKey= */
null
);
}
/**
* Creates a {@link DownloadHelper} for progressive streams.
*
* @param context Any {@link Context}.
* @param uri A stream {@link Uri}.
* @return A {@link DownloadHelper} for progressive streams.
*/
public
static
DownloadHelper
forProgressive
(
Uri
uri
)
{
return
forProgressive
(
uri
,
/* cacheKey= */
null
);
public
static
DownloadHelper
forProgressive
(
Context
context
,
Uri
uri
)
{
return
forProgressive
(
context
,
uri
,
/* cacheKey= */
null
);
}
/** @deprecated Use {@link #forProgressive(Context, Uri, String)} */
@Deprecated
public
static
DownloadHelper
forProgressive
(
Uri
uri
,
@Nullable
String
cacheKey
)
{
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_PROGRESSIVE
,
uri
,
cacheKey
,
/* mediaSource= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
,
/* rendererCapabilities= */
new
RendererCapabilities
[
0
]);
}
/**
* Creates a {@link DownloadHelper} for progressive streams.
*
* @param context Any {@link Context}.
* @param uri A stream {@link Uri}.
* @param cacheKey An optional cache key.
* @return A {@link DownloadHelper} for progressive streams.
*/
public
static
DownloadHelper
forProgressive
(
Uri
uri
,
@Nullable
String
cacheKey
)
{
public
static
DownloadHelper
forProgressive
(
Context
context
,
Uri
uri
,
@Nullable
String
cacheKey
)
{
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_PROGRESSIVE
,
uri
,
cacheKey
,
/* mediaSource= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS
,
getDefaultTrackSelectorParameters
(
context
)
,
/* rendererCapabilities= */
new
RendererCapabilities
[
0
]);
}
/** @deprecated Use {@link #forDash(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public
static
DownloadHelper
forDash
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forDash
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
}
/**
* Creates a {@link DownloadHelper} for DASH streams.
*
* @param context Any {@link Context}.
* @param uri A manifest {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
...
...
@@ -158,13 +206,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the DASH module is missing.
*/
public
static
DownloadHelper
forDash
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
Context
context
,
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forDash
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
getDefaultTrackSelectorParameters
(
context
)
);
}
/**
...
...
@@ -197,9 +248,22 @@ public final class DownloadHelper {
Util
.
getRendererCapabilities
(
renderersFactory
,
drmSessionManager
));
}
/** @deprecated Use {@link #forHls(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public
static
DownloadHelper
forHls
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forHls
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
}
/**
* Creates a {@link DownloadHelper} for HLS streams.
*
* @param context Any {@link Context}.
* @param uri A playlist {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the playlist.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
...
...
@@ -208,13 +272,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the HLS module is missing.
*/
public
static
DownloadHelper
forHls
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
Context
context
,
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forHls
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
getDefaultTrackSelectorParameters
(
context
)
);
}
/**
...
...
@@ -247,9 +314,22 @@ public final class DownloadHelper {
Util
.
getRendererCapabilities
(
renderersFactory
,
drmSessionManager
));
}
/** @deprecated Use {@link #forSmoothStreaming(Context, Uri, Factory, RenderersFactory)} */
@Deprecated
public
static
DownloadHelper
forSmoothStreaming
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forSmoothStreaming
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
}
/**
* Creates a {@link DownloadHelper} for SmoothStreaming streams.
*
* @param context Any {@link Context}.
* @param uri A manifest {@link Uri}.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
...
...
@@ -258,13 +338,16 @@ public final class DownloadHelper {
* @throws IllegalStateException If the SmoothStreaming module is missing.
*/
public
static
DownloadHelper
forSmoothStreaming
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
Context
context
,
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
return
forSmoothStreaming
(
uri
,
dataSourceFactory
,
renderersFactory
,
/* drmSessionManager= */
null
,
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
getDefaultTrackSelectorParameters
(
context
)
);
}
/**
...
...
@@ -370,10 +453,10 @@ public final class DownloadHelper {
this
.
uri
=
uri
;
this
.
cacheKey
=
cacheKey
;
this
.
mediaSource
=
mediaSource
;
this
.
trackSelector
=
new
DefaultTrackSelector
(
new
DownloadTrackSelection
.
Factory
());
this
.
trackSelector
=
new
DefaultTrackSelector
(
trackSelectorParameters
,
new
DownloadTrackSelection
.
Factory
());
this
.
rendererCapabilities
=
rendererCapabilities
;
this
.
scratchSet
=
new
SparseIntArray
();
trackSelector
.
setParameters
(
trackSelectorParameters
);
trackSelector
.
init
(
/* listener= */
()
->
{},
new
DummyBandwidthMeter
());
callbackHandler
=
new
Handler
(
Util
.
getLooper
());
window
=
new
Timeline
.
Window
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
View file @
d77d661e
...
...
@@ -186,9 +186,22 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private
final
SparseArray
<
Map
<
TrackGroupArray
,
SelectionOverride
>>
selectionOverrides
;
private
final
SparseBooleanArray
rendererDisabledFlags
;
/** Creates a builder with default initial values. */
/**
* @deprecated Initial viewport constraints will not be set based on the primary display when
* using this constructor. Use {@link #ParametersBuilder(Context)} instead.
*/
@Deprecated
public
ParametersBuilder
()
{
this
(
Parameters
.
DEFAULT
);
this
(
Parameters
.
DEFAULT_WITHOUT_VIEWPORT
);
}
/**
* Creates a builder with default initial values.
*
* @param context Any context.
*/
public
ParametersBuilder
(
Context
context
)
{
this
(
Parameters
.
getDefaults
(
context
));
}
/**
...
...
@@ -656,8 +669,22 @@ public class DefaultTrackSelector extends MappingTrackSelector {
*/
public
static
final
class
Parameters
extends
TrackSelectionParameters
{
/** An instance with default values. */
public
static
final
Parameters
DEFAULT
=
new
Parameters
();
/** An instance with default values, except without any viewport constraints. */
public
static
final
Parameters
DEFAULT_WITHOUT_VIEWPORT
=
new
Parameters
();
/**
* @deprecated This instance does not have viewport constraints configured for the primary
* display. Use {@link #getDefaults(Context)} instead.
*/
@Deprecated
public
static
final
Parameters
DEFAULT
=
DEFAULT_WITHOUT_VIEWPORT
;
/** Returns an instance configured with default values. */
public
static
Parameters
getDefaults
(
Context
context
)
{
return
DEFAULT_WITHOUT_VIEWPORT
.
buildUpon
()
.
setViewportSizeToPhysicalDisplaySize
(
context
,
/* viewportOrientationMayChange= */
true
)
.
build
();
}
// Video
/**
...
...
@@ -707,14 +734,14 @@ public class DefaultTrackSelector extends MappingTrackSelector {
public
final
boolean
allowVideoNonSeamlessAdaptiveness
;
/**
* Viewport width in pixels. Constrains video track selections for adaptive content so that only
* tracks suitable for the viewport are selected. The default value is
{@link Integer#MAX_VALUE}
*
(i.e. no constraint)
.
* tracks suitable for the viewport are selected. The default value is
the physical width of the
*
primary display, in pixels
.
*/
public
final
int
viewportWidth
;
/**
* Viewport height in pixels. Constrains video track selections for adaptive content so that
* only tracks suitable for the viewport are selected. The default value is
{@link
*
Integer#MAX_VALUE} (i.e. no constraint)
.
* only tracks suitable for the viewport are selected. The default value is
the physical height
*
of the primary display, in pixels
.
*/
public
final
int
viewportHeight
;
/**
...
...
@@ -1284,13 +1311,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private
boolean
allowMultipleAdaptiveSelections
;
/** @deprecated Use {@link #DefaultTrackSelector(Context)} instead. */
@Deprecated
@SuppressWarnings
(
"deprecation"
)
public
DefaultTrackSelector
()
{
this
(
new
AdaptiveTrackSelection
.
Factory
());
}
/**
* @deprecated Use {@link #DefaultTrackSelector(
)} instead. Custom
bandwidth meter should be
*
directly passed
to the player in {@link ExoPlayerFactory}.
* @deprecated Use {@link #DefaultTrackSelector(
Context)} instead. The
bandwidth meter should be
*
passed directly
to the player in {@link ExoPlayerFactory}.
*/
@Deprecated
@SuppressWarnings
(
"deprecation"
)
...
...
@@ -1298,10 +1328,32 @@ public class DefaultTrackSelector extends MappingTrackSelector {
this
(
new
AdaptiveTrackSelection
.
Factory
(
bandwidthMeter
));
}
/** @param trackSelectionFactory A factory for {@link TrackSelection}s. */
/** @deprecated Use {@link #DefaultTrackSelector(Context, TrackSelection.Factory)}. */
@Deprecated
public
DefaultTrackSelector
(
TrackSelection
.
Factory
trackSelectionFactory
)
{
this
(
Parameters
.
DEFAULT_WITHOUT_VIEWPORT
,
trackSelectionFactory
);
}
/** @param context Any {@link Context}. */
public
DefaultTrackSelector
(
Context
context
)
{
this
(
context
,
new
AdaptiveTrackSelection
.
Factory
());
}
/**
* @param context Any {@link Context}.
* @param trackSelectionFactory A factory for {@link TrackSelection}s.
*/
public
DefaultTrackSelector
(
Context
context
,
TrackSelection
.
Factory
trackSelectionFactory
)
{
this
(
Parameters
.
getDefaults
(
context
),
trackSelectionFactory
);
}
/**
* @param parameters Initial {@link Parameters}.
* @param trackSelectionFactory A factory for {@link TrackSelection}s.
*/
public
DefaultTrackSelector
(
Parameters
parameters
,
TrackSelection
.
Factory
trackSelectionFactory
)
{
this
.
trackSelectionFactory
=
trackSelectionFactory
;
parametersReference
=
new
AtomicReference
<>(
Parameters
.
DEFAULT
);
parametersReference
=
new
AtomicReference
<>(
parameters
);
}
/**
...
...
library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java
View file @
d77d661e
...
...
@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import
static
org
.
robolectric
.
shadows
.
ShadowBaseLooper
.
shadowMainLooper
;
import
android.net.Uri
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.Format
;
...
...
@@ -36,7 +37,6 @@ import com.google.android.exoplayer2.testutil.FakeRenderer;
import
com.google.android.exoplayer2.testutil.FakeTimeline
;
import
com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder
;
import
com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo
;
import
com.google.android.exoplayer2.trackselection.TrackSelection
;
import
com.google.android.exoplayer2.upstream.Allocator
;
...
...
@@ -113,7 +113,7 @@ public class DownloadHelperTest {
testUri
,
TEST_CACHE_KEY
,
new
TestMediaSource
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
_WITHOUT_VIEWPORT
,
Util
.
getRendererCapabilities
(
renderersFactory
,
/* drmSessionManager= */
null
));
}
...
...
@@ -244,7 +244,7 @@ public class DownloadHelperTest {
throws
Exception
{
prepareDownloadHelper
(
downloadHelper
);
DefaultTrackSelector
.
Parameters
parameters
=
new
ParametersBuilder
(
)
new
DefaultTrackSelector
.
ParametersBuilder
(
ApplicationProvider
.
getApplicationContext
()
)
.
setPreferredAudioLanguage
(
"ZH"
)
.
setPreferredTextLanguage
(
"ZH"
)
.
setRendererDisabled
(
/* rendererIndex= */
2
,
true
)
...
...
@@ -281,7 +281,7 @@ public class DownloadHelperTest {
// Select parameters to require some merging of track groups because the new parameters add
// all video tracks to initial video single track selection.
DefaultTrackSelector
.
Parameters
parameters
=
new
ParametersBuilder
(
)
new
DefaultTrackSelector
.
ParametersBuilder
(
ApplicationProvider
.
getApplicationContext
()
)
.
setPreferredAudioLanguage
(
"ZH"
)
.
setPreferredTextLanguage
(
"US"
)
.
build
();
...
...
@@ -385,7 +385,7 @@ public class DownloadHelperTest {
// Ensure we have track groups with multiple indices, renderers with multiple track groups and
// also renderers without any track groups.
DefaultTrackSelector
.
Parameters
parameters
=
new
ParametersBuilder
(
)
new
DefaultTrackSelector
.
ParametersBuilder
(
ApplicationProvider
.
getApplicationContext
()
)
.
setPreferredAudioLanguage
(
"ZH"
)
.
setPreferredTextLanguage
(
"US"
)
.
build
();
...
...
library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java
View file @
d77d661e
...
...
@@ -27,9 +27,11 @@ import static org.mockito.Mockito.verify;
import
static
org
.
mockito
.
Mockito
.
when
;
import
static
org
.
mockito
.
MockitoAnnotations
.
initMocks
;
import
android.content.Context
;
import
android.os.Parcel
;
import
android.util.SparseArray
;
import
android.util.SparseBooleanArray
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ExoPlaybackException
;
...
...
@@ -97,6 +99,7 @@ public final class DefaultTrackSelectorTest {
@Mock
private
InvalidationListener
invalidationListener
;
@Mock
private
BandwidthMeter
bandwidthMeter
;
private
Parameters
defaultParameters
;
private
DefaultTrackSelector
trackSelector
;
@BeforeClass
...
...
@@ -108,7 +111,9 @@ public final class DefaultTrackSelectorTest {
public
void
setUp
()
{
initMocks
(
this
);
when
(
bandwidthMeter
.
getBitrateEstimate
()).
thenReturn
(
1000000L
);
trackSelector
=
new
DefaultTrackSelector
();
Context
context
=
ApplicationProvider
.
getApplicationContext
();
defaultParameters
=
Parameters
.
getDefaults
(
context
);
trackSelector
=
new
DefaultTrackSelector
(
context
);
trackSelector
.
init
(
invalidationListener
,
bandwidthMeter
);
}
...
...
@@ -234,7 +239,7 @@ public final class DefaultTrackSelectorTest {
/** Tests disabling a renderer. */
@Test
public
void
testSelectTracksWithDisabledRenderer
()
throws
ExoPlaybackException
{
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setRendererDisabled
(
1
,
true
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setRendererDisabled
(
1
,
true
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
RENDERER_CAPABILITIES
,
TRACK_GROUPS
,
periodId
,
TIMELINE
);
assertSelections
(
result
,
new
TrackSelection
[]
{
TRACK_SELECTIONS
[
0
],
null
});
...
...
@@ -271,7 +276,7 @@ public final class DefaultTrackSelectorTest {
/** Tests disabling a no-sample renderer. */
@Test
public
void
testSelectTracksWithDisabledNoSampleRenderer
()
throws
ExoPlaybackException
{
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setRendererDisabled
(
1
,
true
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setRendererDisabled
(
1
,
true
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER
,
TRACK_GROUPS
,
periodId
,
TIMELINE
);
...
...
@@ -281,14 +286,13 @@ public final class DefaultTrackSelectorTest {
}
/**
* Tests that track selector will not call
*
{@link InvalidationListener#onTrackSelectionsInvalidated()} when it's set with default
*
values of
{@link Parameters}.
* Tests that track selector will not call
{@link
*
InvalidationListener#onTrackSelectionsInvalidated()} when it's set with default values of
* {@link Parameters}.
*/
@Test
public
void
testSetParameterWithDefaultParametersDoesNotNotifyInvalidationListener
()
throws
Exception
{
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
);
public
void
testSetParameterWithDefaultParametersDoesNotNotifyInvalidationListener
()
{
trackSelector
.
setParameters
(
defaultParameters
);
verify
(
invalidationListener
,
never
()).
onTrackSelectionsInvalidated
();
}
...
...
@@ -297,24 +301,22 @@ public final class DefaultTrackSelectorTest {
* when it's set with non-default values of {@link Parameters}.
*/
@Test
public
void
testSetParameterWithNonDefaultParameterNotifyInvalidationListener
()
throws
Exception
{
Parameters
parameters
=
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
).
build
();
trackSelector
.
setParameters
(
parameters
);
public
void
testSetParameterWithNonDefaultParameterNotifyInvalidationListener
()
{
ParametersBuilder
builder
=
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
);
trackSelector
.
setParameters
(
builder
);
verify
(
invalidationListener
).
onTrackSelectionsInvalidated
();
}
/**
* Tests that track selector will not call
*
{@link InvalidationListener#onTrackSelectionsInvalidated()} again when it's set with
*
the same values
of {@link Parameters}.
* Tests that track selector will not call
{@link
*
InvalidationListener#onTrackSelectionsInvalidated()} again when it's set with the same values
* of {@link Parameters}.
*/
@Test
public
void
testSetParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain
()
throws
Exception
{
ParametersBuilder
builder
=
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
);
trackSelector
.
setParameters
(
builder
.
build
());
trackSelector
.
setParameters
(
builder
.
build
());
public
void
testSetParameterWithSameParametersDoesNotNotifyInvalidationListenerAgain
()
{
ParametersBuilder
builder
=
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
);
trackSelector
.
setParameters
(
builder
);
trackSelector
.
setParameters
(
builder
);
verify
(
invalidationListener
,
times
(
1
)).
onTrackSelectionsInvalidated
();
}
...
...
@@ -426,8 +428,7 @@ public final class DefaultTrackSelectorTest {
Format
.
NO_VALUE
,
2
,
44100
,
null
,
null
,
0
,
"eng"
);
TrackGroupArray
trackGroups
=
wrapFormats
(
frAudioFormat
,
enAudioFormat
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
).
build
());
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES
},
...
...
@@ -452,8 +453,7 @@ public final class DefaultTrackSelectorTest {
Format
.
NO_VALUE
,
2
,
44100
,
null
,
null
,
0
,
"eng"
);
TrackGroupArray
trackGroups
=
wrapFormats
(
frAudioFormat
,
enAudioFormat
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
).
build
());
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES
},
...
...
@@ -523,7 +523,7 @@ public final class DefaultTrackSelectorTest {
TrackGroupArray
trackGroups
=
singleTrackGroup
(
audioFormat
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setExceedRendererCapabilitiesIfNecessary
(
false
).
build
(
));
defaultParameters
.
buildUpon
().
setExceedRendererCapabilitiesIfNecessary
(
false
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES
},
...
...
@@ -605,8 +605,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities
mappedAudioRendererCapabilities
=
new
FakeMappedRendererCapabilities
(
C
.
TRACK_TYPE_AUDIO
,
mappedCapabilities
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
).
build
());
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
mappedAudioRendererCapabilities
},
...
...
@@ -648,8 +647,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities
mappedAudioRendererCapabilities
=
new
FakeMappedRendererCapabilities
(
C
.
TRACK_TYPE_AUDIO
,
mappedCapabilities
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
).
build
());
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"eng"
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
mappedAudioRendererCapabilities
},
...
...
@@ -983,10 +981,7 @@ public final class DefaultTrackSelectorTest {
// selected.
trackGroups
=
wrapFormats
(
defaultOnly
,
noFlag
,
forcedOnly
,
forcedDefault
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
()
.
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
)
.
build
());
defaultParameters
.
buildUpon
().
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
.
get
(
0
));
...
...
@@ -997,15 +992,14 @@ public final class DefaultTrackSelectorTest {
trackSelector
.
getParameters
()
.
buildUpon
()
.
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
|
C
.
SELECTION_FLAG_FORCED
)
.
build
(
));
.
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
|
C
.
SELECTION_FLAG_FORCED
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
.
get
(
0
));
// There is a preferred language, so a language-matching track flagged as default should
// be selected, and the one without forced flag should be preferred.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredTextLanguage
(
"eng"
).
build
());
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredTextLanguage
(
"eng"
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
defaultOnly
);
...
...
@@ -1017,8 +1011,7 @@ public final class DefaultTrackSelectorTest {
trackSelector
.
getParameters
()
.
buildUpon
()
.
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
)
.
build
());
.
setDisabledTextTrackSelectionFlags
(
C
.
SELECTION_FLAG_DEFAULT
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
noFlag
);
}
...
...
@@ -1100,12 +1093,12 @@ public final class DefaultTrackSelectorTest {
assertNoSelection
(
result
.
selections
.
get
(
0
));
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setSelectUndeterminedTextLanguage
(
true
).
build
(
));
defaultParameters
.
buildUpon
().
setSelectUndeterminedTextLanguage
(
true
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilites
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
undeterminedUnd
);
ParametersBuilder
builder
=
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredTextLanguage
(
"spa"
);
trackSelector
.
setParameters
(
builder
.
build
()
);
ParametersBuilder
builder
=
defaultParameters
.
buildUpon
().
setPreferredTextLanguage
(
"spa"
);
trackSelector
.
setParameters
(
builder
);
result
=
trackSelector
.
selectTracks
(
textRendererCapabilites
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
spanish
);
...
...
@@ -1114,7 +1107,7 @@ public final class DefaultTrackSelectorTest {
result
=
trackSelector
.
selectTracks
(
textRendererCapabilites
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
.
get
(
0
));
trackSelector
.
setParameters
(
builder
.
setSelectUndeterminedTextLanguage
(
true
)
.
build
()
);
trackSelector
.
setParameters
(
builder
.
setSelectUndeterminedTextLanguage
(
true
));
result
=
trackSelector
.
selectTracks
(
textRendererCapabilites
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
undeterminedUnd
);
...
...
@@ -1158,13 +1151,13 @@ public final class DefaultTrackSelectorTest {
assertNoSelection
(
result
.
selections
.
get
(
1
));
// Explicit language preference for english. First renderer should be used.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredTextLanguage
(
"en"
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredTextLanguage
(
"en"
));
result
=
trackSelector
.
selectTracks
(
rendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
english
);
assertNoSelection
(
result
.
selections
.
get
(
1
));
// Explicit language preference for German. Second renderer should be used.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredTextLanguage
(
"de"
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredTextLanguage
(
"de"
));
result
=
trackSelector
.
selectTracks
(
rendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
.
get
(
0
));
assertFixedSelection
(
result
.
selections
.
get
(
1
),
trackGroups
,
german
);
...
...
@@ -1190,7 +1183,7 @@ public final class DefaultTrackSelectorTest {
RendererCapabilities
mappedAudioRendererCapabilities
=
new
FakeMappedRendererCapabilities
(
C
.
TRACK_TYPE_AUDIO
,
mappedCapabilities
);
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setForceLowestBitrate
(
true
).
build
(
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setForceLowestBitrate
(
true
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
mappedAudioRendererCapabilities
},
...
...
@@ -1221,7 +1214,7 @@ public final class DefaultTrackSelectorTest {
new
FakeMappedRendererCapabilities
(
C
.
TRACK_TYPE_AUDIO
,
mappedCapabilities
);
trackSelector
.
setParameters
(
new
ParametersBuilder
().
setForceHighestSupportedBitrate
(
true
).
build
(
));
defaultParameters
.
buildUpon
().
setForceHighestSupportedBitrate
(
true
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
mappedAudioRendererCapabilities
},
...
...
@@ -1269,7 +1262,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed sample rate adaptiveness, expect an adaptive selection.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setAllowAudioMixedSampleRateAdaptiveness
(
true
));
defaultParameters
.
buildUpon
().
setAllowAudioMixedSampleRateAdaptiveness
(
true
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
AUDIO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1301,7 +1294,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setAllowAudioMixedMimeTypeAdaptiveness
(
true
));
defaultParameters
.
buildUpon
().
setAllowAudioMixedMimeTypeAdaptiveness
(
true
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
AUDIO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1335,7 +1328,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 4 we expect a fixed selection containing the track with
// fewer channels.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setMaxAudioChannelCount
(
4
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setMaxAudioChannelCount
(
4
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
AUDIO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1344,7 +1337,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 2 we expect a fixed selection containing the track with
// fewer channels.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setMaxAudioChannelCount
(
2
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setMaxAudioChannelCount
(
2
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
AUDIO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1353,7 +1346,7 @@ public final class DefaultTrackSelectorTest {
// If we constrain the channel count to 1 we expect a fixed selection containing the track with
// fewer channels.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setMaxAudioChannelCount
(
1
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setMaxAudioChannelCount
(
1
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
AUDIO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1362,7 +1355,7 @@ public final class DefaultTrackSelectorTest {
// If we disable exceeding of constraints we expect no selection.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
defaultParameters
.
buildUpon
()
.
setMaxAudioChannelCount
(
1
)
.
setExceedAudioConstraintsIfNecessary
(
false
));
...
...
@@ -1424,13 +1417,13 @@ public final class DefaultTrackSelectorTest {
assertNoSelection
(
result
.
selections
.
get
(
1
));
// Explicit language preference for english. First renderer should be used.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"en"
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"en"
));
result
=
trackSelector
.
selectTracks
(
rendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertFixedSelection
(
result
.
selections
.
get
(
0
),
trackGroups
,
english
);
assertNoSelection
(
result
.
selections
.
get
(
1
));
// Explicit language preference for German. Second renderer should be used.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setPreferredAudioLanguage
(
"de"
));
trackSelector
.
setParameters
(
defaultParameters
.
buildUpon
().
setPreferredAudioLanguage
(
"de"
));
result
=
trackSelector
.
selectTracks
(
rendererCapabilities
,
trackGroups
,
periodId
,
TIMELINE
);
assertNoSelection
(
result
.
selections
.
get
(
0
));
assertFixedSelection
(
result
.
selections
.
get
(
1
),
trackGroups
,
german
);
...
...
@@ -1456,7 +1449,7 @@ public final class DefaultTrackSelectorTest {
// Should do non-seamless adaptiveness by default, so expect an adaptive selection.
TrackGroupArray
trackGroups
=
singleTrackGroup
(
buildVideoFormat
(
"0"
),
buildVideoFormat
(
"1"
));
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setAllowVideoNonSeamlessAdaptiveness
(
true
));
defaultParameters
.
buildUpon
().
setAllowVideoNonSeamlessAdaptiveness
(
true
));
TrackSelectorResult
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
nonSeamlessVideoCapabilities
},
...
...
@@ -1468,7 +1461,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly disable non-seamless adaptiveness, expect a fixed selection.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setAllowVideoNonSeamlessAdaptiveness
(
false
));
defaultParameters
.
buildUpon
().
setAllowVideoNonSeamlessAdaptiveness
(
false
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
nonSeamlessVideoCapabilities
},
...
...
@@ -1503,7 +1496,7 @@ public final class DefaultTrackSelectorTest {
// If we explicitly enable mixed mime type adaptiveness, expect an adaptive selection.
trackSelector
.
setParameters
(
Parameters
.
DEFAULT
.
buildUpon
().
setAllowVideoMixedMimeTypeAdaptiveness
(
true
));
defaultParameters
.
buildUpon
().
setAllowVideoMixedMimeTypeAdaptiveness
(
true
));
result
=
trackSelector
.
selectTracks
(
new
RendererCapabilities
[]
{
VIDEO_CAPABILITIES
},
trackGroups
,
periodId
,
TIMELINE
);
...
...
@@ -1760,13 +1753,13 @@ public final class DefaultTrackSelectorTest {
}
@Override
public
int
supportsFormat
(
Format
format
)
throws
ExoPlaybackException
{
public
int
supportsFormat
(
Format
format
)
{
return
MimeTypes
.
getTrackType
(
format
.
sampleMimeType
)
==
trackType
?
(
supportValue
)
:
FORMAT_UNSUPPORTED_TYPE
;
}
@Override
public
int
supportsMixedMimeTypeAdaptation
()
throws
ExoPlaybackException
{
public
int
supportsMixedMimeTypeAdaptation
()
{
return
ADAPTIVE_SEAMLESS
;
}
...
...
@@ -1801,14 +1794,14 @@ public final class DefaultTrackSelectorTest {
}
@Override
public
int
supportsFormat
(
Format
format
)
throws
ExoPlaybackException
{
public
int
supportsFormat
(
Format
format
)
{
return
format
.
id
!=
null
&&
formatToCapability
.
containsKey
(
format
.
id
)
?
formatToCapability
.
get
(
format
.
id
)
:
FORMAT_UNSUPPORTED_TYPE
;
}
@Override
public
int
supportsMixedMimeTypeAdaptation
()
throws
ExoPlaybackException
{
public
int
supportsMixedMimeTypeAdaptation
()
{
return
ADAPTIVE_SEAMLESS
;
}
...
...
library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java
View file @
d77d661e
...
...
@@ -16,6 +16,7 @@
package
com
.
google
.
android
.
exoplayer2
.
source
.
dash
.
offline
;
import
android.net.Uri
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.drm.DrmSessionManager
;
...
...
@@ -31,6 +32,7 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForDash_doesNotThrow
()
{
DownloadHelper
.
forDash
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
]);
...
...
@@ -39,6 +41,6 @@ public final class DownloadHelperTest {
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
DrmSessionManager
.
getDummyDrmSessionManager
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
_WITHOUT_VIEWPORT
);
}
}
library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/DownloadHelperTest.java
View file @
d77d661e
...
...
@@ -16,6 +16,7 @@
package
com
.
google
.
android
.
exoplayer2
.
source
.
hls
.
offline
;
import
android.net.Uri
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.offline.DownloadHelper
;
...
...
@@ -30,6 +31,7 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForHls_doesNotThrow
()
{
DownloadHelper
.
forHls
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
]);
...
...
@@ -38,6 +40,6 @@ public final class DownloadHelperTest {
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
null
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
_WITHOUT_VIEWPORT
);
}
}
library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/DownloadHelperTest.java
View file @
d77d661e
...
...
@@ -16,6 +16,7 @@
package
com
.
google
.
android
.
exoplayer2
.
source
.
smoothstreaming
.
offline
;
import
android.net.Uri
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.offline.DownloadHelper
;
...
...
@@ -30,6 +31,7 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForSmoothStreaming_doesNotThrow
()
{
DownloadHelper
.
forSmoothStreaming
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
]);
...
...
@@ -38,6 +40,6 @@ public final class DownloadHelperTest {
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
,
drm
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
null
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
);
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS
_WITHOUT_VIEWPORT
);
}
}
playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/DashTestRunner.java
View file @
d77d661e
...
...
@@ -24,7 +24,6 @@ import android.net.Uri;
import
android.view.Surface
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.DefaultLoadControl
;
import
com.google.android.exoplayer2.ExoPlaybackException
;
import
com.google.android.exoplayer2.ExoPlayerFactory
;
import
com.google.android.exoplayer2.Format
;
import
com.google.android.exoplayer2.RendererCapabilities
;
...
...
@@ -385,8 +384,7 @@ public final class DashTestRunner {
MappedTrackInfo
mappedTrackInfo
,
int
[][][]
rendererFormatSupports
,
int
[]
rendererMixedMimeTypeAdaptationSupports
,
Parameters
parameters
)
throws
ExoPlaybackException
{
Parameters
parameters
)
{
Assertions
.
checkState
(
mappedTrackInfo
.
getRendererType
(
VIDEO_RENDERER_INDEX
)
==
C
.
TRACK_TYPE_VIDEO
);
Assertions
.
checkState
(
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoHostedTest.java
View file @
d77d661e
...
...
@@ -37,7 +37,6 @@ import com.google.android.exoplayer2.drm.DrmSessionManager;
import
com.google.android.exoplayer2.drm.FrameworkMediaCrypto
;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.testutil.HostActivity.HostedTest
;
import
com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.google.android.exoplayer2.trackselection.MappingTrackSelector
;
import
com.google.android.exoplayer2.util.Clock
;
...
...
@@ -238,7 +237,7 @@ public abstract class ExoHostedTest implements AnalyticsListener, HostedTest {
}
protected
DefaultTrackSelector
buildTrackSelector
(
HostActivity
host
)
{
return
new
DefaultTrackSelector
(
new
AdaptiveTrackSelection
.
Factory
()
);
return
new
DefaultTrackSelector
(
host
);
}
protected
SimpleExoPlayer
buildExoPlayer
(
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
View file @
d77d661e
...
...
@@ -284,7 +284,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
supportedFormats
=
new
Format
[]
{
VIDEO_FORMAT
};
}
if
(
trackSelector
==
null
)
{
trackSelector
=
new
DefaultTrackSelector
();
trackSelector
=
new
DefaultTrackSelector
(
context
);
}
if
(
bandwidthMeter
==
null
)
{
bandwidthMeter
=
new
DefaultBandwidthMeter
.
Builder
(
context
).
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