| Index: net/base/mime_util.cc
|
| diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
|
| index fdb16fd8f7ef0b0f22b2d2e232198587ce19344d..60224fa1782cdbb8d2c9a5aa8b67da399157e9e1 100644
|
| --- a/net/base/mime_util.cc
|
| +++ b/net/base/mime_util.cc
|
| @@ -81,6 +81,9 @@ class MimeUtil : public PlatformMimeUtil {
|
| bool IsSupportedStrictMediaMimeType(
|
| const std::string& mime_type,
|
| const std::vector<std::string>& codecs) const;
|
| + bool IsSupportedStrictMP4MediaMimeType(
|
| + const std::string& mime_type,
|
| + const std::vector<std::string>& codecs) const;
|
|
|
| void RemoveProprietaryMediaTypesAndCodecsForTests();
|
|
|
| @@ -90,12 +93,19 @@ class MimeUtil : public PlatformMimeUtil {
|
| typedef base::hash_set<std::string> MimeMappings;
|
| typedef std::map<std::string, MimeMappings> StrictMappings;
|
|
|
| + typedef std::vector<std::string> MimeExpressionMappings;
|
| + typedef std::map<std::string, MimeExpressionMappings>
|
| + StrictExpressionMappings;
|
| +
|
| MimeUtil();
|
|
|
| // Returns true if |codecs| is nonempty and all the items in it are present in
|
| // |supported_codecs|.
|
| static bool AreSupportedCodecs(const MimeMappings& supported_codecs,
|
| const std::vector<std::string>& codecs);
|
| + static bool AreSupportedCodecsWithProfile(
|
| + const MimeExpressionMappings& supported_codecs,
|
| + const std::vector<std::string>& codecs);
|
|
|
| // For faster lookup, keep hash sets.
|
| void InitializeMimeTypeMaps();
|
| @@ -112,6 +122,7 @@ class MimeUtil : public PlatformMimeUtil {
|
| MimeMappings codecs_map_;
|
|
|
| StrictMappings strict_format_map_;
|
| + StrictExpressionMappings strict_mp4_format_map_;
|
| }; // class MimeUtil
|
|
|
| // This variable is Leaky because we need to access it from WorkerPool threads.
|
| @@ -444,6 +455,16 @@ static const MediaFormatStrict format_codec_mappings[] = {
|
| { "audio/x-mp3", "" }
|
| };
|
|
|
| +static const MediaFormatStrict format_mp4_codec_mappings[] = {
|
| + {"audio/mp4", "mp4a,mp4a.40,mp4a.40.?"},
|
| + {"audio/x-m4a", "mp4a,mp4a.40,mp4a.40.?"},
|
| + {"video/mp4", "avc1,avc3,avc1.??????,avc3.??????,mp4a,mp4a.40,mp4a.40.?"},
|
| + {"video/x-m4v", "avc1,avc3,avc1.??????,avc3.??????,mp4a,mp4a.40,mp4a.40.?"},
|
| + {"application/x-mpegurl",
|
| + "avc1,avc3,avc1.??????,avc3.??????,mp4a,mp4a.40,mp4a.40.?"},
|
| + {"application/vnd.apple.mpegurl",
|
| + "avc1,avc3,avc1.??????,avc3.??????,mp4a,mp4a.40,mp4a.40.?"}};
|
| +
|
| MimeUtil::MimeUtil() {
|
| InitializeMimeTypeMaps();
|
| }
|
| @@ -461,6 +482,31 @@ bool MimeUtil::AreSupportedCodecs(const MimeMappings& supported_codecs,
|
| return !codecs.empty();
|
| }
|
|
|
| +bool MimeUtil::AreSupportedCodecsWithProfile(
|
| + const MimeExpressionMappings& supported_codecs,
|
| + const std::vector<std::string>& codecs) {
|
| + for (size_t i = 0; i < codecs.size(); ++i) {
|
| + bool codec_matched = false;
|
| + for (size_t j = 0; j < supported_codecs.size(); ++j) {
|
| + if (MatchPattern(static_cast<base::StringPiece>(codecs[i]),
|
| + static_cast<base::StringPiece>(supported_codecs[j]))) {
|
| + codec_matched = true;
|
| + std::vector<std::string> split_string;
|
| + base::SplitString(codecs[i], '.', &split_string);
|
| + if (split_string.size() > 1 &&
|
| + !IsUpperCaseHexNumber(split_string.back())) {
|
| + codec_matched = false;
|
| + }
|
| + break;
|
| + }
|
| + }
|
| + // Return false if any of the codecs is not matching.
|
| + if (!codec_matched)
|
| + return false;
|
| + }
|
| + return !codecs.empty();
|
| +}
|
| +
|
| void MimeUtil::InitializeMimeTypeMaps() {
|
| for (size_t i = 0; i < arraysize(supported_image_types); ++i)
|
| image_map_.insert(supported_image_types[i]);
|
| @@ -521,6 +567,17 @@ void MimeUtil::InitializeMimeTypeMaps() {
|
| }
|
| strict_format_map_[format_codec_mappings[i].mime_type] = codecs;
|
| }
|
| + for (size_t i = 0; i < arraysize(format_mp4_codec_mappings); ++i) {
|
| + std::vector<std::string> mime_type_codecs;
|
| + ParseCodecString(
|
| + format_mp4_codec_mappings[i].codecs_list, &mime_type_codecs, false);
|
| +
|
| + MimeExpressionMappings codecs;
|
| + for (size_t j = 0; j < mime_type_codecs.size(); ++j) {
|
| + codecs.push_back(mime_type_codecs[j]);
|
| + }
|
| + strict_mp4_format_map_[format_mp4_codec_mappings[i].mime_type] = codecs;
|
| + }
|
| }
|
|
|
| bool MimeUtil::IsSupportedImageMimeType(const std::string& mime_type) const {
|
| @@ -703,7 +760,8 @@ void MimeUtil::ParseCodecString(const std::string& codecs,
|
| }
|
|
|
| bool MimeUtil::IsStrictMediaMimeType(const std::string& mime_type) const {
|
| - if (strict_format_map_.find(mime_type) == strict_format_map_.end())
|
| + if (strict_format_map_.find(mime_type) == strict_format_map_.end() &&
|
| + strict_mp4_format_map_.find(mime_type) == strict_mp4_format_map_.end())
|
| return false;
|
| return true;
|
| }
|
| @@ -716,6 +774,15 @@ bool MimeUtil::IsSupportedStrictMediaMimeType(
|
| AreSupportedCodecs(it->second, codecs);
|
| }
|
|
|
| +bool MimeUtil::IsSupportedStrictMP4MediaMimeType(
|
| + const std::string& mime_type,
|
| + const std::vector<std::string>& codecs) const {
|
| + StrictExpressionMappings::const_iterator it =
|
| + strict_mp4_format_map_.find(mime_type);
|
| + return (it != strict_mp4_format_map_.end() &&
|
| + AreSupportedCodecsWithProfile(it->second, codecs));
|
| +}
|
| +
|
| void MimeUtil::RemoveProprietaryMediaTypesAndCodecsForTests() {
|
| for (size_t i = 0; i < arraysize(proprietary_media_types); ++i) {
|
| non_image_map_.erase(proprietary_media_types[i]);
|
| @@ -796,6 +863,11 @@ bool IsSupportedStrictMediaMimeType(const std::string& mime_type,
|
| return g_mime_util.Get().IsSupportedStrictMediaMimeType(mime_type, codecs);
|
| }
|
|
|
| +bool IsSupportedStrictMP4MediaMimeType(const std::string& mime_type,
|
| + const std::vector<std::string>& codecs) {
|
| + return g_mime_util.Get().IsSupportedStrictMP4MediaMimeType(mime_type, codecs);
|
| +}
|
| +
|
| void ParseCodecString(const std::string& codecs,
|
| std::vector<std::string>* codecs_out,
|
| const bool strip) {
|
|
|