1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chromecast/media/base/media_codec_support.h"
6 
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/strings/string_util.h"
10 
11 namespace chromecast {
12 namespace media {
13 
ToCastAudioCodec(const::media::AudioCodec codec)14 AudioCodec ToCastAudioCodec(const ::media::AudioCodec codec) {
15   switch (codec) {
16     case ::media::kCodecAAC:
17       return kCodecAAC;
18     case ::media::kCodecMP3:
19       return kCodecMP3;
20     case ::media::kCodecPCM:
21       return kCodecPCM;
22     case ::media::kCodecPCM_S16BE:
23       return kCodecPCM_S16BE;
24     case ::media::kCodecVorbis:
25       return kCodecVorbis;
26     case ::media::kCodecOpus:
27       return kCodecOpus;
28     case ::media::kCodecEAC3:
29       return kCodecEAC3;
30     case ::media::kCodecAC3:
31       return kCodecAC3;
32     case ::media::kCodecFLAC:
33       return kCodecFLAC;
34     case ::media::kCodecMpegHAudio:
35       return kCodecMpegHAudio;
36     default:
37       LOG(ERROR) << "Unsupported audio codec " << codec;
38   }
39   return kAudioCodecUnknown;
40 }
41 
ToCastVideoCodec(const::media::VideoCodec video_codec,const::media::VideoCodecProfile codec_profile)42 VideoCodec ToCastVideoCodec(const ::media::VideoCodec video_codec,
43                             const ::media::VideoCodecProfile codec_profile) {
44   switch (video_codec) {
45     case ::media::kCodecH264:
46       return kCodecH264;
47     case ::media::kCodecVP8:
48       return kCodecVP8;
49     case ::media::kCodecVP9:
50       return kCodecVP9;
51     case ::media::kCodecHEVC:
52       return kCodecHEVC;
53     case ::media::kCodecDolbyVision:
54       if (codec_profile == ::media::DOLBYVISION_PROFILE0 ||
55           codec_profile == ::media::DOLBYVISION_PROFILE9) {
56         return kCodecDolbyVisionH264;
57       } else if (codec_profile == ::media::DOLBYVISION_PROFILE4 ||
58                  codec_profile == ::media::DOLBYVISION_PROFILE5 ||
59                  codec_profile == ::media::DOLBYVISION_PROFILE7 ||
60                  codec_profile == ::media::DOLBYVISION_PROFILE8) {
61         return kCodecDolbyVisionHEVC;
62       }
63       LOG(ERROR) << "Unsupported video codec profile " << codec_profile;
64       break;
65     case ::media::kCodecAV1:
66       return kCodecAV1;
67     default:
68       LOG(ERROR) << "Unsupported video codec " << video_codec;
69   }
70   return kVideoCodecUnknown;
71 }
72 
ToCastVideoProfile(const::media::VideoCodecProfile codec_profile)73 VideoProfile ToCastVideoProfile(
74     const ::media::VideoCodecProfile codec_profile) {
75   switch (codec_profile) {
76     case ::media::H264PROFILE_BASELINE:
77       return kH264Baseline;
78     case ::media::H264PROFILE_MAIN:
79       return kH264Main;
80     case ::media::H264PROFILE_EXTENDED:
81       return kH264Extended;
82     case ::media::H264PROFILE_HIGH:
83       return kH264High;
84     case ::media::H264PROFILE_HIGH10PROFILE:
85       return kH264High10;
86     case ::media::H264PROFILE_HIGH422PROFILE:
87       return kH264High422;
88     case ::media::H264PROFILE_HIGH444PREDICTIVEPROFILE:
89       return kH264High444Predictive;
90     case ::media::H264PROFILE_SCALABLEBASELINE:
91       return kH264ScalableBaseline;
92     case ::media::H264PROFILE_SCALABLEHIGH:
93       return kH264ScalableHigh;
94     case ::media::H264PROFILE_STEREOHIGH:
95       return kH264StereoHigh;
96     case ::media::H264PROFILE_MULTIVIEWHIGH:
97       return kH264MultiviewHigh;
98     case ::media::HEVCPROFILE_MAIN:
99       return kHEVCMain;
100     case ::media::HEVCPROFILE_MAIN10:
101       return kHEVCMain10;
102     case ::media::HEVCPROFILE_MAIN_STILL_PICTURE:
103       return kHEVCMainStillPicture;
104     case ::media::VP8PROFILE_ANY:
105       return kVP8ProfileAny;
106     case ::media::VP9PROFILE_PROFILE0:
107       return kVP9Profile0;
108     case ::media::VP9PROFILE_PROFILE1:
109       return kVP9Profile1;
110     case ::media::VP9PROFILE_PROFILE2:
111       return kVP9Profile2;
112     case ::media::VP9PROFILE_PROFILE3:
113       return kVP9Profile3;
114     case ::media::DOLBYVISION_PROFILE0:
115       return kDolbyVisionCompatible_EL_MD;
116     case ::media::DOLBYVISION_PROFILE4:
117       return kDolbyVisionCompatible_EL_MD;
118     case ::media::DOLBYVISION_PROFILE5:
119       return kDolbyVisionNonCompatible_BL_MD;
120     case ::media::DOLBYVISION_PROFILE7:
121       return kDolbyVisionNonCompatible_BL_EL_MD;
122     case ::media::AV1PROFILE_PROFILE_MAIN:
123       return kAV1ProfileMain;
124     case ::media::AV1PROFILE_PROFILE_HIGH:
125       return kAV1ProfileHigh;
126     case ::media::AV1PROFILE_PROFILE_PRO:
127       return kAV1ProfilePro;
128     default:
129       LOG(INFO) << "Unsupported video codec profile " << codec_profile;
130   }
131   return kVideoProfileUnknown;
132 }
133 
ToCastCodecProfileLevel(const::media::CodecProfileLevel & codec_profile_level)134 CodecProfileLevel ToCastCodecProfileLevel(
135     const ::media::CodecProfileLevel& codec_profile_level) {
136   CodecProfileLevel result;
137   result.codec =
138       ToCastVideoCodec(codec_profile_level.codec, codec_profile_level.profile);
139   result.profile = ToCastVideoProfile(codec_profile_level.profile);
140   result.level = codec_profile_level.level;
141   return result;
142 }
143 
144 }  // namespace media
145 }  // namespace chromecast
146