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
08342ea9
authored
Feb 08, 2023
by
microkatz
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge pull request #248 from lemondoglol:update-segment-size
PiperOrigin-RevId: 507784608
parents
01082a48
b65baf7d
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
132 additions
and
14 deletions
library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java
library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java
library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java
library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java
View file @
08342ea9
...
...
@@ -72,8 +72,9 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
}
}
public
static
final
long
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
=
20
*
C
.
MILLIS_PER_SECOND
;
private
static
final
int
BUFFER_SIZE_BYTES
=
128
*
1024
;
private
static
final
long
MAX_MERGED_SEGMENT_START_TIME_DIFF_US
=
20
*
C
.
MICROS_PER_SECOND
;
private
final
DataSpec
manifestDataSpec
;
private
final
Parser
<
M
>
manifestParser
;
...
...
@@ -83,6 +84,7 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
private
final
CacheKeyFactory
cacheKeyFactory
;
@Nullable
private
final
PriorityTaskManager
priorityTaskManager
;
private
final
Executor
executor
;
private
final
long
maxMergedSegmentStartTimeDiffUs
;
/**
* The currently active runnables.
...
...
@@ -97,6 +99,24 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
private
volatile
boolean
isCanceled
;
/**
* @deprecated Use {@link SegmentDownloader#SegmentDownloader(MediaItem, Parser,
* CacheDataSource.Factory, Executor, long)} instead.
*/
@Deprecated
public
SegmentDownloader
(
MediaItem
mediaItem
,
Parser
<
M
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
* @param mediaItem The {@link MediaItem} to be downloaded.
* @param manifestParser A parser for manifests belonging to the media to be downloaded.
* @param cacheDataSourceFactory A {@link CacheDataSource.Factory} for the cache into which the
...
...
@@ -104,12 +124,16 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
* @param executor An {@link Executor} used to make requests for the media being downloaded.
* Providing an {@link Executor} that uses multiple threads will speed up the download by
* allowing parts of it to be executed in parallel.
* @param maxMergedSegmentStartTimeDiffMs The maximum difference of the start time of two
* segments, up to which the segments (of the same URI) should be merged into a single
* download segment, in milliseconds.
*/
public
SegmentDownloader
(
MediaItem
mediaItem
,
Parser
<
M
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
Executor
executor
,
long
maxMergedSegmentStartTimeDiffMs
)
{
checkNotNull
(
mediaItem
.
localConfiguration
);
this
.
manifestDataSpec
=
getCompressibleDataSpec
(
mediaItem
.
localConfiguration
.
uri
);
this
.
manifestParser
=
manifestParser
;
...
...
@@ -120,6 +144,7 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
cacheKeyFactory
=
cacheDataSourceFactory
.
getCacheKeyFactory
();
priorityTaskManager
=
cacheDataSourceFactory
.
getUpstreamPriorityTaskManager
();
activeRunnables
=
new
ArrayList
<>();
maxMergedSegmentStartTimeDiffUs
=
Util
.
msToUs
(
maxMergedSegmentStartTimeDiffMs
);
}
@Override
...
...
@@ -142,7 +167,7 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
// Sort the segments so that we download media in the right order from the start of the
// content, and merge segments where possible to minimize the number of server round trips.
Collections
.
sort
(
segments
);
mergeSegments
(
segments
,
cacheKeyFactory
);
mergeSegments
(
segments
,
cacheKeyFactory
,
maxMergedSegmentStartTimeDiffUs
);
// Scan the segments, removing any that are fully downloaded.
int
totalSegments
=
segments
.
size
();
...
...
@@ -413,7 +438,8 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
}
}
private
static
void
mergeSegments
(
List
<
Segment
>
segments
,
CacheKeyFactory
keyFactory
)
{
private
static
void
mergeSegments
(
List
<
Segment
>
segments
,
CacheKeyFactory
keyFactory
,
long
maxMergedSegmentStartTimeDiffUs
)
{
HashMap
<
String
,
Integer
>
lastIndexByCacheKey
=
new
HashMap
<>();
int
nextOutIndex
=
0
;
for
(
int
i
=
0
;
i
<
segments
.
size
();
i
++)
{
...
...
@@ -422,7 +448,7 @@ public abstract class SegmentDownloader<M extends FilterableManifest<M>> impleme
@Nullable
Integer
lastIndex
=
lastIndexByCacheKey
.
get
(
cacheKey
);
@Nullable
Segment
lastSegment
=
lastIndex
==
null
?
null
:
segments
.
get
(
lastIndex
);
if
(
lastSegment
==
null
||
segment
.
startTimeUs
>
lastSegment
.
startTimeUs
+
MAX_MERGED_SEGMENT_START_TIME_DIFF_US
||
segment
.
startTimeUs
>
lastSegment
.
startTimeUs
+
maxMergedSegmentStartTimeDiffUs
||
!
canMergeSegments
(
lastSegment
.
dataSpec
,
segment
.
dataSpec
))
{
lastIndexByCacheKey
.
put
(
cacheKey
,
nextOutIndex
);
segments
.
set
(
nextOutIndex
,
segment
);
...
...
library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java
View file @
08342ea9
...
...
@@ -98,7 +98,30 @@ public final class DashDownloader extends SegmentDownloader<DashManifest> {
*/
public
DashDownloader
(
MediaItem
mediaItem
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
new
DashManifestParser
(),
cacheDataSourceFactory
,
executor
);
this
(
mediaItem
,
new
DashManifestParser
(),
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
* @deprecated Use {@link DashDownloader#DashDownloader(MediaItem, Parser,
* CacheDataSource.Factory, Executor, long)} instead.
*/
@Deprecated
public
DashDownloader
(
MediaItem
mediaItem
,
Parser
<
DashManifest
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
...
...
@@ -111,13 +134,22 @@ public final class DashDownloader extends SegmentDownloader<DashManifest> {
* @param executor An {@link Executor} used to make requests for the media being downloaded.
* Providing an {@link Executor} that uses multiple threads will speed up the download by
* allowing parts of it to be executed in parallel.
* @param maxMergedSegmentStartTimeDiffMs The maximum difference of the start time of two
* segments, up to which the segments (of the same URI) should be merged into a single
* download segment, in milliseconds.
*/
public
DashDownloader
(
MediaItem
mediaItem
,
Parser
<
DashManifest
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
);
Executor
executor
,
long
maxMergedSegmentStartTimeDiffMs
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
maxMergedSegmentStartTimeDiffMs
);
baseUrlExclusionList
=
new
BaseUrlExclusionList
();
}
...
...
library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java
View file @
08342ea9
...
...
@@ -87,7 +87,30 @@ public final class HlsDownloader extends SegmentDownloader<HlsPlaylist> {
*/
public
HlsDownloader
(
MediaItem
mediaItem
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
new
HlsPlaylistParser
(),
cacheDataSourceFactory
,
executor
);
this
(
mediaItem
,
new
HlsPlaylistParser
(),
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
* @deprecated Use {@link HlsDownloader#HlsDownloader(MediaItem, Parser, CacheDataSource.Factory,
* Executor, long)} instead.
*/
@Deprecated
public
HlsDownloader
(
MediaItem
mediaItem
,
Parser
<
HlsPlaylist
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
...
...
@@ -100,13 +123,22 @@ public final class HlsDownloader extends SegmentDownloader<HlsPlaylist> {
* @param executor An {@link Executor} used to make requests for the media being downloaded.
* Providing an {@link Executor} that uses multiple threads will speed up the download by
* allowing parts of it to be executed in parallel.
* @param maxMergedSegmentStartTimeDiffMs The maximum difference of the start time of two
* segments, up to which the segments (of the same URI) should be merged into a single
* download segment, in milliseconds.
*/
public
HlsDownloader
(
MediaItem
mediaItem
,
Parser
<
HlsPlaylist
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
);
Executor
executor
,
long
maxMergedSegmentStartTimeDiffMs
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
maxMergedSegmentStartTimeDiffMs
);
}
@Override
...
...
library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/offline/SsDownloader.java
View file @
08342ea9
...
...
@@ -91,7 +91,26 @@ public final class SsDownloader extends SegmentDownloader<SsManifest> {
.
build
(),
new
SsManifestParser
(),
cacheDataSourceFactory
,
executor
);
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
* @deprecated Use {@link SsDownloader#SsDownloader(MediaItem, Parser, CacheDataSource.Factory,
* Executor, long)} instead.
*/
@Deprecated
public
SsDownloader
(
MediaItem
mediaItem
,
Parser
<
SsManifest
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
this
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
DEFAULT_MAX_MERGED_SEGMENT_START_TIME_DIFF_MS
);
}
/**
...
...
@@ -104,13 +123,22 @@ public final class SsDownloader extends SegmentDownloader<SsManifest> {
* @param executor An {@link Executor} used to make requests for the media being downloaded.
* Providing an {@link Executor} that uses multiple threads will speed up the download by
* allowing parts of it to be executed in parallel.
* @param maxMergedSegmentStartTimeDiffMs The maximum difference of the start time of two
* segments, up to which the segments (of the same URI) should be merged into a single
* download segment, in milliseconds.
*/
public
SsDownloader
(
MediaItem
mediaItem
,
Parser
<
SsManifest
>
manifestParser
,
CacheDataSource
.
Factory
cacheDataSourceFactory
,
Executor
executor
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
);
Executor
executor
,
long
maxMergedSegmentStartTimeDiffMs
)
{
super
(
mediaItem
,
manifestParser
,
cacheDataSourceFactory
,
executor
,
maxMergedSegmentStartTimeDiffMs
);
}
@Override
...
...
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