// 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