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