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

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

Issue 1864743002: Use codec enum values instead of strings to initialize |media_format_map_|. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@enums
Patch Set: rebase Created 4 years, 8 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
« no previous file with comments | « media/base/mime_util_internal.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "media/base/mime_util_internal.h" 5 #include "media/base/mime_util_internal.h"
6 6
7 #include "base/strings/string_number_conversions.h" 7 #include "base/strings/string_number_conversions.h"
8 #include "base/strings/string_split.h" 8 #include "base/strings/string_split.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 string_to_codec_map_[kAmbiguousCodecStringMap[i].codec_id] = 245 string_to_codec_map_[kAmbiguousCodecStringMap[i].codec_id] =
246 CodecEntry(kAmbiguousCodecStringMap[i].codec, true); 246 CodecEntry(kAmbiguousCodecStringMap[i].codec, true);
247 } 247 }
248 248
249 AddSupportedMediaFormats(); 249 AddSupportedMediaFormats();
250 } 250 }
251 251
252 // Each call to AddContainerWithCodecs() contains a media type 252 // Each call to AddContainerWithCodecs() contains a media type
253 // (https://en.wikipedia.org/wiki/Media_type) and corresponding media codec(s) 253 // (https://en.wikipedia.org/wiki/Media_type) and corresponding media codec(s)
254 // supported by these types/containers. 254 // supported by these types/containers.
255 // 255 // TODO(ddorwin): Replace insert() calls with initializer_list when allowed.
256 // Strings used as the |codecs_list| only need one valid unambiguous variant for
257 // each supported MimeUtil::Codec enum value. Each codec string is parsed and
258 // mapped to corresponding MimeUtil::Codec value. See https://crbug.com/461009.
259 void MimeUtil::AddSupportedMediaFormats() { 256 void MimeUtil::AddSupportedMediaFormats() {
260 const std::string ogg_audio_codecs = "opus,vorbis"; 257 CodecSet implicit_codec;
261 std::string ogg_video_codecs; 258 CodecSet wav_codecs;
259 wav_codecs.insert(PCM);
260
261 CodecSet ogg_audio_codecs;
262 ogg_audio_codecs.insert(OPUS);
263 ogg_audio_codecs.insert(VORBIS);
264 CodecSet ogg_video_codecs;
262 #if !defined(OS_ANDROID) 265 #if !defined(OS_ANDROID)
263 ogg_video_codecs = "theora"; 266 ogg_video_codecs.insert(THEORA);
264 #endif // !defined(OS_ANDROID) 267 #endif // !defined(OS_ANDROID)
265 std::string ogg_codecs = ogg_audio_codecs; 268 CodecSet ogg_codecs(ogg_audio_codecs);
266 if (!ogg_video_codecs.empty()) 269 ogg_codecs.insert(ogg_video_codecs.begin(), ogg_video_codecs.end());
267 ogg_codecs += "," + ogg_video_codecs; 270
271 CodecSet webm_audio_codecs;
272 webm_audio_codecs.insert(OPUS);
273 webm_audio_codecs.insert(VORBIS);
274 CodecSet webm_video_codecs;
275 webm_video_codecs.insert(VP8);
276 webm_video_codecs.insert(VP9);
277 CodecSet webm_codecs(webm_audio_codecs);
278 webm_codecs.insert(webm_video_codecs.begin(), webm_video_codecs.end());
268 279
269 #if defined(USE_PROPRIETARY_CODECS) 280 #if defined(USE_PROPRIETARY_CODECS)
270 const std::string aac = "mp4a.66,mp4a.40.2"; // MPEG-2 and MPEG-4 AAC. 281 CodecSet mp3_codecs;
271 const std::string mp3 = "mp4a.69"; 282 mp3_codecs.insert(MP3);
272 const std::string avc = "avc1.42E00A";
273 283
274 const std::string avc_and_aac = avc + "," + aac; 284 CodecSet aac;
275 std::string mp4_audio_codecs = aac + "," + mp3; 285 aac.insert(MPEG2_AAC);
286 aac.insert(MPEG4_AAC);
287
288 CodecSet avc_and_aac(aac);
289 avc_and_aac.insert(H264);
290
291 CodecSet mp4_audio_codecs(aac);
292 mp4_audio_codecs.insert(MP3);
276 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) 293 #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
277 mp4_audio_codecs += ",ac-3,ec-3"; // AC-3 and E-AC-3. 294 mp4_audio_codecs.insert(AC3);
295 mp4_audio_codecs.insert(EAC3);
278 #endif // BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) 296 #endif // BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
279 297
280 std::string mp4_video_codecs = avc; 298 CodecSet mp4_video_codecs;
299 mp4_video_codecs.insert(H264);
281 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) 300 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
282 mp4_video_codecs += ",hev1.1.6.L93.B0"; 301 mp4_video_codecs.insert(HEVC_MAIN);
283 #endif // BUILDFLAG(ENABLE_HEVC_DEMUXING) 302 #endif // BUILDFLAG(ENABLE_HEVC_DEMUXING)
284 const std::string mp4_codecs = mp4_video_codecs + "," + mp4_audio_codecs; 303 CodecSet mp4_codecs(mp4_audio_codecs);
304 mp4_codecs.insert(mp4_video_codecs.begin(), mp4_video_codecs.end());
285 #endif // defined(USE_PROPRIETARY_CODECS) 305 #endif // defined(USE_PROPRIETARY_CODECS)
286 306
287 AddContainerWithCodecs("audio/wav", "1", false); 307 AddContainerWithCodecs("audio/wav", wav_codecs, false);
288 AddContainerWithCodecs("audio/x-wav", "1", false); 308 AddContainerWithCodecs("audio/x-wav", wav_codecs, false);
289 AddContainerWithCodecs("audio/webm", "opus,vorbis", false); 309 AddContainerWithCodecs("audio/webm", webm_audio_codecs, false);
290 AddContainerWithCodecs("video/webm", "opus,vorbis,vp8,vp9", false); 310 DCHECK(!webm_video_codecs.empty());
311 AddContainerWithCodecs("video/webm", webm_codecs, false);
291 AddContainerWithCodecs("audio/ogg", ogg_audio_codecs, false); 312 AddContainerWithCodecs("audio/ogg", ogg_audio_codecs, false);
292 // video/ogg is only supported if an appropriate video codec is supported. 313 // video/ogg is only supported if an appropriate video codec is supported.
293 // Note: This assumes such codecs cannot be later excluded. 314 // Note: This assumes such codecs cannot be later excluded.
294 if (!ogg_video_codecs.empty()) 315 if (!ogg_video_codecs.empty())
295 AddContainerWithCodecs("video/ogg", ogg_codecs, false); 316 AddContainerWithCodecs("video/ogg", ogg_codecs, false);
296 // TODO(ddorwin): Should the application type support Opus? 317 // TODO(ddorwin): Should the application type support Opus?
297 AddContainerWithCodecs("application/ogg", ogg_codecs, false); 318 AddContainerWithCodecs("application/ogg", ogg_codecs, false);
298 319
299 #if defined(USE_PROPRIETARY_CODECS) 320 #if defined(USE_PROPRIETARY_CODECS)
300 AddContainerWithCodecs("audio/mpeg", "mp3", true); 321 AddContainerWithCodecs("audio/mpeg", mp3_codecs, true); // Allow "mp3".
301 AddContainerWithCodecs("audio/mp3", "", true); 322 AddContainerWithCodecs("audio/mp3", implicit_codec, true);
302 AddContainerWithCodecs("audio/x-mp3", "", true); 323 AddContainerWithCodecs("audio/x-mp3", implicit_codec, true);
303 AddContainerWithCodecs("audio/aac", "", true); // AAC / ADTS 324 AddContainerWithCodecs("audio/aac", implicit_codec, true); // AAC / ADTS.
304 AddContainerWithCodecs("audio/mp4", mp4_audio_codecs, true); 325 AddContainerWithCodecs("audio/mp4", mp4_audio_codecs, true);
305 DCHECK(!mp4_video_codecs.empty()); 326 DCHECK(!mp4_video_codecs.empty());
306 AddContainerWithCodecs("video/mp4", mp4_codecs, true); 327 AddContainerWithCodecs("video/mp4", mp4_codecs, true);
307 // These strings are supported for backwards compatibility only and thus only 328 // These strings are supported for backwards compatibility only and thus only
308 // support the codecs needed for compatibility. 329 // support the codecs needed for compatibility.
309 AddContainerWithCodecs("audio/x-m4a", aac, true); 330 AddContainerWithCodecs("audio/x-m4a", aac, true);
310 AddContainerWithCodecs("video/x-m4v", avc_and_aac, true); 331 AddContainerWithCodecs("video/x-m4v", avc_and_aac, true);
311 332
312 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) 333 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
313 // TODO(ddorwin): Exactly which codecs should be supported? 334 // TODO(ddorwin): Exactly which codecs should be supported?
314 DCHECK(!mp4_video_codecs.empty()); 335 DCHECK(!mp4_video_codecs.empty());
315 AddContainerWithCodecs("video/mp2t", mp4_codecs, true); 336 AddContainerWithCodecs("video/mp2t", mp4_codecs, true);
316 #endif // BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) 337 #endif // BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
317 #if defined(OS_ANDROID) 338 #if defined(OS_ANDROID)
318 // HTTP Live Streaming (HLS). 339 // HTTP Live Streaming (HLS).
319 // TODO(ddorwin): Is any MP3 codec string variant included in real queries? 340 // TODO(ddorwin): Is any MP3 codec string variant included in real queries?
320 const std::string hls_codecs = avc_and_aac + "," + mp3; 341 CodecSet hls_codecs(avc_and_aac);
342 hls_codecs.insert(MP3);
321 AddContainerWithCodecs("application/x-mpegurl", hls_codecs, true); 343 AddContainerWithCodecs("application/x-mpegurl", hls_codecs, true);
322 AddContainerWithCodecs("application/vnd.apple.mpegurl", hls_codecs, true); 344 AddContainerWithCodecs("application/vnd.apple.mpegurl", hls_codecs, true);
323 #endif // defined(OS_ANDROID) 345 #endif // defined(OS_ANDROID)
324 #endif // defined(USE_PROPRIETARY_CODECS) 346 #endif // defined(USE_PROPRIETARY_CODECS)
325 } 347 }
326 348
327 // TODO(ddorwin): Replace |codecs_list| with a vector of MimeUtil::Codec values.
328 // See https://crbug.com/461009.
329 void MimeUtil::AddContainerWithCodecs(const std::string& mime_type, 349 void MimeUtil::AddContainerWithCodecs(const std::string& mime_type,
330 const std::string& codecs_list, 350 const CodecSet& codecs,
331 bool is_proprietary_mime_type) { 351 bool is_proprietary_mime_type) {
332 #if !defined(USE_PROPRIETARY_CODECS) 352 #if !defined(USE_PROPRIETARY_CODECS)
333 DCHECK(!is_proprietary_mime_type); 353 DCHECK(!is_proprietary_mime_type);
334 #endif 354 #endif
335 355
336 std::vector<std::string> codec_strings;
337 ParseCodecString(codecs_list, &codec_strings, false);
338
339 CodecSet codecs;
340 for (const auto& codec_string : codec_strings) {
341 DCHECK(!codec_string.empty()) << codecs_list;
342 Codec codec = INVALID_CODEC;
343 bool is_ambiguous = true;
344 CHECK(StringToCodec(codec_string, &codec, &is_ambiguous, false));
345 DCHECK(!is_ambiguous) << codec_string;
346 codecs.insert(codec);
347 }
348
349 media_format_map_[mime_type] = codecs; 356 media_format_map_[mime_type] = codecs;
350 357
351 if (is_proprietary_mime_type) 358 if (is_proprietary_mime_type)
352 proprietary_media_containers_.push_back(mime_type); 359 proprietary_media_containers_.push_back(mime_type);
353 } 360 }
354 361
355 bool MimeUtil::IsSupportedMediaMimeType(const std::string& mime_type) const { 362 bool MimeUtil::IsSupportedMediaMimeType(const std::string& mime_type) const {
356 return media_format_map_.find(base::ToLowerASCII(mime_type)) != 363 return media_format_map_.find(base::ToLowerASCII(mime_type)) !=
357 media_format_map_.end(); 364 media_format_map_.end();
358 } 365 }
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 const std::string& mime_type_lower_case, 675 const std::string& mime_type_lower_case,
669 bool is_encrypted) const { 676 bool is_encrypted) const {
670 Codec default_codec = Codec::INVALID_CODEC; 677 Codec default_codec = Codec::INVALID_CODEC;
671 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) 678 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec))
672 return false; 679 return false;
673 return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted); 680 return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted);
674 } 681 }
675 682
676 } // namespace internal 683 } // namespace internal
677 } // namespace media 684 } // namespace media
OLDNEW
« no previous file with comments | « media/base/mime_util_internal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698