author | Wolfgang Rosenauer <wr@rosenauer.org> |
Thu, 28 Feb 2013 23:13:27 +0100 | |
branch | firefox20 |
changeset 624 | ea8e1b6429f5 |
parent 612 | 3006d73ad2fa |
child 637 | 73640b76d6c3 |
permissions | -rw-r--r-- |
612 | 1 |
# HG changeset patch |
2 |
# Parent 9fe99f8a584f2369a88bfb5281fd6bc95eb2593c |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
3 |
Bug 760140 - Query the GstRegistry for the required demuxers/decoders from canPlayType |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
4 |
|
612 | 5 |
|
6 |
diff --git a/content/media/DecoderTraits.cpp b/content/media/DecoderTraits.cpp |
|
7 |
--- a/content/media/DecoderTraits.cpp |
|
8 |
+++ b/content/media/DecoderTraits.cpp |
|
9 |
@@ -7,16 +7,18 @@ |
|
10 |
#include "DecoderTraits.h" |
|
11 |
#include "MediaDecoder.h" |
|
12 |
#include "nsCharSeparatedTokenizer.h" |
|
13 |
#ifdef MOZ_MEDIA_PLUGINS |
|
14 |
#include "MediaPluginHost.h" |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
15 |
#endif |
612 | 16 |
#ifdef MOZ_GSTREAMER |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
17 |
#include "mozilla/Preferences.h" |
612 | 18 |
+#include "GStreamerDecoder.h" |
19 |
+#include "nsXPCOMStrings.h" |
|
20 |
#endif |
|
21 |
#ifdef MOZ_WMF |
|
22 |
#include "WMFDecoder.h" |
|
23 |
#endif |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
24 |
|
612 | 25 |
namespace mozilla |
26 |
{ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
27 |
|
612 | 28 |
@@ -137,48 +139,35 @@ |
29 |
return false; |
|
30 |
} |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
31 |
|
612 | 32 |
return CodecListContains(gWebMTypes, aType); |
33 |
} |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
34 |
#endif |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
35 |
|
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
36 |
#ifdef MOZ_GSTREAMER |
612 | 37 |
-static const char* const gH264Types[4] = { |
38 |
- "video/mp4", |
|
39 |
- "video/3gpp", |
|
40 |
- "video/quicktime", |
|
41 |
- nullptr |
|
42 |
-}; |
|
43 |
- |
|
44 |
bool |
|
45 |
DecoderTraits::IsGStreamerSupportedType(const nsACString& aMimeType) |
|
46 |
{ |
|
47 |
if (!MediaDecoder::IsGStreamerEnabled()) |
|
48 |
return false; |
|
49 |
- if (IsH264Type(aMimeType)) |
|
50 |
+ if (GStreamerDecoder::CanHandleMediaType(aMimeType, nullptr)) |
|
51 |
return true; |
|
52 |
if (!Preferences::GetBool("media.prefer-gstreamer", false)) |
|
53 |
return false; |
|
54 |
#ifdef MOZ_WEBM |
|
55 |
if (IsWebMType(aMimeType)) |
|
56 |
return true; |
|
57 |
#endif |
|
58 |
#ifdef MOZ_OGG |
|
59 |
if (IsOggType(aMimeType)) |
|
60 |
return true; |
|
61 |
#endif |
|
62 |
return false; |
|
63 |
} |
|
64 |
- |
|
65 |
-bool |
|
66 |
-DecoderTraits::IsH264Type(const nsACString& aType) |
|
67 |
-{ |
|
68 |
- return CodecListContains(gH264Types, aType); |
|
69 |
-} |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
70 |
#endif |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
71 |
|
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
72 |
#ifdef MOZ_WIDGET_GONK |
612 | 73 |
static const char* const gOmxTypes[6] = { |
74 |
"audio/mpeg", |
|
75 |
"audio/mp4", |
|
76 |
"video/mp4", |
|
77 |
"video/3gpp", |
|
78 |
@@ -190,19 +179,17 @@ |
|
79 |
DecoderTraits::IsOmxSupportedType(const nsACString& aType) |
|
80 |
{ |
|
81 |
if (!MediaDecoder::IsOmxEnabled()) { |
|
82 |
return false; |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
83 |
} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
84 |
|
612 | 85 |
return CodecListContains(gOmxTypes, aType); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
86 |
} |
612 | 87 |
-#endif |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
88 |
|
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
89 |
-#if defined(MOZ_GSTREAMER) || defined(MOZ_WIDGET_GONK) |
612 | 90 |
static char const *const gH264Codecs[9] = { |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
91 |
"avc1.42E01E", // H.264 Constrained Baseline Profile Level 3.0 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
92 |
"avc1.42001E", // H.264 Baseline Profile Level 3.0 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
93 |
"avc1.58A01E", // H.264 Extended Profile Level 3.0 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
94 |
"avc1.4D401E", // H.264 Main Profile Level 3.0 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
95 |
"avc1.64001E", // H.264 High Profile Level 3.0 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
96 |
"avc1.64001F", // H.264 High Profile Level 3.1 |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
97 |
"mp4v.20.3", // 3GPP |
612 | 98 |
@@ -303,19 +290,19 @@ |
99 |
#ifdef MOZ_DASH |
|
100 |
if (IsDASHMPDType(nsDependentCString(aMIMEType))) { |
|
101 |
// DASH manifest uses WebM codecs only. |
|
102 |
codecList = gWebMCodecs; |
|
103 |
result = CANPLAY_YES; |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
104 |
} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
105 |
#endif |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
106 |
#ifdef MOZ_GSTREAMER |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
107 |
- if (IsH264Type(nsDependentCString(aMIMEType))) { |
612 | 108 |
- codecList = gH264Codecs; |
109 |
- result = CANPLAY_MAYBE; |
|
110 |
+ if (GStreamerDecoder::CanHandleMediaType(nsDependentCString(aMIMEType), |
|
111 |
+ aHaveRequestedCodecs ? &aRequestedCodecs : nullptr)) { |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
112 |
+ return CANPLAY_YES; |
612 | 113 |
} |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
114 |
#endif |
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
115 |
#ifdef MOZ_WIDGET_GONK |
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
116 |
if (IsOmxSupportedType(nsDependentCString(aMIMEType))) { |
612 | 117 |
codecList = gH264Codecs; |
118 |
result = CANPLAY_MAYBE; |
|
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
119 |
} |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
120 |
#endif |
612 | 121 |
@@ -324,17 +311,17 @@ |
122 |
result = CANPLAY_MAYBE; |
|
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
123 |
} |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
124 |
#endif |
568
2c74c5927ea2
first working Aurora 18 build
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
541
diff
changeset
|
125 |
#ifdef MOZ_MEDIA_PLUGINS |
612 | 126 |
if (MediaDecoder::IsMediaPluginsEnabled() && |
127 |
GetMediaPluginHost()->FindDecoder(nsDependentCString(aMIMEType), &codecList)) |
|
128 |
result = CANPLAY_MAYBE; |
|
129 |
#endif |
|
130 |
- if (result == CANPLAY_NO || !aHaveRequestedCodecs) { |
|
131 |
+ if (result == CANPLAY_NO || !aHaveRequestedCodecs || !codecList) { |
|
132 |
return result; |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
133 |
} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
134 |
|
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
135 |
// See http://www.rfc-editor.org/rfc/rfc4281.txt for the description |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
136 |
// of the 'codecs' parameter |
612 | 137 |
nsCharSeparatedTokenizer tokenizer(aRequestedCodecs, ','); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
138 |
bool expectMoreTokens = false; |
612 | 139 |
while (tokenizer.hasMoreTokens()) { |
140 |
diff --git a/content/media/DecoderTraits.h b/content/media/DecoderTraits.h |
|
141 |
--- a/content/media/DecoderTraits.h |
|
142 |
+++ b/content/media/DecoderTraits.h |
|
143 |
@@ -49,17 +49,16 @@ |
|
144 |
#endif |
|
145 |
||
146 |
#ifdef MOZ_WEBM |
|
147 |
static bool IsWebMType(const nsACString& aType); |
|
148 |
#endif |
|
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
149 |
|
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
150 |
#ifdef MOZ_GSTREAMER |
612 | 151 |
static bool IsGStreamerSupportedType(const nsACString& aType); |
152 |
- static bool IsH264Type(const nsACString& aType); |
|
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
153 |
#endif |
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
154 |
|
612 | 155 |
#ifdef MOZ_WIDGET_GONK |
156 |
static bool IsOmxSupportedType(const nsACString& aType); |
|
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
157 |
#endif |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
158 |
|
612 | 159 |
#ifdef MOZ_MEDIA_PLUGINS |
160 |
static bool IsMediaPluginsType(const nsACString& aType); |
|
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
161 |
diff --git a/content/media/gstreamer/GStreamerDecoder.cpp b/content/media/gstreamer/GStreamerDecoder.cpp |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
162 |
--- a/content/media/gstreamer/GStreamerDecoder.cpp |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
163 |
+++ b/content/media/gstreamer/GStreamerDecoder.cpp |
612 | 164 |
@@ -2,18 +2,26 @@ |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
165 |
/* vim:set ts=2 sw=2 sts=2 et cindent: */ |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
166 |
/* This Source Code Form is subject to the terms of the Mozilla Public |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
167 |
* License, v. 2.0. If a copy of the MPL was not distributed with this file, |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
168 |
* You can obtain one at http://mozilla.org/MPL/2.0/. */ |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
169 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
170 |
#include "MediaDecoderStateMachine.h" |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
171 |
#include "GStreamerReader.h" |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
172 |
#include "GStreamerDecoder.h" |
612 | 173 |
+#include "GStreamerFormatHelper.h" |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
174 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
175 |
namespace mozilla { |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
176 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
177 |
MediaDecoderStateMachine* GStreamerDecoder::CreateStateMachine() |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
178 |
{ |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
179 |
return new MediaDecoderStateMachine(this, new GStreamerReader(this)); |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
180 |
} |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
181 |
|
612 | 182 |
+bool |
183 |
+GStreamerDecoder::CanHandleMediaType(const nsACString& aMIMEType, |
|
184 |
+ const nsAString* aCodecs) |
|
185 |
+{ |
|
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
186 |
+ return GStreamerFormatHelper::Instance()->CanHandleMediaType(aMIMEType, aCodecs); |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
187 |
+} |
612 | 188 |
+ |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
189 |
} // namespace mozilla |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
190 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
191 |
diff --git a/content/media/gstreamer/GStreamerDecoder.h b/content/media/gstreamer/GStreamerDecoder.h |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
192 |
--- a/content/media/gstreamer/GStreamerDecoder.h |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
193 |
+++ b/content/media/gstreamer/GStreamerDecoder.h |
612 | 194 |
@@ -3,21 +3,23 @@ |
195 |
/* This Source Code Form is subject to the terms of the Mozilla Public |
|
196 |
* License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
197 |
* You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
198 |
||
199 |
#if !defined(GStreamerDecoder_h_) |
|
200 |
#define GStreamerDecoder_h_ |
|
201 |
||
202 |
#include "MediaDecoder.h" |
|
203 |
+#include "nsXPCOMStrings.h" |
|
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
204 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
205 |
namespace mozilla { |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
206 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
207 |
class GStreamerDecoder : public MediaDecoder |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
208 |
{ |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
209 |
public: |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
210 |
virtual MediaDecoder* Clone() { return new GStreamerDecoder(); } |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
211 |
virtual MediaDecoderStateMachine* CreateStateMachine(); |
612 | 212 |
+ static bool CanHandleMediaType(const nsACString& aMIMEType, const nsAString* aCodecs); |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
213 |
}; |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
214 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
215 |
} // namespace mozilla |
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
216 |
|
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
217 |
#endif |
612 | 218 |
diff --git a/content/media/gstreamer/GStreamerFormatHelper.cpp b/content/media/gstreamer/GStreamerFormatHelper.cpp |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
219 |
new file mode 100644 |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
220 |
--- /dev/null |
612 | 221 |
+++ b/content/media/gstreamer/GStreamerFormatHelper.cpp |
222 |
@@ -0,0 +1,159 @@ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
223 |
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
224 |
+/* vim:set ts=2 sw=2 sts=2 et cindent: */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
225 |
+/* This Source Code Form is subject to the terms of the Mozilla Public |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
226 |
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
227 |
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
228 |
+ |
612 | 229 |
+#include "GStreamerFormatHelper.h" |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
230 |
+#include "nsCharSeparatedTokenizer.h" |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
231 |
+#include "nsXPCOMStrings.h" |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
232 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
233 |
+#define ENTRY_FORMAT(entry) entry[0] |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
234 |
+#define ENTRY_CAPS(entry) entry[1] |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
235 |
+ |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
236 |
+GStreamerFormatHelper* GStreamerFormatHelper::gInstance = nullptr; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
237 |
+ |
612 | 238 |
+GStreamerFormatHelper* GStreamerFormatHelper::Instance() { |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
239 |
+ if (!gInstance) { |
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
240 |
+ gst_init(nullptr, nullptr); |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
241 |
+ gInstance = new GStreamerFormatHelper(); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
242 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
243 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
244 |
+ return gInstance; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
245 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
246 |
+ |
612 | 247 |
+void GStreamerFormatHelper::Shutdown() { |
248 |
+ if (gInstance) { |
|
249 |
+ delete gInstance; |
|
250 |
+ gInstance = nullptr; |
|
251 |
+ } |
|
252 |
+} |
|
253 |
+ |
|
254 |
+char const *const GStreamerFormatHelper::mContainers[4][2] = { |
|
255 |
+ {"video/mp4", "video/quicktime"}, |
|
256 |
+ {"video/quicktime", "video/quicktime"}, |
|
257 |
+ {"audio/mp4", "audio/mpeg, mpegversion=(int)4"}, |
|
258 |
+ {"audio/mpeg", "audio/mpeg, mpegversion=(int)1"}, |
|
259 |
+}; |
|
260 |
+ |
|
261 |
+char const *const GStreamerFormatHelper::mCodecs[8][2] = { |
|
262 |
+ {"avc1.42E01E", "video/x-h264"}, |
|
263 |
+ {"avc1.42001E", "video/x-h264"}, |
|
264 |
+ {"avc1.58A01E", "video/x-h264"}, |
|
265 |
+ {"avc1.4D401E", "video/x-h264"}, |
|
266 |
+ {"avc1.64001E", "video/x-h264"}, |
|
267 |
+ {"avc1.64001F", "video/x-h264"}, |
|
268 |
+ {"mp4v.20.3", "video/3gpp"}, |
|
269 |
+ {"mp4a.40.2", "audio/mpeg, mpegversion=(int)4"}, |
|
270 |
+}; |
|
271 |
+ |
|
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
272 |
+GStreamerFormatHelper::GStreamerFormatHelper() |
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
273 |
+ : mFactories(nullptr), |
612 | 274 |
+ mCookie(static_cast<uint32_t>(-1)) |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
275 |
+{ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
276 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
277 |
+ |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
278 |
+GStreamerFormatHelper::~GStreamerFormatHelper() { |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
279 |
+ if (mFactories) |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
280 |
+ g_list_free(mFactories); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
281 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
282 |
+ |
612 | 283 |
+bool GStreamerFormatHelper::CanHandleMediaType(const nsACString& aMIMEType, |
284 |
+ const nsAString* aCodecs) { |
|
285 |
+ const char *type; |
|
286 |
+ NS_CStringGetData(aMIMEType, &type, NULL); |
|
287 |
+ |
|
288 |
+ GstCaps* caps = ConvertFormatsToCaps(type, aCodecs); |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
289 |
+ if (!caps) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
290 |
+ return false; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
291 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
292 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
293 |
+ bool ret = HaveElementsToProcessCaps(caps); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
294 |
+ gst_caps_unref(caps); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
295 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
296 |
+ return ret; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
297 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
298 |
+ |
612 | 299 |
+GstCaps* GStreamerFormatHelper::ConvertFormatsToCaps(const char* aMIMEType, |
300 |
+ const nsAString* aCodecs) { |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
301 |
+ unsigned int i; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
302 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
303 |
+ /* convert aMIMEType to gst container caps */ |
612 | 304 |
+ const char* capsString = nullptr; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
305 |
+ for (i = 0; i < G_N_ELEMENTS(mContainers); i++) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
306 |
+ if (!strcmp(ENTRY_FORMAT(mContainers[i]), aMIMEType)) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
307 |
+ capsString = ENTRY_CAPS(mContainers[i]); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
308 |
+ break; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
309 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
310 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
311 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
312 |
+ if (!capsString) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
313 |
+ /* we couldn't find any matching caps */ |
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
314 |
+ return nullptr; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
315 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
316 |
+ |
612 | 317 |
+ GstCaps* caps = gst_caps_from_string(capsString); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
318 |
+ /* container only */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
319 |
+ if (!aCodecs) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
320 |
+ return caps; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
321 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
322 |
+ |
612 | 323 |
+ nsCharSeparatedTokenizer tokenizer(*aCodecs, ','); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
324 |
+ while (tokenizer.hasMoreTokens()) { |
612 | 325 |
+ const nsSubstring& codec = tokenizer.nextToken(); |
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
326 |
+ capsString = nullptr; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
327 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
328 |
+ for (i = 0; i < G_N_ELEMENTS(mCodecs); i++) { |
612 | 329 |
+ if (codec.EqualsASCII(ENTRY_FORMAT(mCodecs[i]))) { |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
330 |
+ capsString = ENTRY_CAPS(mCodecs[i]); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
331 |
+ break; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
332 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
333 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
334 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
335 |
+ if (!capsString) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
336 |
+ gst_caps_unref(caps); |
573
71cf05d3ee57
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
568
diff
changeset
|
337 |
+ return nullptr; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
338 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
339 |
+ |
612 | 340 |
+ GstCaps* tmp = gst_caps_from_string(capsString); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
341 |
+ /* appends and frees tmp */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
342 |
+ gst_caps_append(caps, tmp); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
343 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
344 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
345 |
+ return caps; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
346 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
347 |
+ |
612 | 348 |
+bool GStreamerFormatHelper::HaveElementsToProcessCaps(GstCaps* aCaps) { |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
349 |
+ |
612 | 350 |
+ GList* factories = GetFactories(); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
351 |
+ |
612 | 352 |
+ GList* list; |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
353 |
+ /* here aCaps contains [containerCaps, [codecCaps1, [codecCaps2, ...]]] so process |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
354 |
+ * caps structures individually as we want one element for _each_ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
355 |
+ * structure */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
356 |
+ for (unsigned int i = 0; i < gst_caps_get_size(aCaps); i++) { |
612 | 357 |
+ GstStructure* s = gst_caps_get_structure(aCaps, i); |
358 |
+ GstCaps* caps = gst_caps_new_full(gst_structure_copy(s), nullptr); |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
359 |
+ list = gst_element_factory_list_filter (factories, caps, GST_PAD_SINK, FALSE); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
360 |
+ gst_caps_unref(caps); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
361 |
+ if (!list) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
362 |
+ return false; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
363 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
364 |
+ g_list_free(list); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
365 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
366 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
367 |
+ return true; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
368 |
+} |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
369 |
+ |
612 | 370 |
+GList* GStreamerFormatHelper::GetFactories() { |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
371 |
+ uint32_t cookie = gst_default_registry_get_feature_list_cookie (); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
372 |
+ if (cookie != mCookie) { |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
373 |
+ g_list_free(mFactories); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
374 |
+ mFactories = gst_element_factory_list_get_elements |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
375 |
+ (GST_ELEMENT_FACTORY_TYPE_DEMUXER | GST_ELEMENT_FACTORY_TYPE_DECODER, |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
376 |
+ GST_RANK_MARGINAL); |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
377 |
+ mCookie = cookie; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
378 |
+ } |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
379 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
380 |
+ return mFactories; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
381 |
+} |
612 | 382 |
diff --git a/content/media/gstreamer/GStreamerFormatHelper.h b/content/media/gstreamer/GStreamerFormatHelper.h |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
383 |
new file mode 100644 |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
384 |
--- /dev/null |
612 | 385 |
+++ b/content/media/gstreamer/GStreamerFormatHelper.h |
386 |
@@ -0,0 +1,60 @@ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
387 |
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
388 |
+/* vim:set ts=2 sw=2 sts=2 et cindent: */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
389 |
+/* This Source Code Form is subject to the terms of the Mozilla Public |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
390 |
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
391 |
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
392 |
+ |
612 | 393 |
+#if !defined(GStreamerFormatHelper_h_) |
394 |
+#define GStreamerFormatHelper_h_ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
395 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
396 |
+#include <gst/gst.h> |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
397 |
+#include <mozilla/Types.h> |
612 | 398 |
+#include "nsXPCOMStrings.h" |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
399 |
+ |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
400 |
+class GStreamerFormatHelper { |
612 | 401 |
+ /* This class can be used to query the GStreamer registry for the required |
402 |
+ * demuxers/decoders from nsHTMLMediaElement::CanPlayType. |
|
403 |
+ * It implements looking at the GstRegistry to check if elements to |
|
404 |
+ * demux/decode the formats passed to CanPlayType() are actually installed. |
|
405 |
+ */ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
406 |
+ public: |
612 | 407 |
+ static GStreamerFormatHelper* Instance(); |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
408 |
+ ~GStreamerFormatHelper(); |
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
409 |
+ |
612 | 410 |
+ bool CanHandleMediaType(const nsACString& aMIMEType, |
411 |
+ const nsAString* aCodecs); |
|
412 |
+ |
|
413 |
+ static void Shutdown(); |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
414 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
415 |
+ private: |
606
9d39369e1b4c
FF19beta cycle preparation (does not build yet)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
573
diff
changeset
|
416 |
+ GStreamerFormatHelper(); |
612 | 417 |
+ GstCaps* ConvertFormatsToCaps(const char* aMIMEType, |
418 |
+ const nsAString* aCodecs); |
|
419 |
+ char* const *CodecListFromCaps(GstCaps* aCaps); |
|
420 |
+ bool HaveElementsToProcessCaps(GstCaps* aCaps); |
|
421 |
+ GList* GetFactories(); |
|
422 |
+ |
|
423 |
+ static GStreamerFormatHelper* gInstance; |
|
424 |
+ |
|
425 |
+ /* table to convert from container MIME types to GStreamer elements */ |
|
426 |
+ static char const *const mContainers[4][2]; |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
427 |
+ |
612 | 428 |
+ /* table to convert from codec MIME types to GStreamer elements */ |
429 |
+ static char const *const mCodecs[8][2]; |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
430 |
+ |
612 | 431 |
+ /* list of GStreamer element factories |
432 |
+ * Element factories are the basic types retrieved from the GStreamer |
|
433 |
+ * registry, they describe all plugins and elements that GStreamer can |
|
434 |
+ * create. |
|
435 |
+ * This means that element factories are useful for automated element |
|
436 |
+ * instancing, such as what autopluggers do, |
|
437 |
+ * and for creating lists of available elements. */ |
|
438 |
+ GList* mFactories; |
|
439 |
+ |
|
440 |
+ /* Storage for the default registrys feature list cookie. |
|
441 |
+ * It changes every time a feature is added to or removed from the |
|
442 |
+ * GStreamer registry. */ |
|
529
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
443 |
+ uint32_t mCookie; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
444 |
+}; |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
445 |
+ |
4812378b5646
import GStreamer improvement from bmo#760140 (support mpeg audio)
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff
changeset
|
446 |
+#endif |
612 | 447 |
diff --git a/content/media/gstreamer/Makefile.in b/content/media/gstreamer/Makefile.in |
448 |
--- a/content/media/gstreamer/Makefile.in |
|
449 |
+++ b/content/media/gstreamer/Makefile.in |
|
450 |
@@ -13,21 +13,23 @@ |
|
451 |
MODULE = content |
|
452 |
LIBRARY_NAME = gkcongstreamer_s |
|
453 |
LIBXUL_LIBRARY = 1 |
|
454 |
||
455 |
||
456 |
EXPORTS += \ |
|
457 |
GStreamerDecoder.h \ |
|
458 |
GStreamerReader.h \ |
|
459 |
+ GStreamerFormatHelper.h \ |
|
460 |
$(NULL) |
|
461 |
||
462 |
CPPSRCS = \ |
|
463 |
GStreamerReader.cpp \ |
|
464 |
GStreamerDecoder.cpp \ |
|
465 |
+ GStreamerFormatHelper.cpp \ |
|
466 |
$(NULL) |
|
467 |
||
468 |
FORCE_STATIC_LIB = 1 |
|
469 |
||
470 |
include $(topsrcdir)/config/rules.mk |
|
471 |
||
472 |
CFLAGS += $(GSTREAMER_CFLAGS) |
|
473 |
CXXFLAGS += $(GSTREAMER_CFLAGS) |
|
474 |
diff --git a/layout/build/Makefile.in b/layout/build/Makefile.in |
|
475 |
--- a/layout/build/Makefile.in |
|
476 |
+++ b/layout/build/Makefile.in |
|
477 |
@@ -316,16 +316,20 @@ |
|
478 |
-I$(topsrcdir)/js/xpconnect/loader \ |
|
479 |
-I$(topsrcdir)/caps/include \ |
|
480 |
-I$(topsrcdir)/netwerk/base/src \ |
|
481 |
-I$(topsrcdir)/content/svg/content/src \ |
|
482 |
-I$(topsrcdir)/extensions/cookie \ |
|
483 |
-I$(topsrcdir)/netwerk/cookie \ |
|
484 |
$(NULL) |
|
485 |
||
486 |
+ifdef MOZ_GSTREAMER |
|
487 |
+LOCAL_INCLUDES += $(GSTREAMER_CFLAGS) |
|
488 |
+endif |
|
489 |
+ |
|
490 |
ifdef MOZ_B2G_RIL #{ |
|
491 |
LOCAL_INCLUDES += -I$(topsrcdir)/dom/system/gonk |
|
492 |
endif #} |
|
493 |
||
494 |
ifdef MOZ_B2G_FM #{ |
|
495 |
LOCAL_INCLUDES += -I$(topsrcdir)/dom/fm |
|
496 |
endif #} |
|
497 |
||
498 |
diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp |
|
499 |
--- a/layout/build/nsLayoutStatics.cpp |
|
500 |
+++ b/layout/build/nsLayoutStatics.cpp |
|
501 |
@@ -78,16 +78,20 @@ |
|
502 |
#ifdef MOZ_MEDIA_PLUGINS |
|
503 |
#include "MediaPluginHost.h" |
|
504 |
#endif |
|
505 |
||
506 |
#ifdef MOZ_WMF |
|
507 |
#include "WMFDecoder.h" |
|
508 |
#endif |
|
509 |
||
510 |
+#ifdef MOZ_GSTREAMER |
|
511 |
+#include "GStreamerFormatHelper.h" |
|
512 |
+#endif |
|
513 |
+ |
|
514 |
#ifdef MOZ_SYDNEYAUDIO |
|
515 |
#include "AudioStream.h" |
|
516 |
#endif |
|
517 |
||
518 |
#include "nsError.h" |
|
519 |
||
520 |
#include "nsCycleCollector.h" |
|
521 |
#include "nsJSEnvironment.h" |
|
522 |
@@ -336,16 +340,20 @@ |
|
523 |
nsXBLService::Shutdown(); |
|
524 |
nsAutoCopyListener::Shutdown(); |
|
525 |
FrameLayerBuilder::Shutdown(); |
|
526 |
||
527 |
#ifdef MOZ_MEDIA_PLUGINS |
|
528 |
MediaPluginHost::Shutdown(); |
|
529 |
#endif |
|
530 |
||
531 |
+#ifdef MOZ_GSTREAMER |
|
532 |
+ GStreamerFormatHelper::Shutdown(); |
|
533 |
+#endif |
|
534 |
+ |
|
535 |
#ifdef MOZ_SYDNEYAUDIO |
|
536 |
AudioStream::ShutdownLibrary(); |
|
537 |
#endif |
|
538 |
||
539 |
#ifdef MOZ_WMF |
|
540 |
WMFDecoder::UnloadDLLs(); |
|
541 |
#endif |
|
542 |