|  | // Copyright 2015 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chromecast/media/base/media_codec_support.h" | 
|  |  | 
|  | #include "base/functional/bind.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/string_util.h" | 
|  |  | 
|  | namespace chromecast { | 
|  | namespace media { | 
|  |  | 
|  | AudioCodec ToCastAudioCodec(const ::media::AudioCodec codec) { | 
|  | switch (codec) { | 
|  | case ::media::AudioCodec::kAAC: | 
|  | return kCodecAAC; | 
|  | case ::media::AudioCodec::kMP3: | 
|  | return kCodecMP3; | 
|  | case ::media::AudioCodec::kPCM: | 
|  | return kCodecPCM; | 
|  | case ::media::AudioCodec::kPCM_S16BE: | 
|  | return kCodecPCM_S16BE; | 
|  | case ::media::AudioCodec::kVorbis: | 
|  | return kCodecVorbis; | 
|  | case ::media::AudioCodec::kOpus: | 
|  | return kCodecOpus; | 
|  | case ::media::AudioCodec::kEAC3: | 
|  | return kCodecEAC3; | 
|  | case ::media::AudioCodec::kAC3: | 
|  | return kCodecAC3; | 
|  | case ::media::AudioCodec::kDTS: | 
|  | return kCodecDTS; | 
|  | case ::media::AudioCodec::kDTSXP2: | 
|  | return kCodecDTSXP2; | 
|  | case ::media::AudioCodec::kDTSE: | 
|  | return kCodecDTSE; | 
|  | case ::media::AudioCodec::kFLAC: | 
|  | return kCodecFLAC; | 
|  | case ::media::AudioCodec::kMpegHAudio: | 
|  | return kCodecMpegHAudio; | 
|  | default: | 
|  | LOG(ERROR) << "Unsupported audio codec " << codec; | 
|  | } | 
|  | return kAudioCodecUnknown; | 
|  | } | 
|  |  | 
|  | VideoCodec ToCastVideoCodec(const ::media::VideoCodec video_codec, | 
|  | const ::media::VideoCodecProfile codec_profile) { | 
|  | switch (video_codec) { | 
|  | case ::media::VideoCodec::kH264: | 
|  | return kCodecH264; | 
|  | case ::media::VideoCodec::kVP8: | 
|  | return kCodecVP8; | 
|  | case ::media::VideoCodec::kVP9: | 
|  | return kCodecVP9; | 
|  | case ::media::VideoCodec::kHEVC: | 
|  | return kCodecHEVC; | 
|  | case ::media::VideoCodec::kDolbyVision: | 
|  | if (codec_profile == ::media::DOLBYVISION_PROFILE0 || | 
|  | codec_profile == ::media::DOLBYVISION_PROFILE9) { | 
|  | return kCodecDolbyVisionH264; | 
|  | } else if (codec_profile == ::media::DOLBYVISION_PROFILE5 || | 
|  | codec_profile == ::media::DOLBYVISION_PROFILE7 || | 
|  | codec_profile == ::media::DOLBYVISION_PROFILE8) { | 
|  | return kCodecDolbyVisionHEVC; | 
|  | } | 
|  | LOG(ERROR) << "Unsupported video codec profile " << codec_profile; | 
|  | break; | 
|  | case ::media::VideoCodec::kAV1: | 
|  | return kCodecAV1; | 
|  | default: | 
|  | LOG(ERROR) << "Unsupported video codec " << video_codec; | 
|  | } | 
|  | return kVideoCodecUnknown; | 
|  | } | 
|  |  | 
|  | VideoProfile ToCastVideoProfile( | 
|  | const ::media::VideoCodecProfile codec_profile) { | 
|  | switch (codec_profile) { | 
|  | case ::media::H264PROFILE_BASELINE: | 
|  | return kH264Baseline; | 
|  | case ::media::H264PROFILE_MAIN: | 
|  | return kH264Main; | 
|  | case ::media::H264PROFILE_EXTENDED: | 
|  | return kH264Extended; | 
|  | case ::media::H264PROFILE_HIGH: | 
|  | return kH264High; | 
|  | case ::media::H264PROFILE_HIGH10PROFILE: | 
|  | return kH264High10; | 
|  | case ::media::H264PROFILE_HIGH422PROFILE: | 
|  | return kH264High422; | 
|  | case ::media::H264PROFILE_HIGH444PREDICTIVEPROFILE: | 
|  | return kH264High444Predictive; | 
|  | case ::media::H264PROFILE_SCALABLEBASELINE: | 
|  | return kH264ScalableBaseline; | 
|  | case ::media::H264PROFILE_SCALABLEHIGH: | 
|  | return kH264ScalableHigh; | 
|  | case ::media::H264PROFILE_STEREOHIGH: | 
|  | return kH264StereoHigh; | 
|  | case ::media::H264PROFILE_MULTIVIEWHIGH: | 
|  | return kH264MultiviewHigh; | 
|  | case ::media::HEVCPROFILE_MAIN: | 
|  | return kHEVCMain; | 
|  | case ::media::HEVCPROFILE_MAIN10: | 
|  | return kHEVCMain10; | 
|  | case ::media::HEVCPROFILE_MAIN_STILL_PICTURE: | 
|  | return kHEVCMainStillPicture; | 
|  | case ::media::HEVCPROFILE_REXT: | 
|  | return kHEVCRext; | 
|  | case ::media::HEVCPROFILE_HIGH_THROUGHPUT: | 
|  | return kHEVCHighThroughput; | 
|  | case ::media::HEVCPROFILE_MULTIVIEW_MAIN: | 
|  | return kHEVCMultiviewMain; | 
|  | case ::media::HEVCPROFILE_SCALABLE_MAIN: | 
|  | return kHEVCScalableMain; | 
|  | case ::media::HEVCPROFILE_3D_MAIN: | 
|  | return kHEVC3dMain; | 
|  | case ::media::HEVCPROFILE_SCREEN_EXTENDED: | 
|  | return kHEVCScreenExtended; | 
|  | case ::media::HEVCPROFILE_SCALABLE_REXT: | 
|  | return kHEVCScalableRext; | 
|  | case ::media::HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED: | 
|  | return kHEVCHighThroughputScreenExtended; | 
|  | case ::media::VP8PROFILE_ANY: | 
|  | return kVP8ProfileAny; | 
|  | case ::media::VP9PROFILE_PROFILE0: | 
|  | return kVP9Profile0; | 
|  | case ::media::VP9PROFILE_PROFILE1: | 
|  | return kVP9Profile1; | 
|  | case ::media::VP9PROFILE_PROFILE2: | 
|  | return kVP9Profile2; | 
|  | case ::media::VP9PROFILE_PROFILE3: | 
|  | return kVP9Profile3; | 
|  | case ::media::DOLBYVISION_PROFILE0: | 
|  | return kDolbyVisionProfile0; | 
|  | case ::media::DOLBYVISION_PROFILE5: | 
|  | return kDolbyVisionProfile5; | 
|  | case ::media::DOLBYVISION_PROFILE7: | 
|  | return kDolbyVisionProfile7; | 
|  | case ::media::DOLBYVISION_PROFILE8: | 
|  | return kDolbyVisionProfile8; | 
|  | case ::media::DOLBYVISION_PROFILE9: | 
|  | return kDolbyVisionProfile9; | 
|  | case ::media::AV1PROFILE_PROFILE_MAIN: | 
|  | return kAV1ProfileMain; | 
|  | case ::media::AV1PROFILE_PROFILE_HIGH: | 
|  | return kAV1ProfileHigh; | 
|  | case ::media::AV1PROFILE_PROFILE_PRO: | 
|  | return kAV1ProfilePro; | 
|  | case ::media::VVCPROFILE_MAIN10: | 
|  | return kVVCProfileMain10; | 
|  | case ::media::VVCPROFILE_MAIN12: | 
|  | return kVVCProfileMain12; | 
|  | case ::media::VVCPROFILE_MAIN12_INTRA: | 
|  | return kVVCProfileMain12Intra; | 
|  | case ::media::VVCPROIFLE_MULTILAYER_MAIN10: | 
|  | return kVVCProfileMultilayerMain10; | 
|  | case ::media::VVCPROFILE_MAIN10_444: | 
|  | return kVVCProfileMain10444; | 
|  | case ::media::VVCPROFILE_MAIN12_444: | 
|  | return kVVCProfileMain12444; | 
|  | case ::media::VVCPROFILE_MAIN16_444: | 
|  | return kVVCProfileMain16444; | 
|  | case ::media::VVCPROFILE_MAIN12_444_INTRA: | 
|  | return kVVCProfileMain12444Intra; | 
|  | case ::media::VVCPROFILE_MAIN16_444_INTRA: | 
|  | return kVVCProfileMain16444Intra; | 
|  | case ::media::VVCPROFILE_MULTILAYER_MAIN10_444: | 
|  | return kVVCProfileMain10444; | 
|  | case ::media::VVCPROFILE_MAIN10_STILL_PICTURE: | 
|  | return kVVCProfileMain10Still; | 
|  | case ::media::VVCPROFILE_MAIN12_STILL_PICTURE: | 
|  | return kVVCProfileMain12Still; | 
|  | case ::media::VVCPROFILE_MAIN10_444_STILL_PICTURE: | 
|  | return kVVCProfileMain10444Still; | 
|  | case ::media::VVCPROFILE_MAIN12_444_STILL_PICTURE: | 
|  | return kVVCProfileMain12444Still; | 
|  | case ::media::VVCPROFILE_MAIN16_444_STILL_PICTURE: | 
|  | return kVVCProfileMain16444Still; | 
|  | default: | 
|  | LOG(INFO) << "Unsupported video codec profile " << codec_profile; | 
|  | } | 
|  | return kVideoProfileUnknown; | 
|  | } | 
|  |  | 
|  | CodecProfileLevel ToCastCodecProfileLevel( | 
|  | const ::media::CodecProfileLevel& codec_profile_level) { | 
|  | CodecProfileLevel result; | 
|  | result.codec = | 
|  | ToCastVideoCodec(codec_profile_level.codec, codec_profile_level.profile); | 
|  | result.profile = ToCastVideoProfile(codec_profile_level.profile); | 
|  | result.level = codec_profile_level.level; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | }  // namespace media | 
|  | }  // namespace chromecast |