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

Side by Side Diff: media/base/mime_util.cc

Issue 1690063002: Fix mime type mappings when the unified media pipeline is enabled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix all teh things. Created 4 years, 10 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <map> 8 #include <map>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "build/build_config.h" 16 #include "build/build_config.h"
17 #include "media/base/media.h"
17 #include "media/base/mime_util.h" 18 #include "media/base/mime_util.h"
18 #include "media/media_features.h" 19 #include "media/media_features.h"
19 20
20 #if defined(OS_ANDROID) 21 #if defined(OS_ANDROID)
21 #include "base/android/build_info.h" 22 #include "base/android/build_info.h"
23 #include "media/base/android/media_codec_util.h"
22 #endif 24 #endif
23 25
24 namespace media { 26 namespace media {
25 27
26 // Singleton utility class for mime types. 28 // Singleton utility class for mime types.
27 class MimeUtil { 29 class MimeUtil {
28 public: 30 public:
29 enum Codec { 31 enum Codec {
30 INVALID_CODEC, 32 INVALID_CODEC,
31 PCM, 33 PCM,
(...skipping 17 matching lines...) Expand all
49 THEORA 51 THEORA
50 }; 52 };
51 53
52 bool IsSupportedMediaMimeType(const std::string& mime_type) const; 54 bool IsSupportedMediaMimeType(const std::string& mime_type) const;
53 55
54 void ParseCodecString(const std::string& codecs, 56 void ParseCodecString(const std::string& codecs,
55 std::vector<std::string>* codecs_out, 57 std::vector<std::string>* codecs_out,
56 bool strip); 58 bool strip);
57 59
58 SupportsType IsSupportedMediaFormat( 60 SupportsType IsSupportedMediaFormat(
61 bool is_encrypted,
ddorwin 2016/02/16 20:34:37 nit: It seems odd that |is_encrypted| is the first
DaleCurtis 2016/02/17 03:01:05 Had to redo all of these changes after the split,
59 const std::string& mime_type, 62 const std::string& mime_type,
60 const std::vector<std::string>& codecs) const; 63 const std::vector<std::string>& codecs) const;
61 64
62 void RemoveProprietaryMediaTypesAndCodecsForTests(); 65 void RemoveProprietaryMediaTypesAndCodecsForTests();
63 66
64 private: 67 private:
65 friend struct base::DefaultLazyInstanceTraits<MimeUtil>; 68 friend struct base::DefaultLazyInstanceTraits<MimeUtil>;
66 69
67 typedef base::hash_set<int> CodecSet; 70 typedef base::hash_set<int> CodecSet;
68 typedef std::map<std::string, CodecSet> MediaFormatMappings; 71 typedef std::map<std::string, CodecSet> MediaFormatMappings;
69 struct CodecEntry { 72 struct CodecEntry {
70 CodecEntry() : codec(INVALID_CODEC), is_ambiguous(true) {} 73 CodecEntry() : codec(INVALID_CODEC), is_ambiguous(true) {}
71 CodecEntry(Codec c, bool ambiguous) : codec(c), is_ambiguous(ambiguous) {} 74 CodecEntry(Codec c, bool ambiguous) : codec(c), is_ambiguous(ambiguous) {}
72 Codec codec; 75 Codec codec;
73 bool is_ambiguous; 76 bool is_ambiguous;
74 }; 77 };
75 typedef std::map<std::string, CodecEntry> StringToCodecMappings; 78 typedef std::map<std::string, CodecEntry> StringToCodecMappings;
76 79
77 MimeUtil(); 80 MimeUtil();
78 81
79 // For faster lookup, keep hash sets. 82 // For faster lookup, keep hash sets.
80 void InitializeMimeTypeMaps(); 83 void InitializeMimeTypeMaps();
81 84
82 // Returns IsSupported if all codec IDs in |codecs| are unambiguous 85 // Returns IsSupported if all codec IDs in |codecs| are unambiguous and are
83 // and are supported by the platform. MayBeSupported is returned if 86 // supported by the platform when contained in |mime_type_lower_case|.
ddorwin 2016/02/16 20:34:37 "platform" - This was the existing phrasing, but e
DaleCurtis 2016/02/17 03:01:05 Deleted platform from wording here.
84 // at least one codec ID in |codecs| is ambiguous but all the codecs 87 // MayBeSupported is returned if at least one codec ID in |codecs| is
85 // are supported by the platform. IsNotSupported is returned if at 88 // ambiguous but all the codecs are supported by the platform. IsNotSupported
86 // least one codec ID is not supported by the platform. 89 // is returned if at least one codec ID is not supported by the platform.
ddorwin 2016/02/16 20:34:37 nit: two spaces
DaleCurtis 2016/02/17 03:01:05 Done.
87 SupportsType AreSupportedCodecs( 90 // |is_encrypted| means the codec will be used with encrypted samples.
ddorwin 2016/02/16 20:34:37 nit: s/samples/blocks/?
DaleCurtis 2016/02/17 03:01:05 Done.
88 const CodecSet& supported_codecs, 91 SupportsType AreSupportedCodecs(bool is_encrypted,
89 const std::vector<std::string>& codecs) const; 92 const std::string& mime_type_lower_case,
93 const CodecSet& supported_codecs,
94 const std::vector<std::string>& codecs) const;
90 95
91 // Converts a codec ID into an Codec enum value and indicates 96 // Converts a codec ID into an Codec enum value and indicates
92 // whether the conversion was ambiguous. 97 // whether the conversion was ambiguous.
93 // Returns true if this method was able to map |codec_id| to a specific 98 // Returns true if this method was able to map |codec_id| to a specific
94 // Codec enum value. |codec| and |is_ambiguous| are only valid if true 99 // Codec enum value. |codec| and |is_ambiguous| are only valid if true
95 // is returned. Otherwise their value is undefined after the call. 100 // is returned. Otherwise their value is undefined after the call.
96 // |is_ambiguous| is true if |codec_id| did not have enough information to 101 // |is_ambiguous| is true if |codec_id| did not have enough information to
97 // unambiguously determine the proper Codec enum value. If |is_ambiguous| 102 // unambiguously determine the proper Codec enum value. If |is_ambiguous|
98 // is true |codec| contains the best guess for the intended Codec enum value. 103 // is true |codec| contains the best guess for the intended Codec enum value.
99 bool StringToCodec(const std::string& codec_id, 104 bool StringToCodec(const std::string& codec_id,
100 Codec* codec, 105 Codec* codec,
101 bool* is_ambiguous) const; 106 bool* is_ambiguous) const;
102 107
103 // Returns true if |codec| is supported by the platform. 108 // Returns true if |codec| and |mime_type_lower_case| are supported by the
ddorwin 2016/02/16 20:34:37 Add "when contained in" as above?
DaleCurtis 2016/02/17 03:01:05 Done.
104 // Note: This method will return false if the platform supports proprietary 109 // platform. Note: This method will return false if the platform supports
ddorwin 2016/02/16 20:34:37 ditto for "platform"
DaleCurtis 2016/02/17 03:01:05 Done.
105 // codecs but |allow_proprietary_codecs_| is set to false. 110 // proprietary codecs but |allow_proprietary_codecs_| is set to false.
106 bool IsCodecSupported(Codec codec) const; 111 // |is_encrypted| means the codec will be used with encrypted samples.
ddorwin 2016/02/16 20:34:37 ditto for "samples"
DaleCurtis 2016/02/17 03:01:05 Done.
112 bool IsCodecSupported(bool is_encrypted,
113 const std::string& mime_type_lower_case,
114 Codec codec) const;
107 115
108 // Returns true if |codec| refers to a proprietary codec. 116 // Returns true if |codec| refers to a proprietary codec.
109 bool IsCodecProprietary(Codec codec) const; 117 bool IsCodecProprietary(Codec codec) const;
110 118
111 // Returns true and sets |*default_codec| if |mime_type| has a default codec 119 // Returns true and sets |*default_codec| if |mime_type| has a default codec
112 // associated with it. Returns false otherwise and the value of 120 // associated with it. Returns false otherwise and the value of
113 // |*default_codec| is undefined. 121 // |*default_codec| is undefined.
114 bool GetDefaultCodecLowerCase(const std::string& mime_type_lower_case, 122 bool GetDefaultCodecLowerCase(const std::string& mime_type_lower_case,
115 Codec* default_codec) const; 123 Codec* default_codec) const;
116 124
117 // Returns true if |mime_type_lower_case| has a default codec associated with 125 // Returns true if |mime_type_lower_case| has a default codec associated with
118 // it and IsCodecSupported() returns true for that particular codec. 126 // it and IsCodecSupported() returns true for that particular codec.
127 // |is_encrypted| means the codec will be used with encrypted samples.
119 bool IsDefaultCodecSupportedLowerCase( 128 bool IsDefaultCodecSupportedLowerCase(
129 bool is_encrypted,
120 const std::string& mime_type_lower_case) const; 130 const std::string& mime_type_lower_case) const;
121 131
122 // A map of mime_types and hash map of the supported codecs for the mime_type. 132 // A map of mime_types and hash map of the supported codecs for the mime_type.
123 MediaFormatMappings media_format_map_; 133 MediaFormatMappings media_format_map_;
124 134
125 // Keeps track of whether proprietary codec support should be 135 // Keeps track of whether proprietary codec support should be
126 // advertised to callers. 136 // advertised to callers.
127 bool allow_proprietary_codecs_; 137 bool allow_proprietary_codecs_;
128 138
129 // Lookup table for string compare based string -> Codec mappings. 139 // Lookup table for string compare based string -> Codec mappings.
130 StringToCodecMappings string_to_codec_map_; 140 StringToCodecMappings string_to_codec_map_;
131 141
132 DISALLOW_COPY_AND_ASSIGN(MimeUtil); 142 DISALLOW_COPY_AND_ASSIGN(MimeUtil);
133 }; // class MimeUtil 143 }; // class MimeUtil
134 144
135 // This variable is Leaky because it is accessed from WorkerPool threads. 145 // This variable is Leaky because it is accessed from WorkerPool threads.
136 static base::LazyInstance<MimeUtil>::Leaky g_media_mime_util = 146 static base::LazyInstance<MimeUtil>::Leaky g_media_mime_util =
137 LAZY_INSTANCE_INITIALIZER; 147 LAZY_INSTANCE_INITIALIZER;
138 148
139 #if defined(OS_ANDROID) 149 #if defined(OS_ANDROID)
140 static bool IsCodecSupportedOnAndroid(MimeUtil::Codec codec) { 150 static bool IsCodecSupportedOnAndroid(bool is_encrypted,
151 const std::string& mime_type_lower_case,
152 MimeUtil::Codec codec) {
141 switch (codec) { 153 switch (codec) {
142 case MimeUtil::INVALID_CODEC: 154 case MimeUtil::INVALID_CODEC:
143 return false; 155 return false;
144 156
145 case MimeUtil::PCM: 157 case MimeUtil::PCM:
146 case MimeUtil::MP3: 158 case MimeUtil::MP3:
147 case MimeUtil::MPEG4_AAC_LC: 159 case MimeUtil::MPEG4_AAC_LC:
148 case MimeUtil::MPEG4_AAC_SBR_v1: 160 case MimeUtil::MPEG4_AAC_SBR_v1:
149 case MimeUtil::MPEG4_AAC_SBR_PS_v2: 161 case MimeUtil::MPEG4_AAC_SBR_PS_v2:
150 case MimeUtil::VORBIS: 162 case MimeUtil::VORBIS:
163 return is_encrypted ? MediaCodecUtil::IsMediaCodecAvailable() : true;
ddorwin 2016/02/16 20:34:37 Note: The !is_encrypted path works for MSE because
DaleCurtis 2016/02/17 03:01:05 As discussed via chat, added a comment above the s
164
151 case MimeUtil::H264_BASELINE: 165 case MimeUtil::H264_BASELINE:
152 case MimeUtil::H264_MAIN: 166 case MimeUtil::H264_MAIN:
153 case MimeUtil::H264_HIGH: 167 case MimeUtil::H264_HIGH:
168 if (IsUnifiedMediaPipelineEnabled()) {
169 return HasPlatformDecoderSupport() &&
ddorwin 2016/02/16 20:34:37 All HasPlatformDecoderSupport() means is that the
DaleCurtis 2016/02/17 03:01:05 It can mean: no gpu process, vda is blacklisted, o
ddorwin 2016/02/17 21:18:38 The MediaCodec check was added in the next patch s
170 MediaCodecUtil::IsMediaCodecAvailable();
171 }
172 return is_encrypted ? MediaCodecUtil::IsMediaCodecAvailable() : true;
ddorwin 2016/02/16 20:34:37 Why are encrypted videos not also subject to HasPl
DaleCurtis 2016/02/17 03:01:05 Done.
173
154 case MimeUtil::VP8: 174 case MimeUtil::VP8:
155 return true; 175 if (!is_encrypted)
ddorwin 2016/02/16 20:34:37 Doesn't encrypted require IsMediaCodecAvailable()
DaleCurtis 2016/02/17 03:01:05 Done.
176 return true;
177
178 if (MediaCodecUtil::IsVp8Blacklisted())
ddorwin 2016/02/16 20:34:37 Is VP8 blacklisted for Android MediaPlayer too? I
DaleCurtis 2016/02/17 03:01:05 No it's only blacklisted for MediaCodec, I've clea
179 return false;
180
181 return IsUnifiedMediaPipelineEnabled() ? HasPlatformDecoderSupport()
ddorwin 2016/02/16 20:34:37 libvpx can't used for VP8?
DaleCurtis 2016/02/17 03:01:05 This was for encrypted cases, but is unclear, I've
182 : true;
156 183
157 case MimeUtil::AC3: 184 case MimeUtil::AC3:
158 case MimeUtil::EAC3: 185 case MimeUtil::EAC3:
159 // TODO(servolk): Revisit this for AC3/EAC3 support on AndroidTV 186 // TODO(servolk): Revisit this for AC3/EAC3 support on AndroidTV
160 return false; 187 return false;
161 188
162 case MimeUtil::MPEG2_AAC_LC: 189 case MimeUtil::MPEG2_AAC_LC:
163 case MimeUtil::MPEG2_AAC_MAIN: 190 case MimeUtil::MPEG2_AAC_MAIN:
164 case MimeUtil::MPEG2_AAC_SSR: 191 case MimeUtil::MPEG2_AAC_SSR:
165 // MPEG-2 variants of AAC are not supported on Android. 192 // MPEG-2 variants of AAC are not supported on Android unless the unified
166 return false; 193 // media pipeline can be used.
ddorwin 2016/02/16 20:34:37 ... and the software decoders...
DaleCurtis 2016/02/17 03:01:05 Done.
194 return !is_encrypted && IsUnifiedMediaPipelineEnabled();
167 195
168 case MimeUtil::OPUS: 196 case MimeUtil::OPUS:
169 // Opus is supported only in Lollipop+ (API Level 21). 197 if (!is_encrypted && IsUnifiedMediaPipelineEnabled())
170 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; 198 return true;
ddorwin 2016/02/16 20:34:37 Perhaps: // Software decoder.
DaleCurtis 2016/02/17 03:01:05 Done.
199
200 if (!MediaCodecUtil::PlatformHasOpusSupport())
201 return false;
202
203 // Android does not support opus in ogg containers.
204 if (base::EndsWith(mime_type_lower_case, "ogg",
205 base::CompareCase::SENSITIVE)) {
206 return false;
207 }
208
209 return is_encrypted ? MediaCodecUtil::IsMediaCodecAvailable() : true;
171 210
172 case MimeUtil::HEVC_MAIN: 211 case MimeUtil::HEVC_MAIN:
173 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) 212 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
174 // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to 213 // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to
175 // http://developer.android.com/reference/android/media/MediaFormat.html 214 // http://developer.android.com/reference/android/media/MediaFormat.html
176 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; 215 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21;
177 #else 216 #else
178 return false; 217 return false;
179 #endif 218 #endif
180 219
181 case MimeUtil::VP9: 220 case MimeUtil::VP9: {
182 // VP9 is supported only in KitKat+ (API Level 19). 221 const bool has_unified_media_pipeline = IsUnifiedMediaPipelineEnabled();
183 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; 222 if (!is_encrypted && has_unified_media_pipeline)
223 return true;
224
225 if (!MediaCodecUtil::PlatformHasVp9Support())
226 return false;
227
228 if (!is_encrypted)
229 return true;
230
231 if (!MediaCodecUtil::IsMediaCodecAvailable())
232 return false;
233
234 return has_unified_media_pipeline ? HasPlatformDecoderSupport() : true;
ddorwin 2016/02/16 20:34:37 Why is HasPlatformDecoderSupport() only required f
DaleCurtis 2016/02/17 03:01:05 Again this was confusing, though correct, simplifi
235 }
184 236
185 case MimeUtil::THEORA: 237 case MimeUtil::THEORA:
186 return false; 238 return false;
187 } 239 }
188 240
189 return false; 241 return false;
190 } 242 }
191 #endif 243 #endif
192 244
193 enum MediaFormatType { COMMON, PROPRIETARY }; 245 enum MediaFormatType { COMMON, PROPRIETARY };
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 299
248 // A list of media types (https://en.wikipedia.org/wiki/Media_type) and 300 // A list of media types (https://en.wikipedia.org/wiki/Media_type) and
249 // corresponding media codecs supported by these types/containers. 301 // corresponding media codecs supported by these types/containers.
250 // Media formats marked as PROPRIETARY are not supported by Chromium, only 302 // Media formats marked as PROPRIETARY are not supported by Chromium, only
251 // Google Chrome browser supports them. 303 // Google Chrome browser supports them.
252 static const MediaFormat kFormatCodecMappings[] = { 304 static const MediaFormat kFormatCodecMappings[] = {
253 {"video/webm", COMMON, "opus,vorbis,vp8,vp8.0,vp9,vp9.0"}, 305 {"video/webm", COMMON, "opus,vorbis,vp8,vp8.0,vp9,vp9.0"},
254 {"audio/webm", COMMON, "opus,vorbis"}, 306 {"audio/webm", COMMON, "opus,vorbis"},
255 {"audio/wav", COMMON, "1"}, 307 {"audio/wav", COMMON, "1"},
256 {"audio/x-wav", COMMON, "1"}, 308 {"audio/x-wav", COMMON, "1"},
257 #if defined(OS_ANDROID) 309 #if !defined(OS_ANDROID)
258 // Android does not support Opus in Ogg container. 310 // Note: Android does not support Theora and thus video/ogg.
259 // Android does not support Theora and thus video/ogg.
260 {"audio/ogg", COMMON, "vorbis"},
261 {"application/ogg", COMMON, "vorbis"},
262 #else
263 {"video/ogg", COMMON, "opus,theora,vorbis"}, 311 {"video/ogg", COMMON, "opus,theora,vorbis"},
312 #endif
264 {"audio/ogg", COMMON, "opus,vorbis"}, 313 {"audio/ogg", COMMON, "opus,vorbis"},
314 // Note: Theora is not supported on Android and will be rejected during the
315 // call to IsCodecSupportedOnAndroid().
265 {"application/ogg", COMMON, "opus,theora,vorbis"}, 316 {"application/ogg", COMMON, "opus,theora,vorbis"},
266 #endif
267 #if defined(USE_PROPRIETARY_CODECS) 317 #if defined(USE_PROPRIETARY_CODECS)
268 {"audio/mpeg", PROPRIETARY, "mp3"}, 318 {"audio/mpeg", PROPRIETARY, "mp3"},
269 {"audio/mp3", PROPRIETARY, ""}, 319 {"audio/mp3", PROPRIETARY, ""},
270 {"audio/x-mp3", PROPRIETARY, ""}, 320 {"audio/x-mp3", PROPRIETARY, ""},
271 {"audio/aac", PROPRIETARY, ""}, // AAC / ADTS 321 {"audio/aac", PROPRIETARY, ""}, // AAC / ADTS
272 {"audio/mp4", PROPRIETARY, kMP4AudioCodecsExpression}, 322 {"audio/mp4", PROPRIETARY, kMP4AudioCodecsExpression},
273 {"audio/x-m4a", PROPRIETARY, kMP4AudioCodecsExpression}, 323 {"audio/x-m4a", PROPRIETARY, kMP4AudioCodecsExpression},
274 {"video/mp4", PROPRIETARY, kMP4VideoCodecsExpression}, 324 {"video/mp4", PROPRIETARY, kMP4VideoCodecsExpression},
275 {"video/x-m4v", PROPRIETARY, kMP4VideoCodecsExpression}, 325 {"video/x-m4v", PROPRIETARY, kMP4VideoCodecsExpression},
276 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) 326 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 // This is not a valid legacy avc1 codec id - return the original codec id. 438 // This is not a valid legacy avc1 codec id - return the original codec id.
389 return codec_id; 439 return codec_id;
390 } 440 }
391 #endif 441 #endif
392 442
393 MimeUtil::MimeUtil() : allow_proprietary_codecs_(false) { 443 MimeUtil::MimeUtil() : allow_proprietary_codecs_(false) {
394 InitializeMimeTypeMaps(); 444 InitializeMimeTypeMaps();
395 } 445 }
396 446
397 SupportsType MimeUtil::AreSupportedCodecs( 447 SupportsType MimeUtil::AreSupportedCodecs(
448 bool is_encrypted,
449 const std::string& mime_type_lower_case,
398 const CodecSet& supported_codecs, 450 const CodecSet& supported_codecs,
399 const std::vector<std::string>& codecs) const { 451 const std::vector<std::string>& codecs) const {
400 DCHECK(!supported_codecs.empty()); 452 DCHECK(!supported_codecs.empty());
401 DCHECK(!codecs.empty()); 453 DCHECK(!codecs.empty());
402 454
403 SupportsType result = IsSupported; 455 SupportsType result = IsSupported;
404 for (size_t i = 0; i < codecs.size(); ++i) { 456 for (size_t i = 0; i < codecs.size(); ++i) {
405 bool is_ambiguous = true; 457 bool is_ambiguous = true;
406 Codec codec = INVALID_CODEC; 458 Codec codec = INVALID_CODEC;
407 if (!StringToCodec(codecs[i], &codec, &is_ambiguous)) 459 if (!StringToCodec(codecs[i], &codec, &is_ambiguous))
408 return IsNotSupported; 460 return IsNotSupported;
409 461
410 if (!IsCodecSupported(codec) || 462 if (!IsCodecSupported(is_encrypted, mime_type_lower_case, codec) ||
411 supported_codecs.find(codec) == supported_codecs.end()) { 463 supported_codecs.find(codec) == supported_codecs.end()) {
412 return IsNotSupported; 464 return IsNotSupported;
413 } 465 }
414 466
415 if (is_ambiguous) 467 if (is_ambiguous)
416 result = MayBeSupported; 468 result = MayBeSupported;
417 } 469 }
418 470
419 return result; 471 return result;
420 } 472 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 for (std::vector<std::string>::iterator it = codecs_out->begin(); 529 for (std::vector<std::string>::iterator it = codecs_out->begin();
478 it != codecs_out->end(); 530 it != codecs_out->end();
479 ++it) { 531 ++it) {
480 size_t found = it->find_first_of('.'); 532 size_t found = it->find_first_of('.');
481 if (found != std::string::npos) 533 if (found != std::string::npos)
482 it->resize(found); 534 it->resize(found);
483 } 535 }
484 } 536 }
485 537
486 SupportsType MimeUtil::IsSupportedMediaFormat( 538 SupportsType MimeUtil::IsSupportedMediaFormat(
539 bool is_encrypted,
487 const std::string& mime_type, 540 const std::string& mime_type,
488 const std::vector<std::string>& codecs) const { 541 const std::vector<std::string>& codecs) const {
489 const std::string mime_type_lower_case = base::ToLowerASCII(mime_type); 542 const std::string mime_type_lower_case = base::ToLowerASCII(mime_type);
490 MediaFormatMappings::const_iterator it_media_format_map = 543 MediaFormatMappings::const_iterator it_media_format_map =
491 media_format_map_.find(mime_type_lower_case); 544 media_format_map_.find(mime_type_lower_case);
492 if (it_media_format_map == media_format_map_.end()) 545 if (it_media_format_map == media_format_map_.end())
493 return IsNotSupported; 546 return IsNotSupported;
494 547
495 if (it_media_format_map->second.empty()) { 548 if (it_media_format_map->second.empty()) {
496 // We get here if the mimetype does not expect a codecs parameter. 549 // We get here if the mimetype does not expect a codecs parameter.
497 return (codecs.empty() && 550 return (codecs.empty() && IsDefaultCodecSupportedLowerCase(
498 IsDefaultCodecSupportedLowerCase(mime_type_lower_case)) 551 is_encrypted, mime_type_lower_case))
499 ? IsSupported 552 ? IsSupported
500 : IsNotSupported; 553 : IsNotSupported;
501 } 554 }
502 555
503 if (codecs.empty()) { 556 if (codecs.empty()) {
504 // We get here if the mimetype expects to get a codecs parameter, 557 // We get here if the mimetype expects to get a codecs parameter,
505 // but didn't get one. If |mime_type_lower_case| does not have a default 558 // but didn't get one. If |mime_type_lower_case| does not have a default
506 // codec the best we can do is say "maybe" because we don't have enough 559 // codec the best we can do is say "maybe" because we don't have enough
507 // information. 560 // information.
508 Codec default_codec = INVALID_CODEC; 561 Codec default_codec = INVALID_CODEC;
509 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) 562 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec))
510 return MayBeSupported; 563 return MayBeSupported;
511 564
512 return IsCodecSupported(default_codec) ? IsSupported : IsNotSupported; 565 return IsCodecSupported(is_encrypted, mime_type_lower_case, default_codec)
566 ? IsSupported
567 : IsNotSupported;
513 } 568 }
514 569
515 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) 570 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
516 if (mime_type_lower_case == "video/mp2t") { 571 if (mime_type_lower_case == "video/mp2t") {
517 std::vector<std::string> codecs_to_check; 572 std::vector<std::string> codecs_to_check;
518 for (const auto& codec_id : codecs) { 573 for (const auto& codec_id : codecs) {
519 codecs_to_check.push_back(TranslateLegacyAvc1CodecIds(codec_id)); 574 codecs_to_check.push_back(TranslateLegacyAvc1CodecIds(codec_id));
520 } 575 }
521 return AreSupportedCodecs(it_media_format_map->second, codecs_to_check); 576 return AreSupportedCodecs(is_encrypted, mime_type_lower_case,
577 it_media_format_map->second, codecs_to_check);
522 } 578 }
523 #endif 579 #endif
524 580
525 return AreSupportedCodecs(it_media_format_map->second, codecs); 581 return AreSupportedCodecs(is_encrypted, mime_type_lower_case,
582 it_media_format_map->second, codecs);
526 } 583 }
527 584
528 void MimeUtil::RemoveProprietaryMediaTypesAndCodecsForTests() { 585 void MimeUtil::RemoveProprietaryMediaTypesAndCodecsForTests() {
529 for (size_t i = 0; i < arraysize(kFormatCodecMappings); ++i) 586 for (size_t i = 0; i < arraysize(kFormatCodecMappings); ++i)
530 if (kFormatCodecMappings[i].format_type == PROPRIETARY) 587 if (kFormatCodecMappings[i].format_type == PROPRIETARY)
531 media_format_map_.erase(kFormatCodecMappings[i].mime_type); 588 media_format_map_.erase(kFormatCodecMappings[i].mime_type);
532 allow_proprietary_codecs_ = false; 589 allow_proprietary_codecs_ = false;
533 } 590 }
534 591
535 static bool IsValidH264Level(const std::string& level_str) { 592 static bool IsValidH264Level(const std::string& level_str) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 // either H.264 or HEVC/H.265 codec ID because currently those are the only 705 // either H.264 or HEVC/H.265 codec ID because currently those are the only
649 // ones that are not added to the |string_to_codec_map_| and require parsing. 706 // ones that are not added to the |string_to_codec_map_| and require parsing.
650 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) 707 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
651 if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) { 708 if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) {
652 return true; 709 return true;
653 } 710 }
654 #endif 711 #endif
655 return ParseH264CodecID(codec_id, codec, is_ambiguous); 712 return ParseH264CodecID(codec_id, codec, is_ambiguous);
656 } 713 }
657 714
658 bool MimeUtil::IsCodecSupported(Codec codec) const { 715 bool MimeUtil::IsCodecSupported(bool is_encrypted,
716 const std::string& mime_type_lower_case,
717 Codec codec) const {
659 DCHECK_NE(codec, INVALID_CODEC); 718 DCHECK_NE(codec, INVALID_CODEC);
660 719
661 #if defined(OS_ANDROID) 720 #if defined(OS_ANDROID)
662 if (!IsCodecSupportedOnAndroid(codec)) 721 if (!IsCodecSupportedOnAndroid(is_encrypted, mime_type_lower_case, codec))
663 return false; 722 return false;
664 #endif 723 #endif
665 724
666 return allow_proprietary_codecs_ || !IsCodecProprietary(codec); 725 return allow_proprietary_codecs_ || !IsCodecProprietary(codec);
667 } 726 }
668 727
669 bool MimeUtil::IsCodecProprietary(Codec codec) const { 728 bool MimeUtil::IsCodecProprietary(Codec codec) const {
670 switch (codec) { 729 switch (codec) {
671 case INVALID_CODEC: 730 case INVALID_CODEC:
672 case AC3: 731 case AC3:
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 766
708 if (mime_type_lower_case == "audio/aac") { 767 if (mime_type_lower_case == "audio/aac") {
709 *default_codec = MimeUtil::MPEG4_AAC_LC; 768 *default_codec = MimeUtil::MPEG4_AAC_LC;
710 return true; 769 return true;
711 } 770 }
712 771
713 return false; 772 return false;
714 } 773 }
715 774
716 bool MimeUtil::IsDefaultCodecSupportedLowerCase( 775 bool MimeUtil::IsDefaultCodecSupportedLowerCase(
776 bool is_encrypted,
717 const std::string& mime_type_lower_case) const { 777 const std::string& mime_type_lower_case) const {
718 Codec default_codec = Codec::INVALID_CODEC; 778 Codec default_codec = Codec::INVALID_CODEC;
719 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) 779 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec))
720 return false; 780 return false;
721 return IsCodecSupported(default_codec); 781 return IsCodecSupported(is_encrypted, mime_type_lower_case, default_codec);
722 } 782 }
723 783
724 bool IsSupportedMediaMimeType(const std::string& mime_type) { 784 bool IsSupportedMediaMimeType(const std::string& mime_type) {
725 return g_media_mime_util.Get().IsSupportedMediaMimeType(mime_type); 785 return g_media_mime_util.Get().IsSupportedMediaMimeType(mime_type);
726 } 786 }
727 787
728 SupportsType IsSupportedMediaFormat(const std::string& mime_type, 788 SupportsType IsSupportedMediaFormat(const std::string& mime_type,
ddorwin 2016/02/16 20:34:37 To avoid misuse in the future, should we rename th
DaleCurtis 2016/02/17 03:01:05 Acknowledged.
729 const std::vector<std::string>& codecs) { 789 const std::vector<std::string>& codecs) {
730 return g_media_mime_util.Get().IsSupportedMediaFormat(mime_type, codecs); 790 return g_media_mime_util.Get().IsSupportedMediaFormat(false, mime_type,
791 codecs);
792 }
793
794 SupportsType IsSupportedEncryptedMediaFormat(
795 const std::string& mime_type,
796 const std::vector<std::string>& codecs) {
797 return g_media_mime_util.Get().IsSupportedMediaFormat(true, mime_type,
798 codecs);
731 } 799 }
732 800
733 void ParseCodecString(const std::string& codecs, 801 void ParseCodecString(const std::string& codecs,
734 std::vector<std::string>* codecs_out, 802 std::vector<std::string>* codecs_out,
735 const bool strip) { 803 const bool strip) {
736 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); 804 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip);
737 } 805 }
738 806
739 void RemoveProprietaryMediaTypesAndCodecsForTests() { 807 void RemoveProprietaryMediaTypesAndCodecsForTests() {
740 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); 808 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests();
741 } 809 }
742 810
743 } // namespace media 811 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698