| Index: media/gpu/android_video_decode_accelerator.cc
|
| diff --git a/media/gpu/android_video_decode_accelerator.cc b/media/gpu/android_video_decode_accelerator.cc
|
| index 233d70910822699a47056296371f22119b286be3..7d54abc6c5e109598b07777202fa79d5439a420c 100644
|
| --- a/media/gpu/android_video_decode_accelerator.cc
|
| +++ b/media/gpu/android_video_decode_accelerator.cc
|
| @@ -1573,6 +1573,8 @@ AndroidVideoDecodeAccelerator::GetCapabilities(
|
| profile.profile = VP8PROFILE_ANY;
|
| // Since there is little to no power benefit below 360p, don't advertise
|
| // support for it. Let libvpx decode it, and save a MediaCodec instance.
|
| + // Note that we allow it anyway for encrypted content, since we push a
|
| + // separate profile for that.
|
| profile.min_resolution.SetSize(480, 360);
|
| profile.max_resolution.SetSize(3840, 2160);
|
| // If we know MediaCodec will just create a software codec, prefer our
|
| @@ -1583,28 +1585,38 @@ AndroidVideoDecodeAccelerator::GetCapabilities(
|
| profile.encrypted_only =
|
| VideoCodecBridge::IsKnownUnaccelerated(kCodecVP8, MEDIA_CODEC_DECODER);
|
| profiles.push_back(profile);
|
| +
|
| + // Always allow encrypted content, even at low resolutions.
|
| + profile.min_resolution.SetSize(0, 0);
|
| + profile.encrypted_only = true;
|
| + profiles.push_back(profile);
|
| }
|
|
|
| if (MediaCodecUtil::IsVp9DecoderAvailable()) {
|
| - SupportedProfile profile;
|
| - // Limit to 360p, like we do for vp8. See above.
|
| - profile.min_resolution.SetSize(480, 360);
|
| - profile.max_resolution.SetSize(3840, 2160);
|
| - // If we know MediaCodec will just create a software codec, prefer our
|
| - // internal software decoder instead. It's more up to date and secured
|
| - // within the renderer sandbox. However if the content is encrypted, we
|
| - // must use MediaCodec anyways since MediaDrm offers no way to decrypt
|
| - // the buffers and let us use our internal software decoders.
|
| - profile.encrypted_only =
|
| + const VideoCodecProfile profile_types[] = {
|
| + VP9PROFILE_PROFILE0, VP9PROFILE_PROFILE1, VP9PROFILE_PROFILE2,
|
| + VP9PROFILE_PROFILE3, VIDEO_CODEC_PROFILE_UNKNOWN};
|
| + const bool is_known_unaccelerated =
|
| VideoCodecBridge::IsKnownUnaccelerated(kCodecVP9, MEDIA_CODEC_DECODER);
|
| - profile.profile = VP9PROFILE_PROFILE0;
|
| - profiles.push_back(profile);
|
| - profile.profile = VP9PROFILE_PROFILE1;
|
| - profiles.push_back(profile);
|
| - profile.profile = VP9PROFILE_PROFILE2;
|
| - profiles.push_back(profile);
|
| - profile.profile = VP9PROFILE_PROFILE3;
|
| - profiles.push_back(profile);
|
| + for (int i = 0; profile_types[i] != VIDEO_CODEC_PROFILE_UNKNOWN; i++) {
|
| + SupportedProfile profile;
|
| + // Limit to 360p, like we do for vp8. See above.
|
| + profile.min_resolution.SetSize(480, 360);
|
| + profile.max_resolution.SetSize(3840, 2160);
|
| + // If we know MediaCodec will just create a software codec, prefer our
|
| + // internal software decoder instead. It's more up to date and secured
|
| + // within the renderer sandbox. However if the content is encrypted, we
|
| + // must use MediaCodec anyways since MediaDrm offers no way to decrypt
|
| + // the buffers and let us use our internal software decoders.
|
| + profile.encrypted_only = is_known_unaccelerated;
|
| + profile.profile = profile_types[i];
|
| + profiles.push_back(profile);
|
| +
|
| + // Always allow encrypted content.
|
| + profile.min_resolution.SetSize(0, 0);
|
| + profile.encrypted_only = true;
|
| + profiles.push_back(profile);
|
| + }
|
| }
|
|
|
| for (const auto& supported_profile : kSupportedH264Profiles) {
|
|
|