// Copyright 2018 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/media_types.h" #include namespace media { // static AudioType AudioType::FromDecoderConfig(const AudioDecoderConfig& config) { return {config.codec(), AudioCodecProfile::kUnknown, false}; } // static VideoType VideoType::FromDecoderConfig(const VideoDecoderConfig& config) { // Level is not part of |config|. Its also not always known in the container // metadata (e.g. WebM puts it in CodecPrivate which is often not included). // Level is not used by /media to make/break support decisions, but // embedders with strict hardware limitations could theoretically check it. // The following attempts to make a safe guess by choosing the lowest level // for the given codec. // Zero is not a valid level for any of the following codecs. It means // "unknown" or "no level" (e.g. VP8). int level = 0; switch (config.codec()) { // These have no notion of level. case VideoCodec::kUnknown: case VideoCodec::kTheora: case VideoCodec::kVP8: // These use non-numeric levels, aren't part of our mime code, and // are ancient with very limited support. case VideoCodec::kVC1: case VideoCodec::kMPEG2: case VideoCodec::kMPEG4: break; case VideoCodec::kH264: case VideoCodec::kVP9: case VideoCodec::kHEVC: // 10 is the level_idc for level 1.0. level = 10; break; case VideoCodec::kDolbyVision: // Dolby doesn't do decimals, so 1 is just 1. level = 1; break; case VideoCodec::kAV1: // Strangely, AV1 starts at 2.0. level = 20; break; } return {config.codec(), config.profile(), level, config.color_space_info()}; } bool operator==(const AudioType& x, const AudioType& y) { return std::tie(x.codec, x.profile, x.spatial_rendering) == std::tie(y.codec, y.profile, y.spatial_rendering); } bool operator!=(const AudioType& x, const AudioType& y) { return !(x == y); } bool operator==(const VideoType& x, const VideoType& y) { return std::tie(x.codec, x.profile, x.level, x.color_space) == std::tie(y.codec, y.profile, y.level, y.color_space); } bool operator!=(const VideoType& x, const VideoType& y) { return !(x == y); } } // namespace media