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
e181d4bd
authored
Jul 17, 2019
by
aquilescanta
Committed by
Oliver Woodman
Jul 26, 2019
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Fix DataSchemeDataSource re-opening and range requests
Issue:#6192 PiperOrigin-RevId: 258592902
parent
962d5e70
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
78 additions
and
14 deletions
RELEASENOTES.md
library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java
library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java
RELEASENOTES.md
View file @
e181d4bd
...
...
@@ -6,6 +6,8 @@
*
Flac extension: Parse
`VORBIS_COMMENT`
metadata
(
[
#5527
](
https://github.com/google/ExoPlayer/issues/5527
)
).
*
Fix issue where initial seek positions get ignored when playing a preroll ad.
*
Fix
`DataSchemeDataSource`
re-opening and range requests
(
[
#6192
](
https://github.com/google/ExoPlayer/issues/6192
)
).
### 2.10.3 ###
...
...
library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSchemeDataSource.java
View file @
e181d4bd
...
...
@@ -15,6 +15,8 @@
*/
package
com
.
google
.
android
.
exoplayer2
.
upstream
;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Util
.
castNonNull
;
import
android.net.Uri
;
import
androidx.annotation.Nullable
;
import
android.util.Base64
;
...
...
@@ -29,9 +31,10 @@ public final class DataSchemeDataSource extends BaseDataSource {
public
static
final
String
SCHEME_DATA
=
"data"
;
private
@Nullable
DataSpec
dataSpec
;
private
int
bytesRead
;
private
@Nullable
byte
[]
data
;
@Nullable
private
DataSpec
dataSpec
;
@Nullable
private
byte
[]
data
;
private
int
endPosition
;
private
int
readPosition
;
public
DataSchemeDataSource
()
{
super
(
/* isNetwork= */
false
);
...
...
@@ -41,6 +44,7 @@ public final class DataSchemeDataSource extends BaseDataSource {
public
long
open
(
DataSpec
dataSpec
)
throws
IOException
{
transferInitializing
(
dataSpec
);
this
.
dataSpec
=
dataSpec
;
readPosition
=
(
int
)
dataSpec
.
position
;
Uri
uri
=
dataSpec
.
uri
;
String
scheme
=
uri
.
getScheme
();
if
(!
SCHEME_DATA
.
equals
(
scheme
))
{
...
...
@@ -61,8 +65,14 @@ public final class DataSchemeDataSource extends BaseDataSource {
// TODO: Add support for other charsets.
data
=
Util
.
getUtf8Bytes
(
URLDecoder
.
decode
(
dataString
,
C
.
ASCII_NAME
));
}
endPosition
=
dataSpec
.
length
!=
C
.
LENGTH_UNSET
?
(
int
)
dataSpec
.
length
+
readPosition
:
data
.
length
;
if
(
endPosition
>
data
.
length
||
readPosition
>
endPosition
)
{
data
=
null
;
throw
new
DataSourceException
(
DataSourceException
.
POSITION_OUT_OF_RANGE
);
}
transferStarted
(
dataSpec
);
return
data
.
length
;
return
(
long
)
endPosition
-
readPosition
;
}
@Override
...
...
@@ -70,29 +80,29 @@ public final class DataSchemeDataSource extends BaseDataSource {
if
(
readLength
==
0
)
{
return
0
;
}
int
remainingBytes
=
data
.
length
-
bytesRead
;
int
remainingBytes
=
endPosition
-
readPosition
;
if
(
remainingBytes
==
0
)
{
return
C
.
RESULT_END_OF_INPUT
;
}
readLength
=
Math
.
min
(
readLength
,
remainingBytes
);
System
.
arraycopy
(
data
,
bytesRead
,
buffer
,
offset
,
readLength
);
bytesRead
+=
readLength
;
System
.
arraycopy
(
castNonNull
(
data
),
readPosition
,
buffer
,
offset
,
readLength
);
readPosition
+=
readLength
;
bytesTransferred
(
readLength
);
return
readLength
;
}
@Override
public
@Nullable
Uri
getUri
()
{
@Nullable
public
Uri
getUri
()
{
return
dataSpec
!=
null
?
dataSpec
.
uri
:
null
;
}
@Override
public
void
close
()
throws
IOException
{
public
void
close
()
{
if
(
data
!=
null
)
{
data
=
null
;
transferEnded
();
}
dataSpec
=
null
;
}
}
library/core/src/test/java/com/google/android/exoplayer2/upstream/DataSchemeDataSourceTest.java
View file @
e181d4bd
...
...
@@ -21,6 +21,7 @@ import static org.junit.Assert.fail;
import
android.net.Uri
;
import
androidx.test.ext.junit.runners.AndroidJUnit4
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.util.Util
;
import
java.io.IOException
;
import
org.junit.Before
;
...
...
@@ -31,6 +32,9 @@ import org.junit.runner.RunWith;
@RunWith
(
AndroidJUnit4
.
class
)
public
final
class
DataSchemeDataSourceTest
{
private
static
final
String
DATA_SCHEME_URI
=
"data:text/plain;base64,eyJwcm92aWRlciI6IndpZGV2aW5lX3Rlc3QiLCJjb250ZW50X2lkIjoiTWpBeE5WOTBaV"
+
"0Z5Y3c9PSIsImtleV9pZHMiOlsiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiXX0="
;
private
DataSource
schemeDataDataSource
;
@Before
...
...
@@ -40,9 +44,7 @@ public final class DataSchemeDataSourceTest {
@Test
public
void
testBase64Data
()
throws
IOException
{
DataSpec
dataSpec
=
buildDataSpec
(
"data:text/plain;base64,eyJwcm92aWRlciI6IndpZGV2aW5lX3Rlc3QiL"
+
"CJjb250ZW50X2lkIjoiTWpBeE5WOTBaV0Z5Y3c9PSIsImtleV9pZHMiOlsiMDAwMDAwMDAwMDAwMDAwMDAwMDAwM"
+
"DAwMDAwMDAwMDAiXX0="
);
DataSpec
dataSpec
=
buildDataSpec
(
DATA_SCHEME_URI
);
DataSourceAsserts
.
assertDataSourceContent
(
schemeDataDataSource
,
dataSpec
,
...
...
@@ -73,6 +75,52 @@ public final class DataSchemeDataSourceTest {
}
@Test
public
void
testSequentialRangeRequests
()
throws
IOException
{
DataSpec
dataSpec
=
buildDataSpec
(
DATA_SCHEME_URI
,
/* position= */
1
,
/* length= */
C
.
LENGTH_UNSET
);
DataSourceAsserts
.
assertDataSourceContent
(
schemeDataDataSource
,
dataSpec
,
Util
.
getUtf8Bytes
(
"\"provider\":\"widevine_test\",\"content_id\":\"MjAxNV90ZWFycw==\",\"key_ids\":"
+
"[\"00000000000000000000000000000000\"]}"
));
dataSpec
=
buildDataSpec
(
DATA_SCHEME_URI
,
/* position= */
10
,
/* length= */
C
.
LENGTH_UNSET
);
DataSourceAsserts
.
assertDataSourceContent
(
schemeDataDataSource
,
dataSpec
,
Util
.
getUtf8Bytes
(
"\":\"widevine_test\",\"content_id\":\"MjAxNV90ZWFycw==\",\"key_ids\":"
+
"[\"00000000000000000000000000000000\"]}"
));
dataSpec
=
buildDataSpec
(
DATA_SCHEME_URI
,
/* position= */
15
,
/* length= */
5
);
DataSourceAsserts
.
assertDataSourceContent
(
schemeDataDataSource
,
dataSpec
,
Util
.
getUtf8Bytes
(
"devin"
));
}
@Test
public
void
testInvalidStartPositionRequest
()
throws
IOException
{
try
{
// Try to open a range starting one byte beyond the resource's length.
schemeDataDataSource
.
open
(
buildDataSpec
(
DATA_SCHEME_URI
,
/* position= */
108
,
/* length= */
C
.
LENGTH_UNSET
));
fail
();
}
catch
(
DataSourceException
e
)
{
assertThat
(
e
.
reason
).
isEqualTo
(
DataSourceException
.
POSITION_OUT_OF_RANGE
);
}
}
@Test
public
void
testRangeExceedingResourceLengthRequest
()
throws
IOException
{
try
{
// Try to open a range exceeding the resource's length.
schemeDataDataSource
.
open
(
buildDataSpec
(
DATA_SCHEME_URI
,
/* position= */
97
,
/* length= */
11
));
fail
();
}
catch
(
DataSourceException
e
)
{
assertThat
(
e
.
reason
).
isEqualTo
(
DataSourceException
.
POSITION_OUT_OF_RANGE
);
}
}
@Test
public
void
testIncorrectScheme
()
{
try
{
schemeDataDataSource
.
open
(
buildDataSpec
(
"http://www.google.com"
));
...
...
@@ -99,7 +147,11 @@ public final class DataSchemeDataSourceTest {
}
private
static
DataSpec
buildDataSpec
(
String
uriString
)
{
return
new
DataSpec
(
Uri
.
parse
(
uriString
));
return
buildDataSpec
(
uriString
,
/* position= */
0
,
/* length= */
C
.
LENGTH_UNSET
);
}
private
static
DataSpec
buildDataSpec
(
String
uriString
,
int
position
,
int
length
)
{
return
new
DataSpec
(
Uri
.
parse
(
uriString
),
position
,
length
,
/* key= */
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