| 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 <map> |    5 #include <map> | 
|    6  |    6  | 
|    7 #include "base/containers/hash_tables.h" |    7 #include "base/containers/hash_tables.h" | 
|    8 #include "base/lazy_instance.h" |    8 #include "base/lazy_instance.h" | 
|    9 #include "base/strings/string_number_conversions.h" |    9 #include "base/strings/string_number_conversions.h" | 
|   10 #include "base/strings/string_split.h" |   10 #include "base/strings/string_split.h" | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|   29     MPEG2_AAC_MAIN, |   29     MPEG2_AAC_MAIN, | 
|   30     MPEG2_AAC_SSR, |   30     MPEG2_AAC_SSR, | 
|   31     MPEG4_AAC_LC, |   31     MPEG4_AAC_LC, | 
|   32     MPEG4_AAC_SBR_v1, |   32     MPEG4_AAC_SBR_v1, | 
|   33     MPEG4_AAC_SBR_PS_v2, |   33     MPEG4_AAC_SBR_PS_v2, | 
|   34     VORBIS, |   34     VORBIS, | 
|   35     OPUS, |   35     OPUS, | 
|   36     H264_BASELINE, |   36     H264_BASELINE, | 
|   37     H264_MAIN, |   37     H264_MAIN, | 
|   38     H264_HIGH, |   38     H264_HIGH, | 
 |   39     HEVC_MAIN, | 
|   39     VP8, |   40     VP8, | 
|   40     VP9, |   41     VP9, | 
|   41     THEORA |   42     THEORA | 
|   42   }; |   43   }; | 
|   43  |   44  | 
|   44   bool IsSupportedMediaMimeType(const std::string& mime_type) const; |   45   bool IsSupportedMediaMimeType(const std::string& mime_type) const; | 
|   45  |   46  | 
|   46   bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const; |   47   bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const; | 
|   47  |   48  | 
|   48   void ParseCodecString(const std::string& codecs, |   49   void ParseCodecString(const std::string& codecs, | 
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  192     case MimeUtil::MPEG4_AAC_LC: |  193     case MimeUtil::MPEG4_AAC_LC: | 
|  193     case MimeUtil::MPEG4_AAC_SBR_v1: |  194     case MimeUtil::MPEG4_AAC_SBR_v1: | 
|  194     case MimeUtil::MPEG4_AAC_SBR_PS_v2: |  195     case MimeUtil::MPEG4_AAC_SBR_PS_v2: | 
|  195     case MimeUtil::H264_BASELINE: |  196     case MimeUtil::H264_BASELINE: | 
|  196     case MimeUtil::H264_MAIN: |  197     case MimeUtil::H264_MAIN: | 
|  197     case MimeUtil::H264_HIGH: |  198     case MimeUtil::H264_HIGH: | 
|  198     case MimeUtil::VP8: |  199     case MimeUtil::VP8: | 
|  199     case MimeUtil::VORBIS: |  200     case MimeUtil::VORBIS: | 
|  200       return true; |  201       return true; | 
|  201  |  202  | 
 |  203     case MimeUtil::HEVC_MAIN: | 
 |  204 #if defined(ENABLE_HEVC_DEMUXING) | 
 |  205       // HEVC/H.265 is supported in Lollipop+ (API Level 21), according to | 
 |  206       // http://developer.android.com/reference/android/media/MediaFormat.html | 
 |  207       return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; | 
 |  208 #else | 
 |  209       return false; | 
 |  210 #endif | 
 |  211  | 
|  202     case MimeUtil::MPEG2_AAC_LC: |  212     case MimeUtil::MPEG2_AAC_LC: | 
|  203     case MimeUtil::MPEG2_AAC_MAIN: |  213     case MimeUtil::MPEG2_AAC_MAIN: | 
|  204     case MimeUtil::MPEG2_AAC_SSR: |  214     case MimeUtil::MPEG2_AAC_SSR: | 
|  205       // MPEG-2 variants of AAC are not supported on Android. |  215       // MPEG-2 variants of AAC are not supported on Android. | 
|  206       return false; |  216       return false; | 
|  207  |  217  | 
|  208     case MimeUtil::VP9: |  218     case MimeUtil::VP9: | 
|  209       // VP9 is supported only in KitKat+ (API Level 19). |  219       // VP9 is supported only in KitKat+ (API Level 19). | 
|  210       return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; |  220       return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; | 
|  211  |  221  | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  246     "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," |  256     "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," | 
|  247     "mp4a.40.05,mp4a.40.29"; |  257     "mp4a.40.05,mp4a.40.29"; | 
|  248 static const char kMP4VideoCodecsExpression[] = |  258 static const char kMP4VideoCodecsExpression[] = | 
|  249     // This is not a complete list of supported avc1 codecs. It is simply used |  259     // This is not a complete list of supported avc1 codecs. It is simply used | 
|  250     // to register support for the corresponding Codec enum. Instead of using |  260     // to register support for the corresponding Codec enum. Instead of using | 
|  251     // strings in these three arrays, we should use the Codec enum values. |  261     // strings in these three arrays, we should use the Codec enum values. | 
|  252     // This will avoid confusion and unnecessary parsing at runtime. |  262     // This will avoid confusion and unnecessary parsing at runtime. | 
|  253     // kUnambiguousCodecStringMap/kAmbiguousCodecStringMap should be the only |  263     // kUnambiguousCodecStringMap/kAmbiguousCodecStringMap should be the only | 
|  254     // mapping from strings to codecs. See crbug.com/461009. |  264     // mapping from strings to codecs. See crbug.com/461009. | 
|  255     "avc1.42E00A,avc1.4D400A,avc1.64000A," |  265     "avc1.42E00A,avc1.4D400A,avc1.64000A," | 
 |  266 #if defined(ENABLE_HEVC_DEMUXING) | 
 |  267     // Any valid unambiguous HEVC codec id will work here, since these strings | 
 |  268     // are parsed and mapped to MimeUtil::Codec enum values. | 
 |  269     "hev1.1.6.L93.B0," | 
 |  270 #endif | 
|  256     "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," |  271     "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," | 
|  257     "mp4a.40.05,mp4a.40.29"; |  272     "mp4a.40.05,mp4a.40.29"; | 
|  258  |  273  | 
|  259 // These containers are also included in |  274 // These containers are also included in | 
|  260 // common_media_types/proprietary_media_types. See crbug.com/461012. |  275 // common_media_types/proprietary_media_types. See crbug.com/461012. | 
|  261 static const MediaFormatStrict format_codec_mappings[] = { |  276 static const MediaFormatStrict format_codec_mappings[] = { | 
|  262     {"video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0"}, |  277     {"video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0"}, | 
|  263     {"audio/webm", "opus,vorbis"}, |  278     {"audio/webm", "opus,vorbis"}, | 
|  264     {"audio/wav", "1"}, |  279     {"audio/wav", "1"}, | 
|  265     {"audio/x-wav", "1"}, |  280     {"audio/x-wav", "1"}, | 
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  533     *codec = MimeUtil::H264_BASELINE; |  548     *codec = MimeUtil::H264_BASELINE; | 
|  534     *is_ambiguous = true; |  549     *is_ambiguous = true; | 
|  535     return true; |  550     return true; | 
|  536   } |  551   } | 
|  537  |  552  | 
|  538   // Validate level. |  553   // Validate level. | 
|  539   *is_ambiguous = !IsValidH264Level(base::ToUpperASCII(codec_id.substr(9))); |  554   *is_ambiguous = !IsValidH264Level(base::ToUpperASCII(codec_id.substr(9))); | 
|  540   return true; |  555   return true; | 
|  541 } |  556 } | 
|  542  |  557  | 
 |  558 #if defined(ENABLE_HEVC_DEMUXING) | 
 |  559 // ISO/IEC FDIS 14496-15 standard section E.3 describes the syntax of codec ids | 
 |  560 // reserved for HEVC. According to that spec HEVC codec id must start with | 
 |  561 // either "hev1." or "hvc1.". We don't yet support full parsing of HEVC codec | 
 |  562 // ids, but since no other codec id starts with those string we'll just treat | 
 |  563 // any string starting with "hev1." or "hvc1." as valid HEVC codec ids. | 
 |  564 // crbug.com/482761 | 
 |  565 static bool ParseHEVCCodecID(const std::string& codec_id, | 
 |  566                              MimeUtil::Codec* codec, | 
 |  567                              bool* is_ambiguous) { | 
 |  568   if (base::StartsWith(codec_id, "hev1.", base::CompareCase::SENSITIVE) || | 
 |  569       base::StartsWith(codec_id, "hvc1.", base::CompareCase::SENSITIVE)) { | 
 |  570     *codec = MimeUtil::HEVC_MAIN; | 
 |  571  | 
 |  572     // TODO(servolk): Full HEVC codec id parsing is not implemented yet (see | 
 |  573     // crbug.com/482761). So treat HEVC codec ids as ambiguous for now. | 
 |  574     *is_ambiguous = true; | 
 |  575  | 
 |  576     // TODO(servolk): Most HEVC codec ids are treated as ambiguous (see above), | 
 |  577     // but we need to recognize at least one valid unambiguous HEVC codec id, | 
 |  578     // which is added into kMP4VideoCodecsExpression. We need it to be | 
 |  579     // unambiguous to avoid DCHECK(!is_ambiguous) in InitializeMimeTypeMaps. We | 
 |  580     // also use these in unit tests (see | 
 |  581     // content/browser/media/media_canplaytype_browsertest.cc). | 
 |  582     // Remove this workaround after crbug.com/482761 is fixed. | 
 |  583     if (codec_id == "hev1.1.6.L93.B0" || codec_id == "hvc1.1.6.L93.B0") { | 
 |  584       *is_ambiguous = false; | 
 |  585     } | 
 |  586  | 
 |  587     return true; | 
 |  588   } | 
 |  589  | 
 |  590   return false; | 
 |  591 } | 
 |  592 #endif | 
 |  593  | 
|  543 bool MimeUtil::StringToCodec(const std::string& codec_id, |  594 bool MimeUtil::StringToCodec(const std::string& codec_id, | 
|  544                              Codec* codec, |  595                              Codec* codec, | 
|  545                              bool* is_ambiguous) const { |  596                              bool* is_ambiguous) const { | 
|  546   StringToCodecMappings::const_iterator itr = |  597   StringToCodecMappings::const_iterator itr = | 
|  547       string_to_codec_map_.find(codec_id); |  598       string_to_codec_map_.find(codec_id); | 
|  548   if (itr != string_to_codec_map_.end()) { |  599   if (itr != string_to_codec_map_.end()) { | 
|  549     *codec = itr->second.codec; |  600     *codec = itr->second.codec; | 
|  550     *is_ambiguous = itr->second.is_ambiguous; |  601     *is_ambiguous = itr->second.is_ambiguous; | 
|  551     return true; |  602     return true; | 
|  552   } |  603   } | 
|  553  |  604  | 
|  554   // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is |  605   // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is | 
|  555   // an H.264 codec ID because currently those are the only ones that can't be |  606   // either H.264 or HEVC/H.265 codec ID because currently those are the only | 
|  556   // stored in the |string_to_codec_map_| and require parsing. |  607   // ones that are not added to the |string_to_codec_map_| and require parsing. | 
 |  608 #if defined(ENABLE_HEVC_DEMUXING) | 
 |  609   if (ParseHEVCCodecID(codec_id, codec, is_ambiguous)) { | 
 |  610     return true; | 
 |  611   } | 
 |  612 #endif | 
|  557   return ParseH264CodecID(codec_id, codec, is_ambiguous); |  613   return ParseH264CodecID(codec_id, codec, is_ambiguous); | 
|  558 } |  614 } | 
|  559  |  615  | 
|  560 bool MimeUtil::IsCodecSupported(Codec codec) const { |  616 bool MimeUtil::IsCodecSupported(Codec codec) const { | 
|  561   DCHECK_NE(codec, INVALID_CODEC); |  617   DCHECK_NE(codec, INVALID_CODEC); | 
|  562  |  618  | 
|  563 #if defined(OS_ANDROID) |  619 #if defined(OS_ANDROID) | 
|  564   if (!IsCodecSupportedOnAndroid(codec)) |  620   if (!IsCodecSupportedOnAndroid(codec)) | 
|  565     return false; |  621     return false; | 
|  566 #endif |  622 #endif | 
|  567  |  623  | 
|  568   return allow_proprietary_codecs_ || !IsCodecProprietary(codec); |  624   return allow_proprietary_codecs_ || !IsCodecProprietary(codec); | 
|  569 } |  625 } | 
|  570  |  626  | 
|  571 bool MimeUtil::IsCodecProprietary(Codec codec) const { |  627 bool MimeUtil::IsCodecProprietary(Codec codec) const { | 
|  572   switch (codec) { |  628   switch (codec) { | 
|  573     case INVALID_CODEC: |  629     case INVALID_CODEC: | 
|  574     case MP3: |  630     case MP3: | 
|  575     case MPEG2_AAC_LC: |  631     case MPEG2_AAC_LC: | 
|  576     case MPEG2_AAC_MAIN: |  632     case MPEG2_AAC_MAIN: | 
|  577     case MPEG2_AAC_SSR: |  633     case MPEG2_AAC_SSR: | 
|  578     case MPEG4_AAC_LC: |  634     case MPEG4_AAC_LC: | 
|  579     case MPEG4_AAC_SBR_v1: |  635     case MPEG4_AAC_SBR_v1: | 
|  580     case MPEG4_AAC_SBR_PS_v2: |  636     case MPEG4_AAC_SBR_PS_v2: | 
|  581     case H264_BASELINE: |  637     case H264_BASELINE: | 
|  582     case H264_MAIN: |  638     case H264_MAIN: | 
|  583     case H264_HIGH: |  639     case H264_HIGH: | 
 |  640     case HEVC_MAIN: | 
|  584       return true; |  641       return true; | 
|  585  |  642  | 
|  586     case PCM: |  643     case PCM: | 
|  587     case VORBIS: |  644     case VORBIS: | 
|  588     case OPUS: |  645     case OPUS: | 
|  589     case VP8: |  646     case VP8: | 
|  590     case VP9: |  647     case VP9: | 
|  591     case THEORA: |  648     case THEORA: | 
|  592       return false; |  649       return false; | 
|  593   } |  650   } | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  638                       std::vector<std::string>* codecs_out, |  695                       std::vector<std::string>* codecs_out, | 
|  639                       const bool strip) { |  696                       const bool strip) { | 
|  640   g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); |  697   g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); | 
|  641 } |  698 } | 
|  642  |  699  | 
|  643 void RemoveProprietaryMediaTypesAndCodecsForTests() { |  700 void RemoveProprietaryMediaTypesAndCodecsForTests() { | 
|  644   g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); |  701   g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); | 
|  645 } |  702 } | 
|  646  |  703  | 
|  647 }  // namespace media |  704 }  // namespace media | 
| OLD | NEW |