|
1 # HG changeset patch |
|
2 # Parent 09328afa274e7cf6354f446ae37735218b796e7f |
|
3 # User Wolfgang Rosenauer <wr@rosenauer.org> |
|
4 Bug 803287 - Don't use GStreamer (when enabled) for Ogg/WebM if builtin backends present. (TM: 19) |
|
5 |
|
6 diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp |
|
7 --- a/content/base/src/nsContentUtils.cpp |
|
8 +++ b/content/base/src/nsContentUtils.cpp |
|
9 @@ -6676,71 +6676,55 @@ nsContentUtils::FindInternalContentViewe |
|
10 else |
|
11 *aLoaderType = TYPE_UNKNOWN; |
|
12 } |
|
13 return docFactory.forget(); |
|
14 } |
|
15 |
|
16 #ifdef MOZ_MEDIA |
|
17 #ifdef MOZ_OGG |
|
18 - if (nsHTMLMediaElement::IsOggEnabled()) { |
|
19 - for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gOggTypes); ++i) { |
|
20 - const char* type = nsHTMLMediaElement::gOggTypes[i]; |
|
21 - if (!strcmp(aType, type)) { |
|
22 - docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
23 - if (docFactory && aLoaderType) { |
|
24 - *aLoaderType = TYPE_CONTENT; |
|
25 - } |
|
26 - return docFactory.forget(); |
|
27 - } |
|
28 + if (nsHTMLMediaElement::IsOggType(nsDependentCString(aType))) { |
|
29 + docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
30 + if (docFactory && aLoaderType) { |
|
31 + *aLoaderType = TYPE_CONTENT; |
|
32 } |
|
33 + return docFactory.forget(); |
|
34 } |
|
35 #endif |
|
36 |
|
37 #ifdef MOZ_WEBM |
|
38 - if (nsHTMLMediaElement::IsWebMEnabled()) { |
|
39 - for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gWebMTypes); ++i) { |
|
40 - const char* type = nsHTMLMediaElement::gWebMTypes[i]; |
|
41 - if (!strcmp(aType, type)) { |
|
42 - docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
43 - if (docFactory && aLoaderType) { |
|
44 - *aLoaderType = TYPE_CONTENT; |
|
45 - } |
|
46 - return docFactory.forget(); |
|
47 - } |
|
48 + if (nsHTMLMediaElement::IsWebMType(nsDependentCString(aType))) { |
|
49 + docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
50 + if (docFactory && aLoaderType) { |
|
51 + *aLoaderType = TYPE_CONTENT; |
|
52 } |
|
53 + return docFactory.forget(); |
|
54 } |
|
55 #endif |
|
56 |
|
57 #ifdef MOZ_GSTREAMER |
|
58 - if (nsHTMLMediaElement::IsH264Enabled()) { |
|
59 - for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gH264Types); ++i) { |
|
60 - const char* type = nsHTMLMediaElement::gH264Types[i]; |
|
61 - if (!strcmp(aType, type)) { |
|
62 - docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
63 - if (docFactory && aLoaderType) { |
|
64 - *aLoaderType = TYPE_CONTENT; |
|
65 - } |
|
66 - return docFactory.forget(); |
|
67 - } |
|
68 + if (nsHTMLMediaElement::IsGStreamerSupportedType(nsDependentCString(aType))) { |
|
69 + docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
70 + if (docFactory && aLoaderType) { |
|
71 + *aLoaderType = TYPE_CONTENT; |
|
72 } |
|
73 + return docFactory.forget(); |
|
74 } |
|
75 #endif |
|
76 |
|
77 #ifdef MOZ_MEDIA_PLUGINS |
|
78 if (nsHTMLMediaElement::IsMediaPluginsEnabled() && |
|
79 nsHTMLMediaElement::IsMediaPluginsType(nsDependentCString(aType))) { |
|
80 docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1"); |
|
81 if (docFactory && aLoaderType) { |
|
82 *aLoaderType = TYPE_CONTENT; |
|
83 } |
|
84 return docFactory.forget(); |
|
85 } |
|
86 #endif // MOZ_MEDIA_PLUGINS |
|
87 - |
|
88 #endif // MOZ_MEDIA |
|
89 |
|
90 return NULL; |
|
91 } |
|
92 |
|
93 // static |
|
94 bool |
|
95 nsContentUtils::IsPatternMatching(nsAString& aValue, nsAString& aPattern, |
|
96 diff --git a/content/html/content/public/nsHTMLMediaElement.h b/content/html/content/public/nsHTMLMediaElement.h |
|
97 --- a/content/html/content/public/nsHTMLMediaElement.h |
|
98 +++ b/content/html/content/public/nsHTMLMediaElement.h |
|
99 @@ -303,17 +303,18 @@ public: |
|
100 #ifdef MOZ_WEBM |
|
101 static bool IsWebMEnabled(); |
|
102 static bool IsWebMType(const nsACString& aType); |
|
103 static const char gWebMTypes[2][11]; |
|
104 static char const *const gWebMCodecs[4]; |
|
105 #endif |
|
106 |
|
107 #ifdef MOZ_GSTREAMER |
|
108 - static bool IsH264Enabled(); |
|
109 + static bool IsGStreamerEnabled(); |
|
110 + static bool IsGStreamerSupportedType(const nsACString& aType); |
|
111 static bool IsH264Type(const nsACString& aType); |
|
112 static const char gH264Types[3][16]; |
|
113 static char const *const gH264Codecs[7]; |
|
114 #endif |
|
115 |
|
116 #ifdef MOZ_WIDGET_GONK |
|
117 static bool IsOmxEnabled(); |
|
118 static bool IsOmxSupportedType(const nsACString& aType); |
|
119 diff --git a/content/html/content/src/nsHTMLMediaElement.cpp b/content/html/content/src/nsHTMLMediaElement.cpp |
|
120 --- a/content/html/content/src/nsHTMLMediaElement.cpp |
|
121 +++ b/content/html/content/src/nsHTMLMediaElement.cpp |
|
122 @@ -2148,34 +2148,29 @@ char const *const nsHTMLMediaElement::gH |
|
123 #ifdef MOZ_GSTREAMER |
|
124 const char nsHTMLMediaElement::gH264Types[3][16] = { |
|
125 "video/mp4", |
|
126 "video/3gpp", |
|
127 "video/quicktime", |
|
128 }; |
|
129 |
|
130 bool |
|
131 -nsHTMLMediaElement::IsH264Enabled() |
|
132 +nsHTMLMediaElement::IsGStreamerEnabled() |
|
133 { |
|
134 - return Preferences::GetBool("media.h264.enabled"); |
|
135 + return Preferences::GetBool("media.gstreamer.enabled"); |
|
136 } |
|
137 |
|
138 bool |
|
139 nsHTMLMediaElement::IsH264Type(const nsACString& aType) |
|
140 { |
|
141 - if (!IsH264Enabled()) { |
|
142 - return false; |
|
143 - } |
|
144 - |
|
145 for (uint32_t i = 0; i < ArrayLength(gH264Types); ++i) { |
|
146 if (aType.EqualsASCII(gH264Types[i])) { |
|
147 return true; |
|
148 } |
|
149 } |
|
150 - |
|
151 return false; |
|
152 } |
|
153 #endif |
|
154 |
|
155 #ifdef MOZ_WIDGET_GONK |
|
156 const char nsHTMLMediaElement::gOmxTypes[5][16] = { |
|
157 "audio/mpeg", |
|
158 "audio/mp4", |
|
159 @@ -2424,34 +2419,63 @@ nsHTMLMediaElement::CanPlayType(const ns |
|
160 default: |
|
161 case CANPLAY_MAYBE: |
|
162 aResult.AssignLiteral("maybe"); |
|
163 break; |
|
164 } |
|
165 return NS_OK; |
|
166 } |
|
167 |
|
168 +#ifdef MOZ_GSTREAMER |
|
169 +bool |
|
170 +nsHTMLMediaElement::IsGStreamerSupportedType(const nsACString& aMimeType) |
|
171 +{ |
|
172 + if (!IsGStreamerEnabled()) |
|
173 + return false; |
|
174 + if (IsH264Type(aMimeType)) |
|
175 + return true; |
|
176 + if (!Preferences::GetBool("media.prefer-gstreamer", false)) |
|
177 + return false; |
|
178 +#ifdef MOZ_WEBM |
|
179 + if (IsWebMType(aMimeType)) |
|
180 + return true; |
|
181 +#endif |
|
182 +#ifdef MOZ_OGG |
|
183 + if (IsOggType(aMimeType)) |
|
184 + return true; |
|
185 +#endif |
|
186 + return false; |
|
187 +} |
|
188 +#endif |
|
189 + |
|
190 already_AddRefed<nsMediaDecoder> |
|
191 nsHTMLMediaElement::CreateDecoder(const nsACString& aType) |
|
192 { |
|
193 +#ifdef MOZ_GSTREAMER |
|
194 + // When enabled, use GStreamer for H.264, but not for codecs handled by our |
|
195 + // bundled decoders, unless the "media.prefer-gstreamer" pref is set. |
|
196 + if (IsGStreamerSupportedType(aType)) { |
|
197 + nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder(); |
|
198 + if (decoder->Init(this)) { |
|
199 + return decoder.forget(); |
|
200 + } |
|
201 + } |
|
202 +#endif |
|
203 + |
|
204 #ifdef MOZ_RAW |
|
205 if (IsRawType(aType)) { |
|
206 nsRefPtr<nsRawDecoder> decoder = new nsRawDecoder(); |
|
207 if (decoder->Init(this)) { |
|
208 return decoder.forget(); |
|
209 } |
|
210 } |
|
211 #endif |
|
212 #ifdef MOZ_OGG |
|
213 if (IsOggType(aType)) { |
|
214 -#ifdef MOZ_GSTREAMER |
|
215 - nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder(); |
|
216 -#else |
|
217 nsRefPtr<nsOggDecoder> decoder = new nsOggDecoder(); |
|
218 -#endif |
|
219 if (decoder->Init(this)) { |
|
220 return decoder.forget(); |
|
221 } |
|
222 } |
|
223 #endif |
|
224 #ifdef MOZ_WAVE |
|
225 if (IsWaveType(aType)) { |
|
226 nsRefPtr<nsWaveDecoder> decoder = new nsWaveDecoder(); |
|
227 @@ -2473,44 +2497,32 @@ nsHTMLMediaElement::CreateDecoder(const |
|
228 nsRefPtr<nsMediaPluginDecoder> decoder = new nsMediaPluginDecoder(aType); |
|
229 if (decoder->Init(this)) { |
|
230 return decoder.forget(); |
|
231 } |
|
232 } |
|
233 #endif |
|
234 #ifdef MOZ_WEBM |
|
235 if (IsWebMType(aType)) { |
|
236 -#ifdef MOZ_GSTREAMER |
|
237 - nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder(); |
|
238 -#else |
|
239 nsRefPtr<nsWebMDecoder> decoder = new nsWebMDecoder(); |
|
240 -#endif |
|
241 if (decoder->Init(this)) { |
|
242 return decoder.forget(); |
|
243 } |
|
244 } |
|
245 #endif |
|
246 |
|
247 #ifdef MOZ_DASH |
|
248 if (IsDASHMPDType(aType)) { |
|
249 nsRefPtr<nsDASHDecoder> decoder = new nsDASHDecoder(); |
|
250 if (decoder->Init(this)) { |
|
251 return decoder.forget(); |
|
252 } |
|
253 } |
|
254 #endif |
|
255 |
|
256 -#ifdef MOZ_GSTREAMER |
|
257 - if (IsH264Type(aType)) { |
|
258 - nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder(); |
|
259 - if (decoder->Init(this)) { |
|
260 - return decoder.forget(); |
|
261 - } |
|
262 - } |
|
263 -#endif |
|
264 return nullptr; |
|
265 } |
|
266 |
|
267 nsresult nsHTMLMediaElement::InitializeDecoderAsClone(nsMediaDecoder* aOriginal) |
|
268 { |
|
269 NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set"); |
|
270 NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder"); |
|
271 |
|
272 diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js |
|
273 --- a/modules/libpref/src/init/all.js |
|
274 +++ b/modules/libpref/src/init/all.js |
|
275 @@ -164,17 +164,17 @@ pref("media.wave.enabled", true); |
|
276 #endif |
|
277 #ifdef MOZ_WEBM |
|
278 pref("media.webm.enabled", true); |
|
279 #endif |
|
280 #ifdef MOZ_DASH |
|
281 pref("media.dash.enabled", true); |
|
282 #endif |
|
283 #ifdef MOZ_GSTREAMER |
|
284 -pref("media.h264.enabled", true); |
|
285 +pref("media.gstreamer.enabled", true); |
|
286 #endif |
|
287 #ifdef MOZ_WEBRTC |
|
288 pref("media.navigator.enabled", false); |
|
289 pref("media.peerconnection.enabled", false); |
|
290 pref("media.navigator.permission.disabled", false); |
|
291 #else |
|
292 #ifdef ANDROID |
|
293 pref("media.navigator.enabled", true); |