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
d233c045
authored
May 20, 2020
by
bachinger
Committed by
tonihei
May 21, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Simplify DownloadHelper
PiperOrigin-RevId: 312467496
parent
b9157a9e
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
286 additions
and
321 deletions
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
library/core/proguard-rules.txt
library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java
library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.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
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
View file @
d233c045
...
...
@@ -24,7 +24,6 @@ import android.widget.Toast;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.fragment.app.FragmentManager
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.RenderersFactory
;
import
com.google.android.exoplayer2.offline.Download
;
...
...
@@ -106,7 +105,9 @@ public class DownloadTracker {
}
startDownloadDialogHelper
=
new
StartDownloadDialogHelper
(
fragmentManager
,
getDownloadHelper
(
mediaItem
,
renderersFactory
),
mediaItem
);
fragmentManager
,
DownloadHelper
.
forMediaItem
(
context
,
mediaItem
,
renderersFactory
,
dataSourceFactory
),
mediaItem
);
}
}
...
...
@@ -121,28 +122,6 @@ public class DownloadTracker {
}
}
private
DownloadHelper
getDownloadHelper
(
MediaItem
mediaItem
,
RenderersFactory
renderersFactory
)
{
MediaItem
.
PlaybackProperties
playbackProperties
=
checkNotNull
(
mediaItem
.
playbackProperties
);
@C
.
ContentType
int
type
=
Util
.
inferContentTypeWithMimeType
(
playbackProperties
.
uri
,
playbackProperties
.
mimeType
);
switch
(
type
)
{
case
C
.
TYPE_DASH
:
return
DownloadHelper
.
forDash
(
context
,
playbackProperties
.
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_SS
:
return
DownloadHelper
.
forSmoothStreaming
(
context
,
playbackProperties
.
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_HLS
:
return
DownloadHelper
.
forHls
(
context
,
playbackProperties
.
uri
,
dataSourceFactory
,
renderersFactory
);
case
C
.
TYPE_OTHER
:
return
DownloadHelper
.
forProgressive
(
context
,
playbackProperties
.
uri
);
default
:
throw
new
IllegalStateException
(
"Unsupported type: "
+
type
);
}
}
private
class
DownloadManagerListener
implements
DownloadManager
.
Listener
{
@Override
...
...
library/core/proguard-rules.txt
View file @
d233c045
...
...
@@ -62,7 +62,7 @@
<init>(android.net.Uri, java.util.List, com.google.android.exoplayer2.upstream.cache.CacheDataSource.Factory, java.util.concurrent.Executor);
}
# Constructors accessed via reflection in DefaultMediaSourceFactory
and DownloadHelper
# Constructors accessed via reflection in DefaultMediaSourceFactory
-dontnote com.google.android.exoplayer2.source.dash.DashMediaSource$Factory
-keepclasseswithmembers class com.google.android.exoplayer2.source.dash.DashMediaSource$Factory {
<init>(com.google.android.exoplayer2.upstream.DataSource$Factory);
...
...
library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java
View file @
d233c045
...
...
@@ -15,6 +15,9 @@
*/
package
com
.
google
.
android
.
exoplayer2
.
offline
;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Assertions
.
checkNotNull
;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Util
.
castNonNull
;
import
android.content.Context
;
import
android.net.Uri
;
import
android.os.Handler
;
...
...
@@ -24,18 +27,18 @@ import android.util.SparseIntArray;
import
androidx.annotation.Nullable
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ExoPlaybackException
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.RendererCapabilities
;
import
com.google.android.exoplayer2.RenderersFactory
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.audio.AudioRendererEventListener
;
import
com.google.android.exoplayer2.drm.DrmSessionManager
;
import
com.google.android.exoplayer2.source.DefaultMediaSourceFactory
;
import
com.google.android.exoplayer2.source.MediaPeriod
;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.source.MediaSource.MediaPeriodId
;
import
com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller
;
import
com.google.android.exoplayer2.source.MediaSourceFactory
;
import
com.google.android.exoplayer2.source.ProgressiveMediaSource
;
import
com.google.android.exoplayer2.source.TrackGroup
;
import
com.google.android.exoplayer2.source.TrackGroupArray
;
import
com.google.android.exoplayer2.source.chunk.MediaChunk
;
...
...
@@ -50,14 +53,13 @@ import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
import
com.google.android.exoplayer2.upstream.Allocator
;
import
com.google.android.exoplayer2.upstream.BandwidthMeter
;
import
com.google.android.exoplayer2.upstream.DataSource
;
import
com.google.android.exoplayer2.upstream.DataSource.Factory
;
import
com.google.android.exoplayer2.upstream.DefaultAllocator
;
import
com.google.android.exoplayer2.upstream.TransferListener
;
import
com.google.android.exoplayer2.util.Assertions
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
com.google.android.exoplayer2.util.Util
;
import
com.google.android.exoplayer2.video.VideoRendererEventListener
;
import
java.io.IOException
;
import
java.lang.reflect.Constructor
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
...
...
@@ -144,18 +146,6 @@ public final class DownloadHelper {
/** Thrown at an attempt to download live content. */
public
static
class
LiveContentUnsupportedException
extends
IOException
{}
@Nullable
private
static
final
Constructor
<?
extends
MediaSourceFactory
>
DASH_FACTORY_CONSTRUCTOR
=
getConstructor
(
"com.google.android.exoplayer2.source.dash.DashMediaSource$Factory"
);
@Nullable
private
static
final
Constructor
<?
extends
MediaSourceFactory
>
SS_FACTORY_CONSTRUCTOR
=
getConstructor
(
"com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource$Factory"
);
@Nullable
private
static
final
Constructor
<?
extends
MediaSourceFactory
>
HLS_FACTORY_CONSTRUCTOR
=
getConstructor
(
"com.google.android.exoplayer2.source.hls.HlsMediaSource$Factory"
);
/**
* Extracts renderer capabilities for the renderers created by the provided renderers factory.
*
...
...
@@ -178,77 +168,25 @@ public final class DownloadHelper {
return
capabilities
;
}
/** @deprecated Use {@link #for
Progressive(Context, Uri
)} */
/** @deprecated Use {@link #for
MediaItem(Context, MediaItem
)} */
@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
(
Context
context
,
Uri
uri
)
{
return
for
Progressive
(
context
,
uri
,
/* cacheKey= */
null
);
return
for
MediaItem
(
context
,
new
MediaItem
.
Builder
().
setUri
(
uri
).
build
()
);
}
/** @deprecated Use {@link #for
Progressive(Context, Uri, String
)} */
/** @deprecated Use {@link #for
MediaItem(Context, MediaItem
)} */
@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
(
Context
context
,
Uri
uri
,
@Nullable
String
cacheKey
)
{
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_PROGRESSIVE
,
uri
,
cacheKey
,
/* mediaSource= */
null
,
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
);
return
forMediaItem
(
context
,
new
MediaItem
.
Builder
().
setUri
(
uri
).
setCustomCacheKey
(
cacheKey
).
build
());
}
/**
* 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
* selected.
* @return A {@link DownloadHelper} for DASH streams.
* @throws IllegalStateException If the DASH module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory)} instead.
*/
@SuppressWarnings
(
"deprecation"
)
@Deprecated
public
static
DownloadHelper
forDash
(
Context
context
,
Uri
uri
,
...
...
@@ -263,62 +201,30 @@ public final class DownloadHelper {
}
/**
* Creates a {@link DownloadHelper} for DASH streams.
*
* @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
* selected.
* @param drmSessionManager An optional {@link DrmSessionManager}. Used to help determine which
* tracks can be selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
* downloading.
* @return A {@link DownloadHelper} for DASH streams.
* @throws IllegalStateException If the DASH module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead.
*/
@Deprecated
public
static
DownloadHelper
forDash
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
,
@Nullable
DrmSessionManager
drmSessionManager
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
)
{
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_DASH
,
uri
,
/* cacheKey= */
null
,
createMediaSourceInternal
(
DASH_FACTORY_CONSTRUCTOR
,
uri
,
dataSourceFactory
,
drmSessionManager
,
/* streamKeys= */
null
),
return
forMediaItem
(
new
MediaItem
.
Builder
().
setUri
(
uri
).
setMimeType
(
MimeTypes
.
APPLICATION_MPD
).
build
(),
trackSelectorParameters
,
getRendererCapabilities
(
renderersFactory
));
}
/** @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
);
dataSourceFactory
,
drmSessionManager
);
}
/**
* 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
* selected.
* @return A {@link DownloadHelper} for HLS streams.
* @throws IllegalStateException If the HLS module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory)} instead.
*/
@SuppressWarnings
(
"deprecation"
)
@Deprecated
public
static
DownloadHelper
forHls
(
Context
context
,
Uri
uri
,
...
...
@@ -333,40 +239,29 @@ public final class DownloadHelper {
}
/**
* Creates a {@link DownloadHelper} for HLS streams.
*
* @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
* selected.
* @param drmSessionManager An optional {@link DrmSessionManager}. Used to help determine which
* tracks can be selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
* downloading.
* @return A {@link DownloadHelper} for HLS streams.
* @throws IllegalStateException If the HLS module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead.
*/
@Deprecated
public
static
DownloadHelper
forHls
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
,
@Nullable
DrmSessionManager
drmSessionManager
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
)
{
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_HLS
,
uri
,
/* cacheKey= */
null
,
createMediaSourceInternal
(
HLS_FACTORY_CONSTRUCTOR
,
uri
,
dataSourceFactory
,
drmSessionManager
,
/* streamKeys= */
null
),
return
forMediaItem
(
new
MediaItem
.
Builder
().
setUri
(
uri
).
setMimeType
(
MimeTypes
.
APPLICATION_M3U8
).
build
(),
trackSelectorParameters
,
getRendererCapabilities
(
renderersFactory
));
renderersFactory
,
dataSourceFactory
,
drmSessionManager
);
}
/** @deprecated Use {@link #forSmoothStreaming(Context, Uri, Factory, RenderersFactory)} */
/**
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory)} instead.
*/
@SuppressWarnings
(
"deprecation"
)
@Deprecated
public
static
DownloadHelper
forSmoothStreaming
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
)
{
...
...
@@ -379,16 +274,11 @@ public final class DownloadHelper {
}
/**
* 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
* selected.
* @return A {@link DownloadHelper} for SmoothStreaming streams.
* @throws IllegalStateException If the SmoothStreaming module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory)} instead.
*/
@SuppressWarnings
(
"deprecation"
)
@Deprecated
public
static
DownloadHelper
forSmoothStreaming
(
Context
context
,
Uri
uri
,
...
...
@@ -403,37 +293,139 @@ public final class DownloadHelper {
}
/**
* Creates a {@link DownloadHelper} for SmoothStreaming streams.
*
* @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
* selected.
* @param drmSessionManager An optional {@link DrmSessionManager}. Used to help determine which
* tracks can be selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
* downloading.
* @return A {@link DownloadHelper} for SmoothStreaming streams.
* @throws IllegalStateException If the SmoothStreaming module is missing.
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
* DataSource.Factory, DrmSessionManager)} instead.
*/
@Deprecated
public
static
DownloadHelper
forSmoothStreaming
(
Uri
uri
,
DataSource
.
Factory
dataSourceFactory
,
RenderersFactory
renderersFactory
,
@Nullable
DrmSessionManager
drmSessionManager
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
)
{
return
forMediaItem
(
new
MediaItem
.
Builder
().
setUri
(
uri
).
setMimeType
(
MimeTypes
.
APPLICATION_SS
).
build
(),
trackSelectorParameters
,
renderersFactory
,
dataSourceFactory
,
drmSessionManager
);
}
/**
* Creates a {@link DownloadHelper} for the given progressive media item.
*
* @param context The context.
* @param mediaItem A {@link MediaItem}.
* @return A {@link DownloadHelper} for progressive streams.
* @throws IllegalStateException If the media item is of type DASH, HLS or SmoothStreaming.
*/
public
static
DownloadHelper
forMediaItem
(
Context
context
,
MediaItem
mediaItem
)
{
Assertions
.
checkArgument
(
DownloadRequest
.
TYPE_PROGRESSIVE
.
equals
(
getDownloadType
(
checkNotNull
(
mediaItem
.
playbackProperties
))));
return
forMediaItem
(
mediaItem
,
getDefaultTrackSelectorParameters
(
context
),
/* renderersFactory= */
null
,
/* dataSourceFactory= */
null
,
/* drmSessionManager= */
null
);
}
/**
* Creates a {@link DownloadHelper} for the given media item.
*
* @param context The context.
* @param mediaItem A {@link MediaItem}.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
* selected.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
* streams. This argument is required for adaptive streams and ignored for progressive
* streams.
* @return A {@link DownloadHelper}.
* @throws IllegalStateException If the the corresponding module is missing for DASH, HLS or
* SmoothStreaming media items.
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
*/
public
static
DownloadHelper
forMediaItem
(
Context
context
,
MediaItem
mediaItem
,
@Nullable
RenderersFactory
renderersFactory
,
@Nullable
DataSource
.
Factory
dataSourceFactory
)
{
return
forMediaItem
(
mediaItem
,
getDefaultTrackSelectorParameters
(
context
),
renderersFactory
,
dataSourceFactory
,
/* drmSessionManager= */
null
);
}
/**
* Creates a {@link DownloadHelper} for the given media item.
*
* @param mediaItem A {@link MediaItem}.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
* selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
* downloading.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
* streams. This argument is required for adaptive streams and ignored for progressive
* streams.
* @return A {@link DownloadHelper}.
* @throws IllegalStateException If the the corresponding module is missing for DASH, HLS or
* SmoothStreaming media items.
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
*/
public
static
DownloadHelper
forMediaItem
(
MediaItem
mediaItem
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
,
@Nullable
RenderersFactory
renderersFactory
,
@Nullable
DataSource
.
Factory
dataSourceFactory
)
{
return
forMediaItem
(
mediaItem
,
trackSelectorParameters
,
renderersFactory
,
dataSourceFactory
,
/* drmSessionManager= */
null
);
}
/**
* Creates a {@link DownloadHelper} for the given media item.
*
* @param mediaItem A {@link MediaItem}.
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
* selected.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
* downloading.
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
* streams. This argument is required for adaptive streams and ignored for progressive
* streams.
* @param drmSessionManager An optional {@link DrmSessionManager}. Used to help determine which
* tracks can be selected.
* @return A {@link DownloadHelper}.
* @throws IllegalStateException If the the corresponding module is missing for DASH, HLS or
* SmoothStreaming media items.
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
*/
public
static
DownloadHelper
forMediaItem
(
MediaItem
mediaItem
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
,
@Nullable
RenderersFactory
renderersFactory
,
@Nullable
DataSource
.
Factory
dataSourceFactory
,
@Nullable
DrmSessionManager
drmSessionManager
)
{
boolean
isProgressive
=
DownloadRequest
.
TYPE_PROGRESSIVE
.
equals
(
getDownloadType
(
checkNotNull
(
mediaItem
.
playbackProperties
)));
Assertions
.
checkArgument
(
isProgressive
||
dataSourceFactory
!=
null
);
return
new
DownloadHelper
(
DownloadRequest
.
TYPE_SS
,
uri
,
/* cacheKey= */
null
,
createMediaSourceInternal
(
SS_FACTORY_CONSTRUCTOR
,
uri
,
dataSourceFactory
,
drmSessionManager
,
/* streamKeys= */
null
),
mediaItem
,
isProgressive
?
null
:
createMediaSourceInternal
(
mediaItem
,
castNonNull
(
dataSourceFactory
),
drmSessionManager
),
trackSelectorParameters
,
getRendererCapabilities
(
renderersFactory
));
renderersFactory
!=
null
?
getRendererCapabilities
(
renderersFactory
)
:
new
RendererCapabilities
[
0
]);
}
/**
...
...
@@ -459,35 +451,18 @@ public final class DownloadHelper {
DownloadRequest
downloadRequest
,
DataSource
.
Factory
dataSourceFactory
,
@Nullable
DrmSessionManager
drmSessionManager
)
{
@Nullable
Constructor
<?
extends
MediaSourceFactory
>
constructor
;
switch
(
downloadRequest
.
type
)
{
case
DownloadRequest
.
TYPE_DASH
:
constructor
=
DASH_FACTORY_CONSTRUCTOR
;
break
;
case
DownloadRequest
.
TYPE_SS
:
constructor
=
SS_FACTORY_CONSTRUCTOR
;
break
;
case
DownloadRequest
.
TYPE_HLS
:
constructor
=
HLS_FACTORY_CONSTRUCTOR
;
break
;
case
DownloadRequest
.
TYPE_PROGRESSIVE
:
return
new
ProgressiveMediaSource
.
Factory
(
dataSourceFactory
)
.
setCustomCacheKey
(
downloadRequest
.
customCacheKey
)
.
createMediaSource
(
downloadRequest
.
uri
);
default
:
throw
new
IllegalStateException
(
"Unsupported type: "
+
downloadRequest
.
type
);
}
return
createMediaSourceInternal
(
constructor
,
downloadRequest
.
uri
,
new
MediaItem
.
Builder
()
.
setUri
(
downloadRequest
.
uri
)
.
setCustomCacheKey
(
downloadRequest
.
customCacheKey
)
.
setMimeType
(
getMimeType
(
downloadRequest
.
type
))
.
setStreamKeys
(
downloadRequest
.
streamKeys
)
.
build
(),
dataSourceFactory
,
drmSessionManager
,
downloadRequest
.
streamKeys
);
drmSessionManager
);
}
private
final
String
downloadType
;
private
final
Uri
uri
;
@Nullable
private
final
String
cacheKey
;
private
final
MediaItem
.
PlaybackProperties
playbackProperties
;
@Nullable
private
final
MediaSource
mediaSource
;
private
final
DefaultTrackSelector
trackSelector
;
private
final
RendererCapabilities
[]
rendererCapabilities
;
...
...
@@ -506,9 +481,7 @@ public final class DownloadHelper {
/**
* Creates download helper.
*
* @param downloadType A download type. This value will be used as {@link DownloadRequest#type}.
* @param uri A {@link Uri}.
* @param cacheKey An optional cache key.
* @param mediaItem The media item.
* @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track
* selection needs to be made.
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
...
...
@@ -517,15 +490,11 @@ public final class DownloadHelper {
* are selected.
*/
public
DownloadHelper
(
String
downloadType
,
Uri
uri
,
@Nullable
String
cacheKey
,
MediaItem
mediaItem
,
@Nullable
MediaSource
mediaSource
,
DefaultTrackSelector
.
Parameters
trackSelectorParameters
,
RendererCapabilities
[]
rendererCapabilities
)
{
this
.
downloadType
=
downloadType
;
this
.
uri
=
uri
;
this
.
cacheKey
=
cacheKey
;
this
.
playbackProperties
=
checkNotNull
(
mediaItem
.
playbackProperties
);
this
.
mediaSource
=
mediaSource
;
this
.
trackSelector
=
new
DefaultTrackSelector
(
trackSelectorParameters
,
new
DownloadTrackSelection
.
Factory
());
...
...
@@ -766,7 +735,7 @@ public final class DownloadHelper {
* @return The built {@link DownloadRequest}.
*/
public
DownloadRequest
getDownloadRequest
(
@Nullable
byte
[]
data
)
{
return
getDownloadRequest
(
uri
.
toString
(),
data
);
return
getDownloadRequest
(
playbackProperties
.
uri
.
toString
(),
data
);
}
/**
...
...
@@ -778,9 +747,15 @@ public final class DownloadHelper {
* @return The built {@link DownloadRequest}.
*/
public
DownloadRequest
getDownloadRequest
(
String
id
,
@Nullable
byte
[]
data
)
{
String
downloadType
=
getDownloadType
(
playbackProperties
);
if
(
mediaSource
==
null
)
{
return
new
DownloadRequest
(
id
,
downloadType
,
uri
,
/* streamKeys= */
Collections
.
emptyList
(),
cacheKey
,
data
);
id
,
downloadType
,
playbackProperties
.
uri
,
/* streamKeys= */
Collections
.
emptyList
(),
playbackProperties
.
customCacheKey
,
data
);
}
assertPreparedWithMedia
();
List
<
StreamKey
>
streamKeys
=
new
ArrayList
<>();
...
...
@@ -794,15 +769,21 @@ public final class DownloadHelper {
}
streamKeys
.
addAll
(
mediaPreparer
.
mediaPeriods
[
periodIndex
].
getStreamKeys
(
allSelections
));
}
return
new
DownloadRequest
(
id
,
downloadType
,
uri
,
streamKeys
,
cacheKey
,
data
);
return
new
DownloadRequest
(
id
,
downloadType
,
playbackProperties
.
uri
,
streamKeys
,
playbackProperties
.
customCacheKey
,
data
);
}
// Initialization of array of Lists.
@SuppressWarnings
(
"unchecked"
)
private
void
onMediaPrepared
()
{
Assertions
.
checkNotNull
(
mediaPreparer
);
Assertions
.
checkNotNull
(
mediaPreparer
.
mediaPeriods
);
Assertions
.
checkNotNull
(
mediaPreparer
.
timeline
);
checkNotNull
(
mediaPreparer
);
checkNotNull
(
mediaPreparer
.
mediaPeriods
);
checkNotNull
(
mediaPreparer
.
timeline
);
int
periodCount
=
mediaPreparer
.
mediaPeriods
.
length
;
int
rendererCount
=
rendererCapabilities
.
length
;
trackSelectionsByPeriodAndRenderer
=
...
...
@@ -822,16 +803,14 @@ public final class DownloadHelper {
trackGroupArrays
[
i
]
=
mediaPreparer
.
mediaPeriods
[
i
].
getTrackGroups
();
TrackSelectorResult
trackSelectorResult
=
runTrackSelection
(
/* periodIndex= */
i
);
trackSelector
.
onSelectionActivated
(
trackSelectorResult
.
info
);
mappedTrackInfos
[
i
]
=
Assertions
.
checkNotNull
(
trackSelector
.
getCurrentMappedTrackInfo
());
mappedTrackInfos
[
i
]
=
checkNotNull
(
trackSelector
.
getCurrentMappedTrackInfo
());
}
setPreparedWithMedia
();
Assertions
.
checkNotNull
(
callbackHandler
)
.
post
(()
->
Assertions
.
checkNotNull
(
callback
).
onPrepared
(
this
));
checkNotNull
(
callbackHandler
).
post
(()
->
checkNotNull
(
callback
).
onPrepared
(
this
));
}
private
void
onMediaPreparationFailed
(
IOException
error
)
{
Assertions
.
checkNotNull
(
callbackHandler
)
.
post
(()
->
Assertions
.
checkNotNull
(
callback
).
onPrepareError
(
this
,
error
));
checkNotNull
(
callbackHandler
).
post
(()
->
checkNotNull
(
callback
).
onPrepareError
(
this
,
error
));
}
@RequiresNonNull
({
...
...
@@ -921,43 +900,43 @@ public final class DownloadHelper {
}
}
@Nullable
private
static
Constructor
<?
extends
MediaSourceFactory
>
getConstructor
(
String
className
)
{
try
{
// LINT.IfChange
Class
<?
extends
MediaSourceFactory
>
factoryClazz
=
Class
.
forName
(
className
).
asSubclass
(
MediaSourceFactory
.
class
);
return
factoryClazz
.
getConstructor
(
Factory
.
class
);
// LINT.ThenChange(../../../../../../../../proguard-rules.txt)
}
catch
(
ClassNotFoundException
e
)
{
// Expected if the app was built without the respective module.
return
null
;
}
catch
(
NoSuchMethodException
e
)
{
// Something is wrong with the library or the proguard configuration.
throw
new
IllegalStateException
(
e
);
}
private
static
MediaSource
createMediaSourceInternal
(
MediaItem
mediaItem
,
DataSource
.
Factory
dataSourceFactory
,
@Nullable
DrmSessionManager
drmSessionManager
)
{
return
new
DefaultMediaSourceFactory
(
dataSourceFactory
,
/* adSupportProvider= */
null
)
.
setDrmSessionManager
(
drmSessionManager
)
.
createMediaSource
(
mediaItem
);
}
private
static
MediaSource
createMediaSourceInternal
(
@Nullable
Constructor
<?
extends
MediaSourceFactory
>
constructor
,
Uri
uri
,
Factory
dataSourceFactory
,
@Nullable
DrmSessionManager
drmSessionManager
,
@Nullable
List
<
StreamKey
>
streamKeys
)
{
if
(
constructor
==
null
)
{
throw
new
IllegalStateException
(
"Module missing to create media source."
);
private
static
String
getDownloadType
(
MediaItem
.
PlaybackProperties
playbackProperties
)
{
int
contentType
=
Util
.
inferContentTypeWithMimeType
(
playbackProperties
.
uri
,
playbackProperties
.
mimeType
);
switch
(
contentType
)
{
case
C
.
TYPE_DASH
:
return
DownloadRequest
.
TYPE_DASH
;
case
C
.
TYPE_HLS
:
return
DownloadRequest
.
TYPE_HLS
;
case
C
.
TYPE_SS
:
return
DownloadRequest
.
TYPE_SS
;
default
:
return
DownloadRequest
.
TYPE_PROGRESSIVE
;
}
try
{
MediaSourceFactory
factory
=
constructor
.
newInstance
(
dataSourceFactory
);
if
(
drmSessionManager
!=
null
)
{
factory
.
setDrmSessionManager
(
drmSessionManager
);
}
if
(
streamKeys
!=
null
)
{
factory
.
setStreamKeys
(
streamKeys
);
}
return
Assertions
.
checkNotNull
(
factory
.
createMediaSource
(
uri
));
}
catch
(
Exception
e
)
{
throw
new
IllegalStateException
(
"Failed to instantiate media source."
,
e
);
}
@Nullable
private
static
String
getMimeType
(
String
downloadType
)
{
switch
(
downloadType
)
{
case
DownloadRequest
.
TYPE_DASH
:
return
MimeTypes
.
APPLICATION_MPD
;
case
DownloadRequest
.
TYPE_HLS
:
return
MimeTypes
.
APPLICATION_M3U8
;
case
DownloadRequest
.
TYPE_SS
:
return
MimeTypes
.
APPLICATION_SS
;
case
DownloadRequest
.
TYPE_PROGRESSIVE
:
return
null
;
default
:
throw
new
IllegalArgumentException
();
}
}
...
...
@@ -1115,7 +1094,7 @@ public final class DownloadHelper {
return
true
;
case
DOWNLOAD_HELPER_CALLBACK_MESSAGE_FAILED:
release
();
downloadHelper
.
onMediaPreparationFailed
((
IOException
)
Util
.
castNonNull
(
msg
.
obj
));
downloadHelper
.
onMediaPreparationFailed
((
IOException
)
castNonNull
(
msg
.
obj
));
return
true
;
default
:
return
false
;
...
...
library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadHelperTest.java
View file @
d233c045
...
...
@@ -18,11 +18,11 @@ package com.google.android.exoplayer2.offline;
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
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.RenderersFactory
;
import
com.google.android.exoplayer2.Timeline
;
...
...
@@ -59,8 +59,6 @@ import org.robolectric.annotation.LooperMode;
@LooperMode
(
LooperMode
.
Mode
.
PAUSED
)
public
class
DownloadHelperTest
{
private
static
final
String
TEST_DOWNLOAD_TYPE
=
"downloadType"
;
private
static
final
String
TEST_CACHE_KEY
=
"cacheKey"
;
private
static
final
Object
TEST_MANIFEST
=
new
Object
();
private
static
final
Timeline
TEST_TIMELINE
=
new
FakeTimeline
(
...
...
@@ -86,7 +84,7 @@ public class DownloadHelperTest {
private
static
TrackGroupArray
trackGroupArraySingle
;
private
static
TrackGroupArray
[]
trackGroupArrays
;
private
static
Uri
testUri
;
private
static
MediaItem
testMediaItem
;
private
DownloadHelper
downloadHelper
;
...
...
@@ -114,7 +112,8 @@ public class DownloadHelperTest {
trackGroupArrays
=
new
TrackGroupArray
[]
{
trackGroupArrayAll
,
trackGroupArraySingle
};
testUri
=
Uri
.
parse
(
"http://test.uri"
);
testMediaItem
=
new
MediaItem
.
Builder
().
setUri
(
"http://test.uri"
).
setCustomCacheKey
(
"cacheKey"
).
build
();
}
@Before
...
...
@@ -128,9 +127,7 @@ public class DownloadHelperTest {
downloadHelper
=
new
DownloadHelper
(
TEST_DOWNLOAD_TYPE
,
testUri
,
TEST_CACHE_KEY
,
testMediaItem
,
new
TestMediaSource
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
,
DownloadHelper
.
getRendererCapabilities
(
renderersFactory
));
...
...
@@ -414,9 +411,10 @@ public class DownloadHelperTest {
DownloadRequest
downloadRequest
=
downloadHelper
.
getDownloadRequest
(
data
);
assertThat
(
downloadRequest
.
type
).
isEqualTo
(
TEST_DOWNLOAD_TYPE
);
assertThat
(
downloadRequest
.
uri
).
isEqualTo
(
testUri
);
assertThat
(
downloadRequest
.
customCacheKey
).
isEqualTo
(
TEST_CACHE_KEY
);
assertThat
(
downloadRequest
.
type
).
isEqualTo
(
DownloadRequest
.
TYPE_PROGRESSIVE
);
assertThat
(
downloadRequest
.
uri
).
isEqualTo
(
testMediaItem
.
playbackProperties
.
uri
);
assertThat
(
downloadRequest
.
customCacheKey
)
.
isEqualTo
(
testMediaItem
.
playbackProperties
.
customCacheKey
);
assertThat
(
downloadRequest
.
data
).
isEqualTo
(
data
);
assertThat
(
downloadRequest
.
streamKeys
)
.
containsExactly
(
...
...
library/dash/src/test/java/com/google/android/exoplayer2/source/dash/offline/DownloadHelperTest.java
View file @
d233c045
...
...
@@ -15,13 +15,14 @@
*/
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.MediaItem
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.drm.DrmSessionManager
;
import
com.google.android.exoplayer2.offline.DownloadHelper
;
import
com.google.android.exoplayer2.testutil.FakeDataSource
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
...
...
@@ -31,16 +32,16 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForDash_doesNotThrow
()
{
DownloadHelper
.
for
Dash
(
DownloadHelper
.
for
MediaItem
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
]);
DownloadHelper
.
forDash
(
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
new
MediaItem
.
Builder
().
setUri
(
"http://uri"
).
setMimeType
(
MimeTypes
.
APPLICATION_MPD
).
build
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
DrmSessionManager
.
getDummyDrmSessionManager
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
new
FakeDataSource
.
Factory
());
DownloadHelper
.
forMediaItem
(
new
MediaItem
.
Builder
().
setUri
(
"http://uri"
).
setMimeType
(
MimeTypes
.
APPLICATION_MPD
).
build
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
,
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
new
FakeDataSource
.
Factory
(),
/* drmSessionManager= */
DrmSessionManager
.
getDummyDrmSessionManager
());
}
}
library/hls/src/test/java/com/google/android/exoplayer2/source/hls/offline/DownloadHelperTest.java
View file @
d233c045
...
...
@@ -15,12 +15,13 @@
*/
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.MediaItem
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.offline.DownloadHelper
;
import
com.google.android.exoplayer2.testutil.FakeDataSource
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
...
...
@@ -30,16 +31,22 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForHls_doesNotThrow
()
{
DownloadHelper
.
for
Hls
(
DownloadHelper
.
for
MediaItem
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
]);
DownloadHelper
.
forHls
(
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
new
MediaItem
.
Builder
()
.
setUri
(
"http://uri"
)
.
setMimeType
(
MimeTypes
.
APPLICATION_M3U8
)
.
build
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
null
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
new
FakeDataSource
.
Factory
());
DownloadHelper
.
forMediaItem
(
new
MediaItem
.
Builder
()
.
setUri
(
"http://uri"
)
.
setMimeType
(
MimeTypes
.
APPLICATION_M3U8
)
.
build
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
,
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
new
FakeDataSource
.
Factory
(),
/* drmSessionManager= */
null
);
}
}
library/smoothstreaming/src/test/java/com/google/android/exoplayer2/source/smoothstreaming/offline/DownloadHelperTest.java
View file @
d233c045
...
...
@@ -15,12 +15,13 @@
*/
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.MediaItem
;
import
com.google.android.exoplayer2.Renderer
;
import
com.google.android.exoplayer2.offline.DownloadHelper
;
import
com.google.android.exoplayer2.testutil.FakeDataSource
;
import
com.google.android.exoplayer2.util.MimeTypes
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
...
...
@@ -30,16 +31,16 @@ public final class DownloadHelperTest {
@Test
public
void
staticDownloadHelperForSmoothStreaming_doesNotThrow
()
{
DownloadHelper
.
for
SmoothStreaming
(
DownloadHelper
.
for
MediaItem
(
ApplicationProvider
.
getApplicationContext
(),
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
]);
DownloadHelper
.
forSmoothStreaming
(
Uri
.
parse
(
"http://uri"
),
new
FakeDataSource
.
Factory
(),
new
MediaItem
.
Builder
().
setUri
(
"http://uri"
).
setMimeType
(
MimeTypes
.
APPLICATION_SS
).
build
(),
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
/* drmSessionManager= */
null
,
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
);
new
FakeDataSource
.
Factory
());
DownloadHelper
.
forMediaItem
(
new
MediaItem
.
Builder
().
setUri
(
"http://uri"
).
setMimeType
(
MimeTypes
.
APPLICATION_SS
).
build
(),
DownloadHelper
.
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
,
(
handler
,
videoListener
,
audioListener
,
text
,
metadata
)
->
new
Renderer
[
0
],
new
FakeDataSource
.
Factory
(),
/* drmSessionManager= */
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