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
f15e3973
authored
Dec 10, 2014
by
Oliver Woodman
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Fix discovery of secure decoders on some L devices.
parent
86b2209a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
14 deletions
library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java
library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java
View file @
f15e3973
...
@@ -24,6 +24,7 @@ import android.media.MediaCodecInfo.CodecCapabilities;
...
@@ -24,6 +24,7 @@ import android.media.MediaCodecInfo.CodecCapabilities;
import
android.media.MediaCodecInfo.CodecProfileLevel
;
import
android.media.MediaCodecInfo.CodecProfileLevel
;
import
android.media.MediaCodecList
;
import
android.media.MediaCodecList
;
import
android.text.TextUtils
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.util.Pair
;
import
android.util.Pair
;
import
java.util.HashMap
;
import
java.util.HashMap
;
...
@@ -34,6 +35,8 @@ import java.util.HashMap;
...
@@ -34,6 +35,8 @@ import java.util.HashMap;
@TargetApi
(
16
)
@TargetApi
(
16
)
public
class
MediaCodecUtil
{
public
class
MediaCodecUtil
{
private
static
final
String
TAG
=
"MediaCodecUtil"
;
private
static
final
HashMap
<
CodecKey
,
Pair
<
String
,
CodecCapabilities
>>
codecs
=
private
static
final
HashMap
<
CodecKey
,
Pair
<
String
,
CodecCapabilities
>>
codecs
=
new
HashMap
<
CodecKey
,
Pair
<
String
,
CodecCapabilities
>>();
new
HashMap
<
CodecKey
,
Pair
<
String
,
CodecCapabilities
>>();
...
@@ -77,6 +80,23 @@ public class MediaCodecUtil {
...
@@ -77,6 +80,23 @@ public class MediaCodecUtil {
}
}
MediaCodecListCompat
mediaCodecList
=
Util
.
SDK_INT
>=
21
MediaCodecListCompat
mediaCodecList
=
Util
.
SDK_INT
>=
21
?
new
MediaCodecListCompatV21
(
secure
)
:
new
MediaCodecListCompatV16
();
?
new
MediaCodecListCompatV21
(
secure
)
:
new
MediaCodecListCompatV16
();
Pair
<
String
,
CodecCapabilities
>
codecInfo
=
getMediaCodecInfo
(
key
,
mediaCodecList
);
// TODO: Verify this cannot occur on v22, and change >= to == [Internal: b/18678462].
if
(
secure
&&
codecInfo
==
null
&&
Util
.
SDK_INT
>=
21
)
{
// Some devices don't list secure decoders on API level 21. Try the legacy path.
mediaCodecList
=
new
MediaCodecListCompatV16
();
codecInfo
=
getMediaCodecInfo
(
key
,
mediaCodecList
);
if
(
codecInfo
!=
null
)
{
Log
.
w
(
TAG
,
"MediaCodecList API didn't list secure decoder for: "
+
mimeType
+
". Assuming: "
+
codecInfo
.
first
);
}
}
return
codecInfo
;
}
private
static
Pair
<
String
,
CodecCapabilities
>
getMediaCodecInfo
(
CodecKey
key
,
MediaCodecListCompat
mediaCodecList
)
{
String
mimeType
=
key
.
mimeType
;
int
numberOfCodecs
=
mediaCodecList
.
getCodecCount
();
int
numberOfCodecs
=
mediaCodecList
.
getCodecCount
();
boolean
secureDecodersExplicit
=
mediaCodecList
.
secureDecodersExplicit
();
boolean
secureDecodersExplicit
=
mediaCodecList
.
secureDecodersExplicit
();
// Note: MediaCodecList is sorted by the framework such that the best decoders come first.
// Note: MediaCodecList is sorted by the framework such that the best decoders come first.
...
@@ -90,18 +110,19 @@ public class MediaCodecUtil {
...
@@ -90,18 +110,19 @@ public class MediaCodecUtil {
String
supportedType
=
supportedTypes
[
j
];
String
supportedType
=
supportedTypes
[
j
];
if
(
supportedType
.
equalsIgnoreCase
(
mimeType
))
{
if
(
supportedType
.
equalsIgnoreCase
(
mimeType
))
{
CodecCapabilities
capabilities
=
info
.
getCapabilitiesForType
(
supportedType
);
CodecCapabilities
capabilities
=
info
.
getCapabilitiesForType
(
supportedType
);
boolean
secure
=
mediaCodecList
.
isSecurePlaybackSupported
(
key
.
mimeType
,
capabilities
);
if
(!
secureDecodersExplicit
)
{
if
(!
secureDecodersExplicit
)
{
// Cache variants for secure and insecure playback. Note that the secure decoder is
// Cache variants for both insecure and (if we think it's supported) secure playback.
// inferred, and may not actually exist.
codecs
.
put
(
key
.
secure
?
new
CodecKey
(
mimeType
,
false
)
:
key
,
codecs
.
put
(
key
.
secure
?
new
CodecKey
(
mimeType
,
false
)
:
key
,
Pair
.
create
(
codecName
,
capabilities
));
Pair
.
create
(
codecName
,
capabilities
));
codecs
.
put
(
key
.
secure
?
key
:
new
CodecKey
(
mimeType
,
true
),
if
(
secure
)
{
Pair
.
create
(
codecName
+
".secure"
,
capabilities
));
codecs
.
put
(
key
.
secure
?
key
:
new
CodecKey
(
mimeType
,
true
),
Pair
.
create
(
codecName
+
".secure"
,
capabilities
));
}
}
else
{
}
else
{
// We can only cache this variant. The other should be listed explicitly.
// Only cache this variant. If both insecure and secure decoders are available, they
boolean
codecSecure
=
mediaCodecList
.
isSecurePlaybackSupported
(
// should both be listed separately.
info
.
getCapabilitiesForType
(
supportedType
));
codecs
.
put
(
key
.
secure
==
secure
?
key
:
new
CodecKey
(
mimeType
,
secure
),
codecs
.
put
(
key
.
secure
==
codecSecure
?
key
:
new
CodecKey
(
mimeType
,
codecSecure
),
Pair
.
create
(
codecName
,
capabilities
));
Pair
.
create
(
codecName
,
capabilities
));
}
}
if
(
codecs
.
containsKey
(
key
))
{
if
(
codecs
.
containsKey
(
key
))
{
...
@@ -219,10 +240,8 @@ public class MediaCodecUtil {
...
@@ -219,10 +240,8 @@ public class MediaCodecUtil {
/**
/**
* Whether secure playback is supported for the given {@link CodecCapabilities}, which should
* Whether secure playback is supported for the given {@link CodecCapabilities}, which should
* have been obtained from a {@link MediaCodecInfo} obtained from this list.
* have been obtained from a {@link MediaCodecInfo} obtained from this list.
* <p>
* May only be called if {@link #secureDecodersExplicit()} returns true.
*/
*/
public
boolean
isSecurePlaybackSupported
(
CodecCapabilities
capabilities
);
public
boolean
isSecurePlaybackSupported
(
String
mimeType
,
CodecCapabilities
capabilities
);
}
}
...
@@ -252,7 +271,7 @@ public class MediaCodecUtil {
...
@@ -252,7 +271,7 @@ public class MediaCodecUtil {
}
}
@Override
@Override
public
boolean
isSecurePlaybackSupported
(
CodecCapabilities
capabilities
)
{
public
boolean
isSecurePlaybackSupported
(
String
mimeType
,
CodecCapabilities
capabilities
)
{
return
capabilities
.
isFeatureSupported
(
CodecCapabilities
.
FEATURE_SecurePlayback
);
return
capabilities
.
isFeatureSupported
(
CodecCapabilities
.
FEATURE_SecurePlayback
);
}
}
...
@@ -277,8 +296,10 @@ public class MediaCodecUtil {
...
@@ -277,8 +296,10 @@ public class MediaCodecUtil {
}
}
@Override
@Override
public
boolean
isSecurePlaybackSupported
(
CodecCapabilities
capabilities
)
{
public
boolean
isSecurePlaybackSupported
(
String
mimeType
,
CodecCapabilities
capabilities
)
{
throw
new
UnsupportedOperationException
();
// Secure decoders weren't explicitly listed prior to API level 21. We assume that a secure
// H264 decoder exists.
return
MimeTypes
.
VIDEO_H264
.
equals
(
mimeType
);
}
}
}
}
...
...
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