| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/base/decode_capabilities.h" |
| |
| #include "base/command_line.h" |
| #include "base/feature_list.h" |
| #include "media/base/media_switches.h" |
| #include "ui/display/display_switches.h" |
| |
| #if !defined(MEDIA_DISABLE_LIBVPX) |
| // VPX_CODEC_DISABLE_COMPAT excludes parts of the libvpx API that provide |
| // backwards compatibility for legacy applications using the library. |
| #define VPX_CODEC_DISABLE_COMPAT 1 |
| extern "C" { |
| #include "third_party/libvpx/source/libvpx/vpx/vp8dx.h" |
| #include "third_party/libvpx/source/libvpx/vpx/vpx_codec.h" |
| } |
| #endif |
| |
| namespace media { |
| |
| bool IsColorSpaceSupported(const media::VideoColorSpace& color_space) { |
| bool color_management = |
| base::FeatureList::IsEnabled(features::kHighDynamicRange) || |
| base::FeatureList::IsEnabled(media::kVideoColorManagement); |
| switch (color_space.primaries) { |
| case media::VideoColorSpace::PrimaryID::EBU_3213_E: |
| case media::VideoColorSpace::PrimaryID::INVALID: |
| return false; |
| |
| // Transfers supported without color management. |
| case media::VideoColorSpace::PrimaryID::BT709: |
| case media::VideoColorSpace::PrimaryID::UNSPECIFIED: |
| case media::VideoColorSpace::PrimaryID::BT470M: |
| case media::VideoColorSpace::PrimaryID::BT470BG: |
| case media::VideoColorSpace::PrimaryID::SMPTE170M: |
| break; |
| |
| // Supported with color management. |
| case media::VideoColorSpace::PrimaryID::SMPTE240M: |
| case media::VideoColorSpace::PrimaryID::FILM: |
| case media::VideoColorSpace::PrimaryID::BT2020: |
| case media::VideoColorSpace::PrimaryID::SMPTEST428_1: |
| case media::VideoColorSpace::PrimaryID::SMPTEST431_2: |
| case media::VideoColorSpace::PrimaryID::SMPTEST432_1: |
| if (!color_management) |
| return false; |
| break; |
| } |
| |
| switch (color_space.transfer) { |
| // Transfers supported without color management. |
| case media::VideoColorSpace::TransferID::UNSPECIFIED: |
| case media::VideoColorSpace::TransferID::GAMMA22: |
| case media::VideoColorSpace::TransferID::BT709: |
| case media::VideoColorSpace::TransferID::SMPTE170M: |
| case media::VideoColorSpace::TransferID::BT2020_10: |
| case media::VideoColorSpace::TransferID::BT2020_12: |
| case media::VideoColorSpace::TransferID::IEC61966_2_1: |
| break; |
| |
| // Supported with color management. |
| case media::VideoColorSpace::TransferID::GAMMA28: |
| case media::VideoColorSpace::TransferID::SMPTE240M: |
| case media::VideoColorSpace::TransferID::LINEAR: |
| case media::VideoColorSpace::TransferID::LOG: |
| case media::VideoColorSpace::TransferID::LOG_SQRT: |
| case media::VideoColorSpace::TransferID::BT1361_ECG: |
| case media::VideoColorSpace::TransferID::SMPTEST2084: |
| case media::VideoColorSpace::TransferID::IEC61966_2_4: |
| case media::VideoColorSpace::TransferID::SMPTEST428_1: |
| case media::VideoColorSpace::TransferID::ARIB_STD_B67: |
| if (!color_management) |
| return false; |
| break; |
| |
| // Never supported. |
| case media::VideoColorSpace::TransferID::INVALID: |
| return false; |
| } |
| |
| switch (color_space.matrix) { |
| // Supported without color management. |
| case media::VideoColorSpace::MatrixID::BT709: |
| case media::VideoColorSpace::MatrixID::UNSPECIFIED: |
| case media::VideoColorSpace::MatrixID::BT470BG: |
| case media::VideoColorSpace::MatrixID::SMPTE170M: |
| case media::VideoColorSpace::MatrixID::BT2020_NCL: |
| break; |
| |
| // Supported with color management. |
| case media::VideoColorSpace::MatrixID::RGB: |
| case media::VideoColorSpace::MatrixID::FCC: |
| case media::VideoColorSpace::MatrixID::SMPTE240M: |
| case media::VideoColorSpace::MatrixID::YCOCG: |
| case media::VideoColorSpace::MatrixID::YDZDX: |
| case media::VideoColorSpace::MatrixID::BT2020_CL: |
| if (!color_management) |
| return false; |
| break; |
| |
| // Never supported. |
| case media::VideoColorSpace::MatrixID::INVALID: |
| return false; |
| } |
| |
| if (color_space.range == gfx::ColorSpace::RangeID::INVALID) |
| return false; |
| |
| return true; |
| } |
| |
| bool IsVp9ProfileSupported(VideoCodecProfile profile) { |
| #if !defined(MEDIA_DISABLE_LIBVPX) |
| // High bit depth capabilities may be toggled via LibVPX config flags. |
| static bool vpx_supports_high_bit_depth = |
| (vpx_codec_get_caps(vpx_codec_vp9_dx()) & VPX_CODEC_CAP_HIGHBITDEPTH) != |
| 0; |
| |
| switch (profile) { |
| // LibVPX always supports Profiles 0 and 1. |
| case VP9PROFILE_PROFILE0: |
| case VP9PROFILE_PROFILE1: |
| return true; |
| case VP9PROFILE_PROFILE2: |
| case VP9PROFILE_PROFILE3: |
| return vpx_supports_high_bit_depth; |
| default: |
| NOTREACHED(); |
| } |
| #endif |
| return false; |
| } |
| |
| bool IsSupportedAudioConfig(const AudioConfig& config) { |
| switch (config.codec) { |
| case media::kCodecAAC: |
| case media::kCodecFLAC: |
| case media::kCodecMP3: |
| case media::kCodecOpus: |
| case media::kCodecPCM: |
| case media::kCodecPCM_MULAW: |
| case media::kCodecPCM_S16BE: |
| case media::kCodecPCM_S24BE: |
| case media::kCodecPCM_ALAW: |
| case media::kCodecVorbis: |
| return true; |
| |
| case media::kCodecAMR_NB: |
| case media::kCodecAMR_WB: |
| case media::kCodecGSM_MS: |
| #if defined(OS_CHROMEOS) |
| return true; |
| #else |
| return false; |
| #endif |
| |
| case media::kCodecEAC3: |
| case media::kCodecALAC: |
| case media::kCodecAC3: |
| case media::kUnknownAudioCodec: |
| return false; |
| } |
| |
| NOTREACHED(); |
| return false; |
| } |
| |
| // TODO(chcunningham): Query decoders for codec profile support. Add platform |
| // specific logic for Android (move from MimeUtilIntenral). |
| bool IsSupportedVideoConfig(const VideoConfig& config) { |
| switch (config.codec) { |
| case media::kCodecVP9: |
| // Color management required for HDR to not look terrible. |
| return IsColorSpaceSupported(config.color_space) && |
| IsVp9ProfileSupported(config.profile); |
| case media::kCodecH264: |
| case media::kCodecVP8: |
| case media::kCodecTheora: |
| return true; |
| |
| case media::kUnknownVideoCodec: |
| case media::kCodecVC1: |
| case media::kCodecMPEG2: |
| case media::kCodecMPEG4: |
| case media::kCodecHEVC: |
| case media::kCodecDolbyVision: |
| return false; |
| } |
| |
| NOTREACHED(); |
| return false; |
| } |
| |
| } // namespace media |