Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: chromecast/media/base/media_codec_support.cc

Issue 2640113004: Introduce Dolby Vision video codec and Demuxer support (Closed)
Patch Set: fix build break on Android Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/base/media_codec_support.h" 5 #include "chromecast/media/base/media_codec_support.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "chromecast/media/base/media_caps.h" 9 #include "chromecast/media/base/media_caps.h"
10 #include "chromecast/public/media_codec_support_shlib.h" 10 #include "chromecast/public/media_codec_support_shlib.h"
11 11
12 namespace chromecast { 12 namespace chromecast {
13 namespace media { 13 namespace media {
14 namespace { 14 namespace {
15 15
16 bool IsCodecSupported(const std::string& codec) { 16 bool IsCodecSupported(const std::string& codec) {
17 // FLAC and Opus are supported via the default renderer if the CMA backend 17 // FLAC and Opus are supported via the default renderer if the CMA backend
18 // does not have explicit support. 18 // does not have explicit support.
19 if (codec == "opus" || codec == "flac") 19 if (codec == "opus" || codec == "flac")
20 return true; 20 return true;
21 21
22 MediaCodecSupportShlib::CodecSupport platform_support = 22 MediaCodecSupportShlib::CodecSupport platform_support =
23 MediaCodecSupportShlib::IsSupported(codec); 23 MediaCodecSupportShlib::IsSupported(codec);
24 if (platform_support == MediaCodecSupportShlib::kSupported) 24 if (platform_support == MediaCodecSupportShlib::kSupported)
25 return true; 25 return true;
26 else if (platform_support == MediaCodecSupportShlib::kNotSupported) 26 else if (platform_support == MediaCodecSupportShlib::kNotSupported)
27 return false; 27 return false;
28 28
29 // MediaCodecSupportShlib::IsSupported() returns kDefault.
29 if (codec == "aac51") { 30 if (codec == "aac51") {
30 return MediaCapabilities::HdmiSinkSupportsPcmSurroundSound(); 31 return MediaCapabilities::HdmiSinkSupportsPcmSurroundSound();
31 } 32 }
32 if (codec == "ac-3" || codec == "mp4a.a5" || codec == "mp4a.A5") { 33 if (codec == "ac-3" || codec == "mp4a.a5" || codec == "mp4a.A5") {
33 return MediaCapabilities::HdmiSinkSupportsAC3(); 34 return MediaCapabilities::HdmiSinkSupportsAC3();
34 } 35 }
35 if (codec == "ec-3" || codec == "mp4a.a6" || codec == "mp4a.A6") { 36 if (codec == "ec-3" || codec == "mp4a.a6" || codec == "mp4a.A6") {
36 return MediaCapabilities::HdmiSinkSupportsEAC3(); 37 return MediaCapabilities::HdmiSinkSupportsEAC3();
37 } 38 }
38 39
40 // For Dolby Vision, getting kDefault from shared library indicates the
41 // platform has external dependency to stream Dolby Vision. It needs to check
42 // HDMI sink capability as well.
43 if (base::StartsWith(codec, "dva1.", base::CompareCase::SENSITIVE) ||
44 base::StartsWith(codec, "dvav.", base::CompareCase::SENSITIVE) ||
45 base::StartsWith(codec, "dvh1.", base::CompareCase::SENSITIVE) ||
46 base::StartsWith(codec, "dvhe.", base::CompareCase::SENSITIVE)) {
47 return MediaCapabilities::HdmiSinkSupportsDolbyVision();
48 }
49
39 // This function is invoked from MimeUtil::AreSupportedCodecs to check if a 50 // This function is invoked from MimeUtil::AreSupportedCodecs to check if a
40 // given codec id is supported by Chromecast or not. So by default we should 51 // given codec id is supported by Chromecast or not. So by default we should
41 // return true by default to indicate we have no reasons to believe this codec 52 // return true by default to indicate we have no reasons to believe this codec
42 // is unsupported. This will allow the rest of MimeUtil checks to proceed as 53 // is unsupported. This will allow the rest of MimeUtil checks to proceed as
43 // usual. 54 // usual.
44 return true; 55 return true;
45 } 56 }
46 57
47 } // namespace 58 } // namespace
48 59
49 ::media::IsCodecSupportedCB GetIsCodecSupportedOnChromecastCB() { 60 ::media::IsCodecSupportedCB GetIsCodecSupportedOnChromecastCB() {
50 return base::Bind(&IsCodecSupported); 61 return base::Bind(&IsCodecSupported);
51 } 62 }
52 63
53 // Converts ::media::VideoCodec to chromecast::media::VideoCodec. Any unknown or 64 VideoCodec ToCastVideoCodec(const ::media::VideoCodec video_codec,
54 // unsupported codec will be converted to chromecast::media::kCodecUnknown. 65 const ::media::VideoCodecProfile codec_profile) {
55 VideoCodec ToCastVideoCodec(const ::media::VideoCodec video_codec) {
56 switch (video_codec) { 66 switch (video_codec) {
57 case ::media::kCodecH264: 67 case ::media::kCodecH264:
58 return kCodecH264; 68 return kCodecH264;
59 case ::media::kCodecVP8: 69 case ::media::kCodecVP8:
60 return kCodecVP8; 70 return kCodecVP8;
61 case ::media::kCodecVP9: 71 case ::media::kCodecVP9:
62 return kCodecVP9; 72 return kCodecVP9;
63 case ::media::kCodecHEVC: 73 case ::media::kCodecHEVC:
64 return kCodecHEVC; 74 return kCodecHEVC;
75 case ::media::kCodecDolbyVision:
76 if (codec_profile == ::media::DOLBYVISION_PROFILE0) {
77 return kCodecDolbyVisionH264;
78 } else if (codec_profile == ::media::DOLBYVISION_PROFILE4 ||
79 codec_profile == ::media::DOLBYVISION_PROFILE5 ||
80 codec_profile == ::media::DOLBYVISION_PROFILE7) {
81 return kCodecDolbyVisionHEVC;
82 }
83 LOG(ERROR) << "Unsupported video codec profile " << codec_profile;
84 break;
65 default: 85 default:
66 LOG(ERROR) << "Unsupported video codec " << video_codec; 86 LOG(ERROR) << "Unsupported video codec " << video_codec;
67 } 87 }
68 return kVideoCodecUnknown; 88 return kVideoCodecUnknown;
69 } 89 }
70 90
71 // Converts ::media::VideoCodecProfile to chromecast::media::VideoProfile.
72 VideoProfile ToCastVideoProfile( 91 VideoProfile ToCastVideoProfile(
73 const ::media::VideoCodecProfile codec_profile) { 92 const ::media::VideoCodecProfile codec_profile) {
74 switch (codec_profile) { 93 switch (codec_profile) {
75 case ::media::H264PROFILE_BASELINE: 94 case ::media::H264PROFILE_BASELINE:
76 return kH264Baseline; 95 return kH264Baseline;
77 case ::media::H264PROFILE_MAIN: 96 case ::media::H264PROFILE_MAIN:
78 return kH264Main; 97 return kH264Main;
79 case ::media::H264PROFILE_EXTENDED: 98 case ::media::H264PROFILE_EXTENDED:
80 return kH264Extended; 99 return kH264Extended;
81 case ::media::H264PROFILE_HIGH: 100 case ::media::H264PROFILE_HIGH:
(...skipping 21 matching lines...) Expand all
103 case ::media::VP8PROFILE_ANY: 122 case ::media::VP8PROFILE_ANY:
104 return kVP8ProfileAny; 123 return kVP8ProfileAny;
105 case ::media::VP9PROFILE_PROFILE0: 124 case ::media::VP9PROFILE_PROFILE0:
106 return kVP9Profile0; 125 return kVP9Profile0;
107 case ::media::VP9PROFILE_PROFILE1: 126 case ::media::VP9PROFILE_PROFILE1:
108 return kVP9Profile1; 127 return kVP9Profile1;
109 case ::media::VP9PROFILE_PROFILE2: 128 case ::media::VP9PROFILE_PROFILE2:
110 return kVP9Profile2; 129 return kVP9Profile2;
111 case ::media::VP9PROFILE_PROFILE3: 130 case ::media::VP9PROFILE_PROFILE3:
112 return kVP9Profile3; 131 return kVP9Profile3;
132 case ::media::DOLBYVISION_PROFILE0:
133 return kDolbyVisionCompatible_EL_MD;
134 case ::media::DOLBYVISION_PROFILE4:
135 return kDolbyVisionCompatible_EL_MD;
136 case ::media::DOLBYVISION_PROFILE5:
137 return kDolbyVisionNonCompatible_BL_MD;
138 case ::media::DOLBYVISION_PROFILE7:
139 return kDolbyVisionNonCompatible_BL_EL_MD;
113 default: 140 default:
114 LOG(INFO) << "Unsupported video codec profile " << codec_profile; 141 LOG(INFO) << "Unsupported video codec profile " << codec_profile;
115 } 142 }
116 return kVideoProfileUnknown; 143 return kVideoProfileUnknown;
117 } 144 }
118 145
119 CodecProfileLevel ToCastCodecProfileLevel( 146 CodecProfileLevel ToCastCodecProfileLevel(
120 const ::media::CodecProfileLevel& codec_profile_level) { 147 const ::media::CodecProfileLevel& codec_profile_level) {
121 CodecProfileLevel result; 148 CodecProfileLevel result;
122 result.codec = ToCastVideoCodec(codec_profile_level.codec); 149 result.codec =
150 ToCastVideoCodec(codec_profile_level.codec, codec_profile_level.profile);
123 result.profile = ToCastVideoProfile(codec_profile_level.profile); 151 result.profile = ToCastVideoProfile(codec_profile_level.profile);
124 result.level = codec_profile_level.level; 152 result.level = codec_profile_level.level;
125 return result; 153 return result;
126 } 154 }
127 155
128 } // namespace media 156 } // namespace media
129 } // namespace chromecast 157 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/base/media_codec_support.h ('k') | chromecast/media/cma/base/decoder_config_adapter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698