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
d6c721ff
authored
Jul 22, 2021
by
aquilescanta
Committed by
kim-vde
Jul 23, 2021
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Move DRM exception classification method to public API
PiperOrigin-RevId: 386232697
parent
b33496ae
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
122 additions
and
77 deletions
library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java
library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
View file @
d6c721ff
...
@@ -19,9 +19,6 @@ import static com.google.android.exoplayer2.util.Assertions.checkState;
...
@@ -19,9 +19,6 @@ import static com.google.android.exoplayer2.util.Assertions.checkState;
import
static
java
.
lang
.
Math
.
min
;
import
static
java
.
lang
.
Math
.
min
;
import
android.annotation.SuppressLint
;
import
android.annotation.SuppressLint
;
import
android.media.DeniedByServerException
;
import
android.media.MediaDrm
;
import
android.media.MediaDrmResetException
;
import
android.media.NotProvisionedException
;
import
android.media.NotProvisionedException
;
import
android.os.Handler
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.os.HandlerThread
;
...
@@ -29,12 +26,10 @@ import android.os.Looper;
...
@@ -29,12 +26,10 @@ import android.os.Looper;
import
android.os.Message
;
import
android.os.Message
;
import
android.os.SystemClock
;
import
android.os.SystemClock
;
import
android.util.Pair
;
import
android.util.Pair
;
import
androidx.annotation.DoNotInline
;
import
androidx.annotation.GuardedBy
;
import
androidx.annotation.GuardedBy
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.RequiresApi
;
import
androidx.annotation.RequiresApi
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.PlaybackException
;
import
com.google.android.exoplayer2.drm.DrmInitData.SchemeData
;
import
com.google.android.exoplayer2.drm.DrmInitData.SchemeData
;
import
com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest
;
import
com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest
;
import
com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest
;
import
com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest
;
...
@@ -519,7 +514,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
...
@@ -519,7 +514,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private
void
onError
(
Exception
e
,
boolean
thrownByExoMediaDrm
)
{
private
void
onError
(
Exception
e
,
boolean
thrownByExoMediaDrm
)
{
lastException
=
lastException
=
new
DrmSessionException
(
e
,
getErrorCodeForMediaDrmException
(
e
,
thrownByExoMediaDrm
));
new
DrmSessionException
(
e
,
DrmUtil
.
getErrorCodeForMediaDrmException
(
e
,
thrownByExoMediaDrm
));
Log
.
e
(
TAG
,
"DRM session error"
,
e
);
Log
.
e
(
TAG
,
"DRM session error"
,
e
);
dispatchEvent
(
eventDispatcher
->
eventDispatcher
.
drmSessionManagerError
(
e
));
dispatchEvent
(
eventDispatcher
->
eventDispatcher
.
drmSessionManagerError
(
e
));
if
(
state
!=
STATE_OPENED_WITH_KEYS
)
{
if
(
state
!=
STATE_OPENED_WITH_KEYS
)
{
...
@@ -539,36 +535,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
...
@@ -539,36 +535,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
}
}
}
}
@PlaybackException
.
ErrorCode
private
static
int
getErrorCodeForMediaDrmException
(
Exception
exception
,
boolean
thrownByExoMediaDrm
)
{
if
(
Util
.
SDK_INT
>=
21
&&
PlatformOperationsWrapperV21
.
isMediaDrmStateException
(
exception
))
{
return
PlatformOperationsWrapperV21
.
mediaDrmStateExceptionToErrorCode
(
exception
);
}
else
if
(
Util
.
SDK_INT
>=
23
&&
PlatformOperationsWrapperV23
.
isMediaDrmResetException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_SYSTEM_ERROR
;
}
else
if
(
Util
.
SDK_INT
>=
18
&&
PlatformOperationsWrapperV18
.
isNotProvisionedException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_PROVISIONING_FAILED
;
}
else
if
(
Util
.
SDK_INT
>=
18
&&
PlatformOperationsWrapperV18
.
isDeniedByServerException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_DEVICE_REVOKED
;
}
else
if
(
exception
instanceof
UnsupportedDrmException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_SCHEME_UNSUPPORTED
;
}
else
if
(
exception
instanceof
DefaultDrmSessionManager
.
MissingSchemeDataException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_CONTENT_ERROR
;
}
else
if
(
exception
instanceof
KeysExpiredException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_LICENSE_EXPIRED
;
}
else
if
(
thrownByExoMediaDrm
)
{
// A MediaDrm exception was thrown but it was impossible to determine the cause. Because no
// better diagnosis tools were provided, we treat this as a system error.
return
PlaybackException
.
ERROR_CODE_DRM_SYSTEM_ERROR
;
}
else
{
// The error happened during the license request.
return
PlaybackException
.
ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED
;
}
}
// Internal classes.
// Internal classes.
@SuppressLint
(
"HandlerLeak"
)
@SuppressLint
(
"HandlerLeak"
)
...
@@ -714,45 +680,4 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
...
@@ -714,45 +680,4 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
this
.
request
=
request
;
this
.
request
=
request
;
}
}
}
}
@RequiresApi
(
18
)
private
static
final
class
PlatformOperationsWrapperV18
{
@DoNotInline
public
static
boolean
isNotProvisionedException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
NotProvisionedException
;
}
@DoNotInline
public
static
boolean
isDeniedByServerException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
DeniedByServerException
;
}
}
@RequiresApi
(
21
)
private
static
final
class
PlatformOperationsWrapperV21
{
@DoNotInline
public
static
boolean
isMediaDrmStateException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
MediaDrm
.
MediaDrmStateException
;
}
@DoNotInline
@PlaybackException
.
ErrorCode
public
static
int
mediaDrmStateExceptionToErrorCode
(
Throwable
throwable
)
{
@Nullable
String
diagnosticsInfo
=
((
MediaDrm
.
MediaDrmStateException
)
throwable
).
getDiagnosticInfo
();
int
drmErrorCode
=
Util
.
getErrorCodeFromPlatformDiagnosticsInfo
(
diagnosticsInfo
);
return
C
.
getErrorCodeForMediaDrmErrorCode
(
drmErrorCode
);
}
}
@RequiresApi
(
23
)
private
static
final
class
PlatformOperationsWrapperV23
{
@DoNotInline
public
static
boolean
isMediaDrmResetException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
MediaDrmResetException
;
}
}
}
}
library/core/src/main/java/com/google/android/exoplayer2/drm/DrmUtil.java
0 → 100644
View file @
d6c721ff
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com
.
google
.
android
.
exoplayer2
.
drm
;
import
android.media.DeniedByServerException
;
import
android.media.MediaDrm
;
import
android.media.MediaDrmResetException
;
import
android.media.NotProvisionedException
;
import
androidx.annotation.DoNotInline
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.RequiresApi
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.PlaybackException
;
import
com.google.android.exoplayer2.util.Util
;
/** DRM-related utility methods. */
public
final
class
DrmUtil
{
/**
* Returns the {@link PlaybackException.ErrorCode} that corresponds to the given DRM-related
* exception.
*
* @param exception The DRM-related exception for which to obtain a corresponding {@link
* PlaybackException.ErrorCode}.
* @param thrownByExoMediaDrm Whether the given exception originated in a {@link ExoMediaDrm}
* method. Exceptions that did not originate in {@link ExoMediaDrm} are assumed to originate
* in the license request.
* @return The {@link PlaybackException.ErrorCode} that corresponds to the given DRM-related
* exception.
*/
@PlaybackException
.
ErrorCode
public
static
int
getErrorCodeForMediaDrmException
(
Exception
exception
,
boolean
thrownByExoMediaDrm
)
{
if
(
Util
.
SDK_INT
>=
21
&&
PlatformOperationsWrapperV21
.
isMediaDrmStateException
(
exception
))
{
return
PlatformOperationsWrapperV21
.
mediaDrmStateExceptionToErrorCode
(
exception
);
}
else
if
(
Util
.
SDK_INT
>=
23
&&
PlatformOperationsWrapperV23
.
isMediaDrmResetException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_SYSTEM_ERROR
;
}
else
if
(
Util
.
SDK_INT
>=
18
&&
PlatformOperationsWrapperV18
.
isNotProvisionedException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_PROVISIONING_FAILED
;
}
else
if
(
Util
.
SDK_INT
>=
18
&&
PlatformOperationsWrapperV18
.
isDeniedByServerException
(
exception
))
{
return
PlaybackException
.
ERROR_CODE_DRM_DEVICE_REVOKED
;
}
else
if
(
exception
instanceof
UnsupportedDrmException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_SCHEME_UNSUPPORTED
;
}
else
if
(
exception
instanceof
DefaultDrmSessionManager
.
MissingSchemeDataException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_CONTENT_ERROR
;
}
else
if
(
exception
instanceof
KeysExpiredException
)
{
return
PlaybackException
.
ERROR_CODE_DRM_LICENSE_EXPIRED
;
}
else
if
(
thrownByExoMediaDrm
)
{
// A MediaDrm exception was thrown but it was impossible to determine the cause. Because no
// better diagnosis tools were provided, we treat this as a system error.
return
PlaybackException
.
ERROR_CODE_DRM_SYSTEM_ERROR
;
}
else
{
// The error happened during the license request.
return
PlaybackException
.
ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED
;
}
}
// Internal classes.
@RequiresApi
(
18
)
private
static
final
class
PlatformOperationsWrapperV18
{
@DoNotInline
public
static
boolean
isNotProvisionedException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
NotProvisionedException
;
}
@DoNotInline
public
static
boolean
isDeniedByServerException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
DeniedByServerException
;
}
}
@RequiresApi
(
21
)
private
static
final
class
PlatformOperationsWrapperV21
{
@DoNotInline
public
static
boolean
isMediaDrmStateException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
MediaDrm
.
MediaDrmStateException
;
}
@DoNotInline
@PlaybackException
.
ErrorCode
public
static
int
mediaDrmStateExceptionToErrorCode
(
Throwable
throwable
)
{
@Nullable
String
diagnosticsInfo
=
((
MediaDrm
.
MediaDrmStateException
)
throwable
).
getDiagnosticInfo
();
int
drmErrorCode
=
Util
.
getErrorCodeFromPlatformDiagnosticsInfo
(
diagnosticsInfo
);
return
C
.
getErrorCodeForMediaDrmErrorCode
(
drmErrorCode
);
}
}
@RequiresApi
(
23
)
private
static
final
class
PlatformOperationsWrapperV23
{
@DoNotInline
public
static
boolean
isMediaDrmResetException
(
@Nullable
Throwable
throwable
)
{
return
throwable
instanceof
MediaDrmResetException
;
}
}
// Prevent instantiation.
private
DrmUtil
()
{}
}
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