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
64829a03
authored
Sep 02, 2019
by
aquilescanta
Committed by
Toni
Sep 05, 2019
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Calculate loadDurationMs in DefaultDrmSession key and provisioning requests
PiperOrigin-RevId: 266812110
parent
52edbaa9
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
47 additions
and
28 deletions
library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
View file @
64829a03
...
@@ -22,6 +22,7 @@ import android.os.Handler;
...
@@ -22,6 +22,7 @@ import android.os.Handler;
import
android.os.HandlerThread
;
import
android.os.HandlerThread
;
import
android.os.Looper
;
import
android.os.Looper
;
import
android.os.Message
;
import
android.os.Message
;
import
android.os.SystemClock
;
import
android.util.Pair
;
import
android.util.Pair
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.Nullable
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.C
;
...
@@ -112,12 +113,12 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -112,12 +113,12 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
/* package */
final
MediaDrmCallback
callback
;
/* package */
final
MediaDrmCallback
callback
;
/* package */
final
UUID
uuid
;
/* package */
final
UUID
uuid
;
/* package */
final
PostResponseHandler
postR
esponseHandler
;
/* package */
final
ResponseHandler
r
esponseHandler
;
private
@DrmSession
.
State
int
state
;
private
@DrmSession
.
State
int
state
;
private
int
referenceCount
;
private
int
referenceCount
;
@Nullable
private
HandlerThread
requestHandlerThread
;
@Nullable
private
HandlerThread
requestHandlerThread
;
@Nullable
private
PostRequestHandler
postR
equestHandler
;
@Nullable
private
RequestHandler
r
equestHandler
;
@Nullable
private
T
mediaCrypto
;
@Nullable
private
T
mediaCrypto
;
@Nullable
private
DrmSessionException
lastException
;
@Nullable
private
DrmSessionException
lastException
;
private
byte
@NullableType
[]
sessionId
;
private
byte
@NullableType
[]
sessionId
;
...
@@ -180,7 +181,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -180,7 +181,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
new
DefaultLoadErrorHandlingPolicy
(
new
DefaultLoadErrorHandlingPolicy
(
/* minimumLoadableRetryCount= */
initialDrmRequestRetryCount
);
/* minimumLoadableRetryCount= */
initialDrmRequestRetryCount
);
state
=
STATE_OPENING
;
state
=
STATE_OPENING
;
postResponseHandler
=
new
Post
ResponseHandler
(
playbackLooper
);
responseHandler
=
new
ResponseHandler
(
playbackLooper
);
}
}
public
boolean
hasSessionId
(
byte
[]
sessionId
)
{
public
boolean
hasSessionId
(
byte
[]
sessionId
)
{
...
@@ -201,7 +202,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -201,7 +202,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
public
void
provision
()
{
public
void
provision
()
{
currentProvisionRequest
=
mediaDrm
.
getProvisionRequest
();
currentProvisionRequest
=
mediaDrm
.
getProvisionRequest
();
Util
.
castNonNull
(
postR
equestHandler
)
Util
.
castNonNull
(
r
equestHandler
)
.
post
(
.
post
(
MSG_PROVISION
,
MSG_PROVISION
,
Assertions
.
checkNotNull
(
currentProvisionRequest
),
Assertions
.
checkNotNull
(
currentProvisionRequest
),
...
@@ -254,7 +255,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -254,7 +255,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
Assertions
.
checkState
(
state
==
STATE_OPENING
);
Assertions
.
checkState
(
state
==
STATE_OPENING
);
requestHandlerThread
=
new
HandlerThread
(
"DrmRequestHandler"
);
requestHandlerThread
=
new
HandlerThread
(
"DrmRequestHandler"
);
requestHandlerThread
.
start
();
requestHandlerThread
.
start
();
postRequestHandler
=
new
Post
RequestHandler
(
requestHandlerThread
.
getLooper
());
requestHandler
=
new
RequestHandler
(
requestHandlerThread
.
getLooper
());
if
(
openInternal
(
true
))
{
if
(
openInternal
(
true
))
{
doLicense
(
true
);
doLicense
(
true
);
}
}
...
@@ -266,9 +267,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -266,9 +267,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
if
(--
referenceCount
==
0
)
{
if
(--
referenceCount
==
0
)
{
// Assigning null to various non-null variables for clean-up.
// Assigning null to various non-null variables for clean-up.
state
=
STATE_RELEASED
;
state
=
STATE_RELEASED
;
Util
.
castNonNull
(
postR
esponseHandler
).
removeCallbacksAndMessages
(
null
);
Util
.
castNonNull
(
r
esponseHandler
).
removeCallbacksAndMessages
(
null
);
Util
.
castNonNull
(
postR
equestHandler
).
removeCallbacksAndMessages
(
null
);
Util
.
castNonNull
(
r
equestHandler
).
removeCallbacksAndMessages
(
null
);
postR
equestHandler
=
null
;
r
equestHandler
=
null
;
Util
.
castNonNull
(
requestHandlerThread
).
quit
();
Util
.
castNonNull
(
requestHandlerThread
).
quit
();
requestHandlerThread
=
null
;
requestHandlerThread
=
null
;
mediaCrypto
=
null
;
mediaCrypto
=
null
;
...
@@ -417,7 +418,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -417,7 +418,7 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
try
{
try
{
currentKeyRequest
=
currentKeyRequest
=
mediaDrm
.
getKeyRequest
(
scope
,
schemeDatas
,
type
,
optionalKeyRequestParameters
);
mediaDrm
.
getKeyRequest
(
scope
,
schemeDatas
,
type
,
optionalKeyRequestParameters
);
Util
.
castNonNull
(
postR
equestHandler
)
Util
.
castNonNull
(
r
equestHandler
)
.
post
(
MSG_KEYS
,
Assertions
.
checkNotNull
(
currentKeyRequest
),
allowRetry
);
.
post
(
MSG_KEYS
,
Assertions
.
checkNotNull
(
currentKeyRequest
),
allowRetry
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
onKeysError
(
e
);
onKeysError
(
e
);
...
@@ -490,9 +491,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -490,9 +491,9 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
// Internal classes.
// Internal classes.
@SuppressLint
(
"HandlerLeak"
)
@SuppressLint
(
"HandlerLeak"
)
private
class
Post
ResponseHandler
extends
Handler
{
private
class
ResponseHandler
extends
Handler
{
public
Post
ResponseHandler
(
Looper
looper
)
{
public
ResponseHandler
(
Looper
looper
)
{
super
(
looper
);
super
(
looper
);
}
}
...
@@ -516,29 +517,30 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -516,29 +517,30 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
}
}
@SuppressLint
(
"HandlerLeak"
)
@SuppressLint
(
"HandlerLeak"
)
private
class
Post
RequestHandler
extends
Handler
{
private
class
RequestHandler
extends
Handler
{
public
Post
RequestHandler
(
Looper
backgroundLooper
)
{
public
RequestHandler
(
Looper
backgroundLooper
)
{
super
(
backgroundLooper
);
super
(
backgroundLooper
);
}
}
void
post
(
int
what
,
Object
request
,
boolean
allowRetry
)
{
void
post
(
int
what
,
Object
request
,
boolean
allowRetry
)
{
int
allowRetryInt
=
allowRetry
?
1
:
0
;
RequestTask
requestTask
=
int
errorCount
=
0
;
new
RequestTask
(
allowRetry
,
/* startTimeMs= */
SystemClock
.
elapsedRealtime
(),
request
)
;
obtainMessage
(
what
,
allowRetryInt
,
errorCount
,
request
).
sendToTarget
();
obtainMessage
(
what
,
requestTask
).
sendToTarget
();
}
}
@Override
@Override
public
void
handleMessage
(
Message
msg
)
{
public
void
handleMessage
(
Message
msg
)
{
Object
request
=
msg
.
obj
;
RequestTask
requestTask
=
(
RequestTask
)
msg
.
obj
;
Object
response
;
Object
response
;
try
{
try
{
switch
(
msg
.
what
)
{
switch
(
msg
.
what
)
{
case
MSG_PROVISION:
case
MSG_PROVISION:
response
=
callback
.
executeProvisionRequest
(
uuid
,
(
ProvisionRequest
)
request
);
response
=
callback
.
executeProvisionRequest
(
uuid
,
(
ProvisionRequest
)
requestTask
.
request
);
break
;
break
;
case
MSG_KEYS:
case
MSG_KEYS:
response
=
callback
.
executeKeyRequest
(
uuid
,
(
KeyRequest
)
request
);
response
=
callback
.
executeKeyRequest
(
uuid
,
(
KeyRequest
)
request
Task
.
request
);
break
;
break
;
default
:
default
:
throw
new
RuntimeException
();
throw
new
RuntimeException
();
...
@@ -549,30 +551,47 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
...
@@ -549,30 +551,47 @@ public class DefaultDrmSession<T extends ExoMediaCrypto> implements DrmSession<T
}
}
response
=
e
;
response
=
e
;
}
}
postResponseHandler
.
obtainMessage
(
msg
.
what
,
Pair
.
create
(
request
,
response
)).
sendToTarget
();
responseHandler
.
obtainMessage
(
msg
.
what
,
Pair
.
create
(
requestTask
.
request
,
response
))
.
sendToTarget
();
}
}
private
boolean
maybeRetryRequest
(
Message
originalMsg
,
Exception
e
)
{
private
boolean
maybeRetryRequest
(
Message
originalMsg
,
Exception
e
)
{
boolean
allowRetry
=
originalMsg
.
arg1
==
1
;
RequestTask
requestTask
=
(
RequestTask
)
originalMsg
.
obj
;
if
(!
allowRetry
)
{
if
(!
requestTask
.
allowRetry
)
{
return
false
;
return
false
;
}
}
int
errorCount
=
originalMsg
.
arg2
+
1
;
requestTask
.
errorCount
++;
if
(
errorCount
>
loadErrorHandlingPolicy
.
getMinimumLoadableRetryCount
(
C
.
DATA_TYPE_DRM
))
{
if
(
requestTask
.
errorCount
>
loadErrorHandlingPolicy
.
getMinimumLoadableRetryCount
(
C
.
DATA_TYPE_DRM
))
{
return
false
;
return
false
;
}
}
Message
retryMsg
=
Message
.
obtain
(
originalMsg
);
Message
retryMsg
=
Message
.
obtain
(
originalMsg
);
retryMsg
.
arg2
=
errorCount
;
IOException
ioException
=
IOException
ioException
=
e
instanceof
IOException
?
(
IOException
)
e
:
new
UnexpectedDrmSessionException
(
e
);
e
instanceof
IOException
?
(
IOException
)
e
:
new
UnexpectedDrmSessionException
(
e
);
// TODO: Add loadDurationMs calculation before allowing user-provided load error handling
// policies.
long
retryDelayMs
=
long
retryDelayMs
=
loadErrorHandlingPolicy
.
getRetryDelayMsFor
(
loadErrorHandlingPolicy
.
getRetryDelayMsFor
(
C
.
DATA_TYPE_DRM
,
/* loadDurationMs= */
C
.
TIME_UNSET
,
ioException
,
errorCount
);
C
.
DATA_TYPE_DRM
,
/* loadDurationMs= */
SystemClock
.
elapsedRealtime
()
-
requestTask
.
startTimeMs
,
ioException
,
requestTask
.
errorCount
);
sendMessageDelayed
(
retryMsg
,
retryDelayMs
);
sendMessageDelayed
(
retryMsg
,
retryDelayMs
);
return
true
;
return
true
;
}
}
}
}
private
static
final
class
RequestTask
{
public
final
boolean
allowRetry
;
public
final
long
startTimeMs
;
public
final
Object
request
;
public
int
errorCount
;
public
RequestTask
(
boolean
allowRetry
,
long
startTimeMs
,
Object
request
)
{
this
.
allowRetry
=
allowRetry
;
this
.
startTimeMs
=
startTimeMs
;
this
.
request
=
request
;
}
}
}
}
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