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
3abcefa0
authored
Nov 18, 2014
by
Andrey Udovenko
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add EXT-X-BYTERANGE support #139
parent
360d452d
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
32 additions
and
3 deletions
demo/src/main/java/com/google/android/exoplayer/demo/Samples.java
library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java
library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java
library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java
demo/src/main/java/com/google/android/exoplayer/demo/Samples.java
View file @
3abcefa0
...
@@ -138,6 +138,9 @@ package com.google.android.exoplayer.demo;
...
@@ -138,6 +138,9 @@ package com.google.android.exoplayer.demo;
new
Sample
(
"Apple master playlist"
,
"uid:hls:applemaster"
,
new
Sample
(
"Apple master playlist"
,
"uid:hls:applemaster"
,
"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/"
"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/"
+
"bipbop_4x3_variant.m3u8"
,
DemoUtil
.
TYPE_HLS_MASTER
,
false
,
true
),
+
"bipbop_4x3_variant.m3u8"
,
DemoUtil
.
TYPE_HLS_MASTER
,
false
,
true
),
new
Sample
(
"Apple master playlist advanced"
,
"uid:hls:applemasteradvanced"
,
"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_16x9/"
+
"bipbop_16x9_variant.m3u8"
,
DemoUtil
.
TYPE_HLS_MASTER
,
false
,
true
),
new
Sample
(
"Apple single media playlist"
,
"uid:hls:applesinglemedia"
,
new
Sample
(
"Apple single media playlist"
,
"uid:hls:applesinglemedia"
,
"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/"
"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/"
+
"prog_index.m3u8"
,
DemoUtil
.
TYPE_HLS_MEDIA
,
false
,
true
),
+
"prog_index.m3u8"
,
DemoUtil
.
TYPE_HLS_MEDIA
,
false
,
true
),
...
...
library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java
View file @
3abcefa0
...
@@ -239,7 +239,8 @@ public class HlsChunkSource {
...
@@ -239,7 +239,8 @@ public class HlsChunkSource {
}
else
{
}
else
{
dataSource
=
upstreamDataSource
;
dataSource
=
upstreamDataSource
;
}
}
DataSpec
dataSpec
=
new
DataSpec
(
chunkUri
,
0
,
C
.
LENGTH_UNBOUNDED
,
null
);
DataSpec
dataSpec
=
new
DataSpec
(
chunkUri
,
segment
.
byterangeOffset
,
segment
.
byterangeLength
,
null
);
// Configure the extractor that will read the chunk.
// Configure the extractor that will read the chunk.
TsExtractor
extractor
;
TsExtractor
extractor
;
...
...
library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java
View file @
3abcefa0
...
@@ -35,9 +35,12 @@ public final class HlsMediaPlaylist {
...
@@ -35,9 +35,12 @@ public final class HlsMediaPlaylist {
public
final
String
encryptionMethod
;
public
final
String
encryptionMethod
;
public
final
String
encryptionKeyUri
;
public
final
String
encryptionKeyUri
;
public
final
String
encryptionIV
;
public
final
String
encryptionIV
;
public
final
int
byterangeOffset
;
public
final
int
byterangeLength
;
public
Segment
(
String
uri
,
double
durationSecs
,
boolean
discontinuity
,
long
startTimeUs
,
public
Segment
(
String
uri
,
double
durationSecs
,
boolean
discontinuity
,
long
startTimeUs
,
String
encryptionMethod
,
String
encryptionKeyUri
,
String
encryptionIV
)
{
String
encryptionMethod
,
String
encryptionKeyUri
,
String
encryptionIV
,
int
byterangeOffset
,
int
byterangeLength
)
{
this
.
url
=
uri
;
this
.
url
=
uri
;
this
.
durationSecs
=
durationSecs
;
this
.
durationSecs
=
durationSecs
;
this
.
discontinuity
=
discontinuity
;
this
.
discontinuity
=
discontinuity
;
...
@@ -45,6 +48,8 @@ public final class HlsMediaPlaylist {
...
@@ -45,6 +48,8 @@ public final class HlsMediaPlaylist {
this
.
encryptionMethod
=
encryptionMethod
;
this
.
encryptionMethod
=
encryptionMethod
;
this
.
encryptionKeyUri
=
encryptionKeyUri
;
this
.
encryptionKeyUri
=
encryptionKeyUri
;
this
.
encryptionIV
=
encryptionIV
;
this
.
encryptionIV
=
encryptionIV
;
this
.
byterangeOffset
=
byterangeOffset
;
this
.
byterangeLength
=
byterangeLength
;
}
}
@Override
@Override
...
...
library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java
View file @
3abcefa0
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
*/
*/
package
com
.
google
.
android
.
exoplayer
.
hls
;
package
com
.
google
.
android
.
exoplayer
.
hls
;
import
com.google.android.exoplayer.C
;
import
com.google.android.exoplayer.hls.HlsMediaPlaylist.Segment
;
import
com.google.android.exoplayer.hls.HlsMediaPlaylist.Segment
;
import
com.google.android.exoplayer.util.ManifestParser
;
import
com.google.android.exoplayer.util.ManifestParser
;
...
@@ -41,6 +42,7 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
...
@@ -41,6 +42,7 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
private
static
final
String
VERSION_TAG
=
"#EXT-X-VERSION"
;
private
static
final
String
VERSION_TAG
=
"#EXT-X-VERSION"
;
private
static
final
String
ENDLIST_TAG
=
"#EXT-X-ENDLIST"
;
private
static
final
String
ENDLIST_TAG
=
"#EXT-X-ENDLIST"
;
private
static
final
String
KEY_TAG
=
"#EXT-X-KEY"
;
private
static
final
String
KEY_TAG
=
"#EXT-X-KEY"
;
private
static
final
String
BYTERANGE_TAG
=
"#EXT-X-BYTERANGE"
;
private
static
final
String
METHOD_ATTR
=
"METHOD"
;
private
static
final
String
METHOD_ATTR
=
"METHOD"
;
private
static
final
String
URI_ATTR
=
"URI"
;
private
static
final
String
URI_ATTR
=
"URI"
;
...
@@ -54,6 +56,8 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
...
@@ -54,6 +56,8 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
Pattern
.
compile
(
TARGET_DURATION_TAG
+
":(\\d+)\\b"
);
Pattern
.
compile
(
TARGET_DURATION_TAG
+
":(\\d+)\\b"
);
private
static
final
Pattern
VERSION_REGEX
=
private
static
final
Pattern
VERSION_REGEX
=
Pattern
.
compile
(
VERSION_TAG
+
":(\\d+)\\b"
);
Pattern
.
compile
(
VERSION_TAG
+
":(\\d+)\\b"
);
private
static
final
Pattern
BYTERANGE_REGEX
=
Pattern
.
compile
(
BYTERANGE_TAG
+
":(\\d+(?:@\\d+)?)\\b"
);
private
static
final
Pattern
METHOD_ATTR_REGEX
=
private
static
final
Pattern
METHOD_ATTR_REGEX
=
Pattern
.
compile
(
METHOD_ATTR
+
"=([^,.*]+)"
);
Pattern
.
compile
(
METHOD_ATTR
+
"=([^,.*]+)"
);
...
@@ -85,6 +89,8 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
...
@@ -85,6 +89,8 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
String
segmentEncryptionMethod
=
null
;
String
segmentEncryptionMethod
=
null
;
String
segmentEncryptionKeyUri
=
null
;
String
segmentEncryptionKeyUri
=
null
;
String
segmentEncryptionIV
=
null
;
String
segmentEncryptionIV
=
null
;
int
segmentByterangeOffset
=
0
;
int
segmentByterangeLength
=
C
.
LENGTH_UNBOUNDED
;
int
segmentMediaSequence
=
0
;
int
segmentMediaSequence
=
0
;
...
@@ -119,16 +125,30 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
...
@@ -119,16 +125,30 @@ public final class HlsMediaPlaylistParser implements ManifestParser<HlsMediaPlay
segmentEncryptionIV
=
Integer
.
toHexString
(
segmentMediaSequence
);
segmentEncryptionIV
=
Integer
.
toHexString
(
segmentMediaSequence
);
}
}
}
}
}
else
if
(
line
.
startsWith
(
BYTERANGE_TAG
))
{
String
byteRange
=
HlsParserUtil
.
parseStringAttr
(
line
,
BYTERANGE_REGEX
,
BYTERANGE_TAG
);
String
[]
splitByteRange
=
byteRange
.
split
(
"@"
);
segmentByterangeLength
=
Integer
.
parseInt
(
splitByteRange
[
0
]);
if
(
splitByteRange
.
length
>
1
)
{
segmentByterangeOffset
=
Integer
.
parseInt
(
splitByteRange
[
1
]);
}
}
else
if
(
line
.
equals
(
DISCONTINUITY_TAG
))
{
}
else
if
(
line
.
equals
(
DISCONTINUITY_TAG
))
{
segmentDiscontinuity
=
true
;
segmentDiscontinuity
=
true
;
}
else
if
(!
line
.
startsWith
(
"#"
))
{
}
else
if
(!
line
.
startsWith
(
"#"
))
{
segmentMediaSequence
++;
segmentMediaSequence
++;
if
(
segmentByterangeLength
==
C
.
LENGTH_UNBOUNDED
)
{
segmentByterangeOffset
=
0
;
}
segments
.
add
(
new
Segment
(
line
,
segmentDurationSecs
,
segmentDiscontinuity
,
segments
.
add
(
new
Segment
(
line
,
segmentDurationSecs
,
segmentDiscontinuity
,
segmentStartTimeUs
,
segmentEncryptionMethod
,
segmentEncryptionKeyUri
,
segmentStartTimeUs
,
segmentEncryptionMethod
,
segmentEncryptionKeyUri
,
segmentEncryptionIV
));
segmentEncryptionIV
,
segmentByterangeOffset
,
segmentByterangeLength
));
segmentStartTimeUs
+=
(
long
)
(
segmentDurationSecs
*
1000000
);
segmentStartTimeUs
+=
(
long
)
(
segmentDurationSecs
*
1000000
);
segmentDiscontinuity
=
false
;
segmentDiscontinuity
=
false
;
segmentDurationSecs
=
0.0
;
segmentDurationSecs
=
0.0
;
if
(
segmentByterangeLength
!=
C
.
LENGTH_UNBOUNDED
)
{
segmentByterangeOffset
+=
segmentByterangeLength
;
}
segmentByterangeLength
=
C
.
LENGTH_UNBOUNDED
;
}
else
if
(
line
.
equals
(
ENDLIST_TAG
))
{
}
else
if
(
line
.
equals
(
ENDLIST_TAG
))
{
live
=
false
;
live
=
false
;
break
;
break
;
...
...
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