Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 // Valid levels taken from Table A-1 in ISO/IEC 14496-10. | 207 // Valid levels taken from Table A-1 in ISO/IEC 14496-10. |
| 208 // Level_idc represents the standard level represented as decimal number | 208 // Level_idc represents the standard level represented as decimal number |
| 209 // multiplied by ten, e.g. level_idc==32 corresponds to level==3.2 | 209 // multiplied by ten, e.g. level_idc==32 corresponds to level==3.2 |
| 210 return ((level_idc >= 10 && level_idc <= 13) || | 210 return ((level_idc >= 10 && level_idc <= 13) || |
| 211 (level_idc >= 20 && level_idc <= 22) || | 211 (level_idc >= 20 && level_idc <= 22) || |
| 212 (level_idc >= 30 && level_idc <= 32) || | 212 (level_idc >= 30 && level_idc <= 32) || |
| 213 (level_idc >= 40 && level_idc <= 42) || | 213 (level_idc >= 40 && level_idc <= 42) || |
| 214 (level_idc >= 50 && level_idc <= 51)); | 214 (level_idc >= 50 && level_idc <= 51)); |
| 215 } | 215 } |
| 216 | 216 |
| 217 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | |
| 218 // ISO/IEC FDIS 14496-15 standard section E.3 describes the syntax of codec ids | |
| 219 // reserved for HEVC. According to that spec HEVC codec id must start with | |
| 220 // either "hev1." or "hvc1.". We don't yet support full parsing of HEVC codec | |
| 221 // ids, but since no other codec id starts with those string we'll just treat | |
| 222 // any string starting with "hev1." or "hvc1." as valid HEVC codec ids. | |
| 223 // crbug.com/482761 | |
| 224 static bool ParseHEVCCodecID(const std::string& codec_id, | |
| 225 MimeUtil::Codec* codec, | |
| 226 bool* is_ambiguous) { | |
| 227 if (base::StartsWith(codec_id, "hev1.", base::CompareCase::SENSITIVE) || | |
| 228 base::StartsWith(codec_id, "hvc1.", base::CompareCase::SENSITIVE)) { | |
| 229 *codec = MimeUtil::HEVC_MAIN; | |
| 230 | |
| 231 // TODO(servolk): Full HEVC codec id parsing is not implemented yet (see | |
| 232 // crbug.com/482761). So treat HEVC codec ids as ambiguous for now. | |
| 233 *is_ambiguous = true; | |
| 234 | |
| 235 // TODO(servolk): Most HEVC codec ids are treated as ambiguous (see above), | |
| 236 // but we need to recognize at least one valid unambiguous HEVC codec id, | |
| 237 // which is added into kMP4VideoCodecsExpression. We need it to be | |
| 238 // unambiguous to avoid DCHECK(!is_ambiguous) in InitializeMimeTypeMaps. We | |
| 239 // also use these in unit tests (see | |
| 240 // content/browser/media/media_canplaytype_browsertest.cc). | |
| 241 // Remove this workaround after crbug.com/482761 is fixed. | |
| 242 if (codec_id == "hev1.1.6.L93.B0" || codec_id == "hvc1.1.6.L93.B0") { | |
| 243 *is_ambiguous = false; | |
| 244 } | |
| 245 | |
| 246 return true; | |
| 247 } | |
| 248 | |
| 249 return false; | |
| 250 } | |
| 251 #endif | |
| 252 | |
| 253 MimeUtil::MimeUtil() : allow_proprietary_codecs_(false) { | 217 MimeUtil::MimeUtil() : allow_proprietary_codecs_(false) { |
| 254 #if defined(OS_ANDROID) | 218 #if defined(OS_ANDROID) |
| 255 platform_info_.is_unified_media_pipeline_enabled = | 219 platform_info_.is_unified_media_pipeline_enabled = |
| 256 IsUnifiedMediaPipelineEnabled(); | 220 IsUnifiedMediaPipelineEnabled(); |
| 257 // When the unified media pipeline is enabled, we need support for both GPU | 221 // When the unified media pipeline is enabled, we need support for both GPU |
| 258 // video decoders and MediaCodec; indicated by HasPlatformDecoderSupport(). | 222 // video decoders and MediaCodec; indicated by HasPlatformDecoderSupport(). |
| 259 // When the Android pipeline is used, we only need access to MediaCodec. | 223 // When the Android pipeline is used, we only need access to MediaCodec. |
| 260 platform_info_.has_platform_decoders = ArePlatformDecodersAvailable(); | 224 platform_info_.has_platform_decoders = ArePlatformDecodersAvailable(); |
| 261 platform_info_.has_platform_vp8_decoder = | 225 platform_info_.has_platform_vp8_decoder = |
| 262 MediaCodecUtil::IsVp8DecoderAvailable(); | 226 MediaCodecUtil::IsVp8DecoderAvailable(); |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 | 447 |
| 484 case H264: | 448 case H264: |
| 485 // The unified pipeline requires platform support for h264. | 449 // The unified pipeline requires platform support for h264. |
| 486 if (platform_info.is_unified_media_pipeline_enabled) | 450 if (platform_info.is_unified_media_pipeline_enabled) |
| 487 return platform_info.has_platform_decoders; | 451 return platform_info.has_platform_decoders; |
| 488 | 452 |
| 489 // When MediaPlayer or MediaCodec is used, h264 is always supported. | 453 // When MediaPlayer or MediaCodec is used, h264 is always supported. |
| 490 DCHECK(!is_encrypted || platform_info.has_platform_decoders); | 454 DCHECK(!is_encrypted || platform_info.has_platform_decoders); |
| 491 return true; | 455 return true; |
| 492 | 456 |
| 493 case HEVC_MAIN: | 457 case HEVC: |
| 494 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 458 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
| 495 if (platform_info.is_unified_media_pipeline_enabled && | 459 if (platform_info.is_unified_media_pipeline_enabled && |
| 496 !platform_info.has_platform_decoders) { | 460 !platform_info.has_platform_decoders) { |
| 497 return false; | 461 return false; |
| 498 } | 462 } |
| 499 | 463 |
| 500 #if defined(OS_ANDROID) | 464 #if defined(OS_ANDROID) |
| 501 // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to | 465 // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to |
| 502 // http://developer.android.com/reference/android/media/MediaFormat.html | 466 // http://developer.android.com/reference/android/media/MediaFormat.html |
| 503 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; | 467 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 528 // Otherwise, platform support is required. | 492 // Otherwise, platform support is required. |
| 529 return platform_info.supports_vp9; | 493 return platform_info.supports_vp9; |
| 530 } | 494 } |
| 531 } | 495 } |
| 532 | 496 |
| 533 return false; | 497 return false; |
| 534 } | 498 } |
| 535 | 499 |
| 536 bool MimeUtil::StringToCodec(const std::string& codec_id, | 500 bool MimeUtil::StringToCodec(const std::string& codec_id, |
| 537 Codec* codec, | 501 Codec* codec, |
| 538 bool* is_ambiguous) const { | 502 bool* is_ambiguous) const { |
|
ddorwin
2016/04/02 00:56:09
As you mentioned below, this is confusing. Perhaps
servolk
2016/04/07 00:59:40
Acknowledged.
| |
| 539 StringToCodecMappings::const_iterator itr = | 503 StringToCodecMappings::const_iterator itr = |
| 540 string_to_codec_map_.find(codec_id); | 504 string_to_codec_map_.find(codec_id); |
| 541 if (itr != string_to_codec_map_.end()) { | 505 if (itr != string_to_codec_map_.end()) { |
| 542 *codec = itr->second.codec; | 506 *codec = itr->second.codec; |
| 543 *is_ambiguous = itr->second.is_ambiguous; | 507 *is_ambiguous = itr->second.is_ambiguous; |
| 544 return true; | 508 return true; |
| 545 } | 509 } |
| 546 | 510 |
| 547 // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is | 511 // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is |
| 548 // either H.264 or HEVC/H.265 codec ID because currently those are the only | 512 // either H.264 or HEVC/H.265 codec ID because currently those are the only |
| 549 // ones that are not added to the |string_to_codec_map_| and require parsing. | 513 // ones that are not added to the |string_to_codec_map_| and require parsing. |
| 514 VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; | |
| 515 uint8_t level_idc = 0; | |
| 550 | 516 |
| 551 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) | 517 #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
|
ddorwin
2016/04/02 00:09:06
I believe there was a reason this was originally a
servolk
2016/04/02 00:35:04
Yes, we used to have 'return ParseH264CodecId' at
| |
| 552 if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) { | 518 if (ParseHEVCCodecId(codec_id, &profile, &level_idc)) { |
| 519 *is_ambiguous = false; | |
|
ddorwin
2016/04/02 00:09:06
This assumes that only supported profiles are retu
servolk
2016/04/02 00:35:04
Well, HEVC codec ids contain enough information to
ddorwin
2016/04/02 00:56:09
See above. Ambiguous no longer makes sense, BUT we
ddorwin
2016/04/06 01:43:56
That bug is now fixed, so you don't need to worry
servolk
2016/04/07 00:59:40
Done.
| |
| 520 *codec = MimeUtil::HEVC; | |
| 553 return true; | 521 return true; |
| 554 } | 522 } |
| 555 #endif | 523 #endif |
| 556 | 524 |
| 557 VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; | |
| 558 uint8_t level_idc = 0; | |
| 559 if (ParseAVCCodecId(codec_id, &profile, &level_idc)) { | 525 if (ParseAVCCodecId(codec_id, &profile, &level_idc)) { |
| 560 *codec = MimeUtil::H264; | 526 *codec = MimeUtil::H264; |
| 561 *is_ambiguous = | 527 *is_ambiguous = |
| 562 (profile != H264PROFILE_BASELINE && profile != H264PROFILE_MAIN && | 528 (profile != H264PROFILE_BASELINE && profile != H264PROFILE_MAIN && |
| 563 profile != H264PROFILE_HIGH) || | 529 profile != H264PROFILE_HIGH) || |
| 564 !IsValidH264Level(level_idc); | 530 !IsValidH264Level(level_idc); |
| 565 return true; | 531 return true; |
| 566 } | 532 } |
| 567 | 533 |
| 568 DVLOG(4) << __FUNCTION__ << ": Unrecognized codec id " << codec_id; | 534 DVLOG(4) << __FUNCTION__ << ": Unrecognized codec id " << codec_id; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 586 | 552 |
| 587 bool MimeUtil::IsCodecProprietary(Codec codec) const { | 553 bool MimeUtil::IsCodecProprietary(Codec codec) const { |
| 588 switch (codec) { | 554 switch (codec) { |
| 589 case INVALID_CODEC: | 555 case INVALID_CODEC: |
| 590 case AC3: | 556 case AC3: |
| 591 case EAC3: | 557 case EAC3: |
| 592 case MP3: | 558 case MP3: |
| 593 case MPEG2_AAC: | 559 case MPEG2_AAC: |
| 594 case MPEG4_AAC: | 560 case MPEG4_AAC: |
| 595 case H264: | 561 case H264: |
| 596 case HEVC_MAIN: | 562 case HEVC: |
| 597 return true; | 563 return true; |
| 598 | 564 |
| 599 case PCM: | 565 case PCM: |
| 600 case VORBIS: | 566 case VORBIS: |
| 601 case OPUS: | 567 case OPUS: |
| 602 case VP8: | 568 case VP8: |
| 603 case VP9: | 569 case VP9: |
| 604 case THEORA: | 570 case THEORA: |
| 605 return false; | 571 return false; |
| 606 } | 572 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 629 const std::string& mime_type_lower_case, | 595 const std::string& mime_type_lower_case, |
| 630 bool is_encrypted) const { | 596 bool is_encrypted) const { |
| 631 Codec default_codec = Codec::INVALID_CODEC; | 597 Codec default_codec = Codec::INVALID_CODEC; |
| 632 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) | 598 if (!GetDefaultCodecLowerCase(mime_type_lower_case, &default_codec)) |
| 633 return false; | 599 return false; |
| 634 return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted); | 600 return IsCodecSupported(default_codec, mime_type_lower_case, is_encrypted); |
| 635 } | 601 } |
| 636 | 602 |
| 637 } // namespace internal | 603 } // namespace internal |
| 638 } // namespace media | 604 } // namespace media |
| OLD | NEW |