Unreviewed, rolling out r244627.
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / AVFoundationMIMETypeCache.mm
1 /*
2  * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "AVFoundationMIMETypeCache.h"
28
29 #if PLATFORM(COCOA)
30
31 #import "ContentType.h"
32 #import <AVFoundation/AVAsset.h>
33 #import <wtf/HashSet.h>
34
35 #import <pal/cf/CoreMediaSoftLink.h>
36
37 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
38 #if !PLATFORM(IOSMAC)
39 SOFT_LINK_FRAMEWORK_OPTIONAL_PREFLIGHT(AVFoundation)
40 #endif
41 SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
42 SOFT_LINK_CLASS(AVFoundation, AVURLAsset)
43 #endif
44
45 namespace WebCore {
46
47 AVFoundationMIMETypeCache& AVFoundationMIMETypeCache::singleton()
48 {
49     static NeverDestroyed<AVFoundationMIMETypeCache> cache;
50     return cache.get();
51 }
52
53 void AVFoundationMIMETypeCache::setSupportedTypes(const Vector<String>& types)
54 {
55     if (m_cache)
56         return;
57
58     m_cache = HashSet<String, ASCIICaseInsensitiveHash>();
59     for (auto& type : types)
60         m_cache->add(type);
61 }
62
63 const HashSet<String, ASCIICaseInsensitiveHash>& AVFoundationMIMETypeCache::types()
64 {
65     if (!m_cache)
66         loadMIMETypes();
67
68     return *m_cache;
69 }
70
71 bool AVFoundationMIMETypeCache::supportsContentType(const ContentType& contentType)
72 {
73     if (contentType.isEmpty())
74         return false;
75
76     return types().contains(contentType.containerType());
77 }
78
79 bool AVFoundationMIMETypeCache::canDecodeType(const String& mimeType)
80 {
81     if (mimeType.isEmpty())
82         return false;
83
84     if (!isAvailable() || !types().contains(ContentType { mimeType }.containerType()))
85         return false;
86
87 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
88     return [getAVURLAssetClass() isPlayableExtendedMIMEType:mimeType];
89 #endif
90
91     return false;
92 }
93
94 bool AVFoundationMIMETypeCache::isAvailable() const
95 {
96 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
97 #if PLATFORM(IOSMAC)
98     // FIXME: This should be using AVFoundationLibraryIsAvailable() instead, but doing so causes soft-linking
99     // to subsequently fail on certain symbols. See <rdar://problem/42224780> for more details.
100     return AVFoundationLibrary();
101 #else
102     return AVFoundationLibraryIsAvailable();
103 #endif
104 #else
105     return false;
106 #endif
107 }
108
109 void AVFoundationMIMETypeCache::loadMIMETypes()
110 {
111     m_cache = HashSet<String, ASCIICaseInsensitiveHash>();
112
113 #if ENABLE(VIDEO) && USE(AVFOUNDATION)
114     static std::once_flag onceFlag;
115     std::call_once(onceFlag, [this] {
116         if (!AVFoundationLibrary())
117             return;
118
119         for (NSString* type in [getAVURLAssetClass() audiovisualMIMETypes])
120             m_cache->add(type);
121
122         if (m_cacheTypeCallback)
123             m_cacheTypeCallback(copyToVector(*m_cache));
124     });
125 #endif
126 }
127
128 }
129
130 #endif