diff options
Diffstat (limited to 'linden/indra/llmedia')
26 files changed, 292 insertions, 175 deletions
diff --git a/linden/indra/llmedia/llmediabase.h b/linden/indra/llmedia/llmediabase.h index 7f7f06f..68e6677 100644 --- a/linden/indra/llmedia/llmediabase.h +++ b/linden/indra/llmedia/llmediabase.h | |||
@@ -19,7 +19,8 @@ | |||
19 | * There are special exceptions to the terms and conditions of the GPL as | 19 | * There are special exceptions to the terms and conditions of the GPL as |
20 | * it is applied to this Source Code. View the full text of the exception | 20 | * it is applied to this Source Code. View the full text of the exception |
21 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 21 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
22 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 22 | * online at |
23 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
23 | * | 24 | * |
24 | * By copying, modifying or distributing this software, you acknowledge | 25 | * By copying, modifying or distributing this software, you acknowledge |
25 | * that you have read and understood your obligations described above, | 26 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaemitter.h b/linden/indra/llmedia/llmediaemitter.h index a5e0554..ef3caeb 100644 --- a/linden/indra/llmedia/llmediaemitter.h +++ b/linden/indra/llmedia/llmediaemitter.h | |||
@@ -19,7 +19,8 @@ | |||
19 | * There are special exceptions to the terms and conditions of the GPL as | 19 | * There are special exceptions to the terms and conditions of the GPL as |
20 | * it is applied to this Source Code. View the full text of the exception | 20 | * it is applied to this Source Code. View the full text of the exception |
21 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 21 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
22 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 22 | * online at |
23 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
23 | * | 24 | * |
24 | * By copying, modifying or distributing this software, you acknowledge | 25 | * By copying, modifying or distributing this software, you acknowledge |
25 | * that you have read and understood your obligations described above, | 26 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplcommon.cpp b/linden/indra/llmedia/llmediaimplcommon.cpp index b206618..87838f7 100644 --- a/linden/indra/llmedia/llmediaimplcommon.cpp +++ b/linden/indra/llmedia/llmediaimplcommon.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplcommon.h b/linden/indra/llmedia/llmediaimplcommon.h index 4985cba..2e60a1a 100644 --- a/linden/indra/llmedia/llmediaimplcommon.h +++ b/linden/indra/llmedia/llmediaimplcommon.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplexample1.cpp b/linden/indra/llmedia/llmediaimplexample1.cpp index 910bbf7..fe7b7e2 100644 --- a/linden/indra/llmedia/llmediaimplexample1.cpp +++ b/linden/indra/llmedia/llmediaimplexample1.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplexample1.h b/linden/indra/llmedia/llmediaimplexample1.h index 19b8ed6..1b90e93 100644 --- a/linden/indra/llmedia/llmediaimplexample1.h +++ b/linden/indra/llmedia/llmediaimplexample1.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplexample2.cpp b/linden/indra/llmedia/llmediaimplexample2.cpp index 7bda982..7590e19 100644 --- a/linden/indra/llmedia/llmediaimplexample2.cpp +++ b/linden/indra/llmedia/llmediaimplexample2.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplexample2.h b/linden/indra/llmedia/llmediaimplexample2.h index ad76088..6a4f80b 100644 --- a/linden/indra/llmedia/llmediaimplexample2.h +++ b/linden/indra/llmedia/llmediaimplexample2.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplfactory.cpp b/linden/indra/llmedia/llmediaimplfactory.cpp index 6f8787e..c5d098f 100644 --- a/linden/indra/llmedia/llmediaimplfactory.cpp +++ b/linden/indra/llmedia/llmediaimplfactory.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplfactory.h b/linden/indra/llmedia/llmediaimplfactory.h index 663efd8..93a7cc1 100644 --- a/linden/indra/llmedia/llmediaimplfactory.h +++ b/linden/indra/llmedia/llmediaimplfactory.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp index 51614c5..a4fe930 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp | |||
@@ -18,7 +18,8 @@ | |||
18 | * There are special exceptions to the terms and conditions of the GPL as | 18 | * There are special exceptions to the terms and conditions of the GPL as |
19 | * it is applied to this Source Code. View the full text of the exception | 19 | * it is applied to this Source Code. View the full text of the exception |
20 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 20 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
21 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 21 | * online at |
22 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
22 | * | 23 | * |
23 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
24 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
@@ -43,10 +44,6 @@ extern "C" { | |||
43 | 44 | ||
44 | #include "llmediaimplgstreamervidplug.h" | 45 | #include "llmediaimplgstreamervidplug.h" |
45 | 46 | ||
46 | #ifdef LL_GST_SOUNDSINK | ||
47 | #include "llmediaimplgstreamersndplug.h" | ||
48 | #endif // LL_GST_SOUNDSINK | ||
49 | |||
50 | #include "llmediaimplgstreamer_syms.h" | 47 | #include "llmediaimplgstreamer_syms.h" |
51 | 48 | ||
52 | // register this impl with media manager factory | 49 | // register this impl with media manager factory |
@@ -67,6 +64,7 @@ LLMediaImplGStreamerMaker::LLMediaImplGStreamerMaker() | |||
67 | // | 64 | // |
68 | LLMediaImplGStreamer:: | 65 | LLMediaImplGStreamer:: |
69 | LLMediaImplGStreamer () : | 66 | LLMediaImplGStreamer () : |
67 | mBusWatchID ( 0 ), | ||
70 | mediaData ( NULL ), | 68 | mediaData ( NULL ), |
71 | mMediaRowbytes ( 1 ), | 69 | mMediaRowbytes ( 1 ), |
72 | mTextureFormatPrimary ( LL_MEDIA_BGRA ), | 70 | mTextureFormatPrimary ( LL_MEDIA_BGRA ), |
@@ -74,10 +72,10 @@ LLMediaImplGStreamer () : | |||
74 | mPump ( NULL ), | 72 | mPump ( NULL ), |
75 | mPlaybin ( NULL ), | 73 | mPlaybin ( NULL ), |
76 | mVideoSink ( NULL ) | 74 | mVideoSink ( NULL ) |
77 | #ifdef LL_GST_SOUNDSINK | ||
78 | ,mAudioSink ( NULL ) | ||
79 | #endif // LL_GST_SOUNDSINK | ||
80 | { | 75 | { |
76 | if (!mDoneInit) | ||
77 | return; // error | ||
78 | |||
81 | DEBUGMSG("constructing media..."); | 79 | DEBUGMSG("constructing media..."); |
82 | 80 | ||
83 | mVolume = 0.1234567; // minor hack to force an initial volume update | 81 | mVolume = 0.1234567; // minor hack to force an initial volume update |
@@ -95,10 +93,20 @@ LLMediaImplGStreamer () : | |||
95 | mPlaybin = llgst_element_factory_make ("playbin", "play"); | 93 | mPlaybin = llgst_element_factory_make ("playbin", "play"); |
96 | if (!mPlaybin) | 94 | if (!mPlaybin) |
97 | { | 95 | { |
98 | // todo: cleanup pump | ||
99 | return; // error | 96 | return; // error |
100 | } | 97 | } |
101 | 98 | ||
99 | // get playbin's bus | ||
100 | GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin)); | ||
101 | if (!bus) | ||
102 | { | ||
103 | return; // error | ||
104 | } | ||
105 | mBusWatchID = llgst_bus_add_watch (bus, | ||
106 | llmediaimplgstreamer_bus_callback, | ||
107 | this); | ||
108 | llgst_object_unref (bus); | ||
109 | |||
102 | if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) { | 110 | if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) { |
103 | // instantiate and connect a custom video sink | 111 | // instantiate and connect a custom video sink |
104 | mVideoSink = | 112 | mVideoSink = |
@@ -111,20 +119,6 @@ LLMediaImplGStreamer () : | |||
111 | } | 119 | } |
112 | 120 | ||
113 | g_object_set(mPlaybin, "video-sink", mVideoSink, NULL); | 121 | g_object_set(mPlaybin, "video-sink", mVideoSink, NULL); |
114 | |||
115 | #ifdef LL_GST_SOUNDSINK | ||
116 | // instantiate and connect a custom audio sink | ||
117 | mAudioSink = | ||
118 | GST_SLSOUND(llgst_element_factory_make ("private-slsound", "slsound")); | ||
119 | if (!mAudioSink) | ||
120 | { | ||
121 | WARNMSG("Could not instantiate private-slsound element."); | ||
122 | // todo: cleanup. | ||
123 | return; // error | ||
124 | } | ||
125 | |||
126 | g_object_set(mPlaybin, "audio-sink", mAudioSink, NULL); | ||
127 | #endif | ||
128 | } | 122 | } |
129 | } | 123 | } |
130 | 124 | ||
@@ -166,48 +160,96 @@ std::string LLMediaImplGStreamer::getVersion() | |||
166 | 160 | ||
167 | /////////////////////////////////////////////////////////////////////////////// | 161 | /////////////////////////////////////////////////////////////////////////////// |
168 | // (static) super-initialization - called once at application startup | 162 | // (static) super-initialization - called once at application startup |
163 | |||
164 | //static | ||
165 | bool LLMediaImplGStreamer::mDoneInit = false; | ||
166 | |||
167 | //static | ||
169 | bool | 168 | bool |
170 | LLMediaImplGStreamer:: | 169 | LLMediaImplGStreamer:: |
171 | startup ( LLMediaManagerData* init_data ) | 170 | startup ( LLMediaManagerData* init_data ) |
172 | { | 171 | { |
173 | static bool done_init = false; | 172 | // first - check if GStreamer is explicitly disabled |
174 | if (!done_init) | 173 | if (NULL != getenv("LL_DISABLE_GSTREAMER")) |
174 | return false; | ||
175 | |||
176 | // only do global GStreamer initialization once. | ||
177 | if (!mDoneInit) | ||
175 | { | 178 | { |
176 | // Init the glib type system - we need it. | 179 | // Init the glib type system - we need it. |
177 | g_type_init(); | 180 | g_type_init(); |
178 | 181 | ||
179 | // Get symbols! | 182 | // Get symbols! |
180 | if (! grab_gst_syms("libgstreamer-0.10.so.0", | 183 | if (! grab_gst_syms("libgstreamer-0.10.so.0", |
181 | "libgstvideo-0.10.so.0", | 184 | "libgstvideo-0.10.so.0") ) |
182 | "libgstaudio-0.10.so.0") ) | ||
183 | { | 185 | { |
184 | WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled."); | 186 | WARNMSG("Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled."); |
185 | return false; | 187 | return false; |
186 | } | 188 | } |
187 | 189 | ||
188 | if (llgst_segtrap_set_enabled) | 190 | if (llgst_segtrap_set_enabled) |
191 | { | ||
189 | llgst_segtrap_set_enabled(FALSE); | 192 | llgst_segtrap_set_enabled(FALSE); |
193 | } | ||
190 | else | 194 | else |
195 | { | ||
191 | WARNMSG("gst_segtrap_set_enabled() is not available; Automated crash-reporter may cease to function until next restart."); | 196 | WARNMSG("gst_segtrap_set_enabled() is not available; Automated crash-reporter may cease to function until next restart."); |
197 | } | ||
198 | |||
199 | #if LL_LINUX | ||
200 | // Gstreamer tries a fork during init, waitpid-ing on it, | ||
201 | // which conflicts with any installed SIGCHLD handler... | ||
202 | struct sigaction tmpact, oldact; | ||
203 | if (llgst_registry_fork_set_enabled) { | ||
204 | // if we can disable SIGCHLD-using forking behaviour, | ||
205 | // do it. | ||
206 | llgst_registry_fork_set_enabled(false); | ||
207 | } | ||
208 | else { | ||
209 | // else temporarily install default SIGCHLD handler | ||
210 | // while GStreamer initialises | ||
211 | tmpact.sa_handler = SIG_DFL; | ||
212 | sigemptyset( &tmpact.sa_mask ); | ||
213 | tmpact.sa_flags = SA_SIGINFO; | ||
214 | sigaction(SIGCHLD, &tmpact, &oldact); | ||
215 | } | ||
216 | #endif // LL_LINUX | ||
192 | 217 | ||
193 | // Protect against GStreamer resetting the locale, yuck. | 218 | // Protect against GStreamer resetting the locale, yuck. |
194 | static std::string saved_locale; | 219 | static std::string saved_locale; |
195 | saved_locale = setlocale(LC_ALL, NULL); | 220 | saved_locale = setlocale(LC_ALL, NULL); |
196 | if (0 == llgst_init_check(NULL, NULL, NULL)) | 221 | |
222 | // finally, try to initialize GStreamer! | ||
223 | GError *err = NULL; | ||
224 | gboolean init_gst_success = llgst_init_check(NULL, NULL, &err); | ||
225 | |||
226 | // restore old locale | ||
227 | setlocale(LC_ALL, saved_locale.c_str() ); | ||
228 | |||
229 | #if LL_LINUX | ||
230 | // restore old SIGCHLD handler | ||
231 | if (!llgst_registry_fork_set_enabled) | ||
232 | sigaction(SIGCHLD, &oldact, NULL); | ||
233 | #endif // LL_LINUX | ||
234 | |||
235 | if (!init_gst_success) // fail | ||
197 | { | 236 | { |
198 | WARNMSG("GST init failed for unspecified reason."); | 237 | if (err) |
199 | setlocale(LC_ALL, saved_locale.c_str() ); | 238 | { |
239 | WARNMSG("GST init failed: %s", err->message); | ||
240 | g_error_free(err); | ||
241 | } | ||
242 | else | ||
243 | { | ||
244 | WARNMSG("GST init failed for unspecified reason."); | ||
245 | } | ||
200 | return false; | 246 | return false; |
201 | } | 247 | } |
202 | setlocale(LC_ALL, saved_locale.c_str() ); | ||
203 | 248 | ||
204 | // Init our custom plugins - only really need do this once. | 249 | // Init our custom plugins - only really need do this once. |
205 | gst_slvideo_init_class(); | 250 | gst_slvideo_init_class(); |
206 | #if 0 | ||
207 | gst_slsound_init_class(); | ||
208 | #endif | ||
209 | 251 | ||
210 | done_init = true; | 252 | mDoneInit = true; |
211 | } | 253 | } |
212 | 254 | ||
213 | return true; | 255 | return true; |
@@ -217,6 +259,9 @@ startup ( LLMediaManagerData* init_data ) | |||
217 | bool LLMediaImplGStreamer:: | 259 | bool LLMediaImplGStreamer:: |
218 | closedown() | 260 | closedown() |
219 | { | 261 | { |
262 | if (!mDoneInit) | ||
263 | return false; // error | ||
264 | |||
220 | ungrab_gst_syms(); | 265 | ungrab_gst_syms(); |
221 | 266 | ||
222 | return true; | 267 | return true; |
@@ -240,12 +285,15 @@ static char* get_gst_state_name(GstState state) | |||
240 | } | 285 | } |
241 | #endif // LL_GST_REPORT_STATE_CHANGES | 286 | #endif // LL_GST_REPORT_STATE_CHANGES |
242 | 287 | ||
243 | //static | 288 | extern "C" { |
244 | gboolean | 289 | gboolean |
245 | LLMediaImplGStreamer::bus_callback (GstBus *bus, | 290 | llmediaimplgstreamer_bus_callback (GstBus *bus, |
246 | GstMessage *message, | 291 | GstMessage *message, |
247 | gpointer data) | 292 | gpointer data) |
248 | { | 293 | { |
294 | if (!message) | ||
295 | return TRUE; // shield against GStreamer bug | ||
296 | |||
249 | if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED && | 297 | if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_STATE_CHANGED && |
250 | GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING) | 298 | GST_MESSAGE_TYPE(message) != GST_MESSAGE_BUFFERING) |
251 | { | 299 | { |
@@ -352,10 +400,35 @@ LLMediaImplGStreamer::bus_callback (GstBus *bus, | |||
352 | if (impl->isLooping()) | 400 | if (impl->isLooping()) |
353 | { | 401 | { |
354 | DEBUGMSG("looping media..."); | 402 | DEBUGMSG("looping media..."); |
355 | impl->stop(); | 403 | double eos_pos_sec = 0.0F; |
356 | impl->play(); | 404 | bool got_eos_position = impl->getTimePos(eos_pos_sec); |
405 | |||
406 | if (got_eos_position && eos_pos_sec < impl->MIN_LOOP_SEC) | ||
407 | { | ||
408 | // if we know that the movie is really short, don't | ||
409 | // loop it else it can easily become a time-hog | ||
410 | // because of GStreamer spin-up overhead | ||
411 | DEBUGMSG("really short movie (%0.3fsec) - not gonna loop this, pausing instead.", eos_pos_sec); | ||
412 | // inject a COMMAND_PAUSE | ||
413 | impl->addCommand(LLMediaBase::COMMAND_PAUSE); | ||
414 | } | ||
415 | else | ||
416 | { | ||
417 | // first try looping by an explicit rewind | ||
418 | bool seeksuccess = impl->seek(0.0); | ||
419 | if (seeksuccess) | ||
420 | { | ||
421 | impl->play(); | ||
422 | } | ||
423 | else // use clumsy stop-start to loop | ||
424 | { | ||
425 | DEBUGMSG("couldn't loop by rewinding - stopping and starting instead..."); | ||
426 | impl->stop(); | ||
427 | impl->play(); | ||
428 | } | ||
429 | } | ||
357 | } | 430 | } |
358 | else | 431 | else // not a looping media |
359 | { | 432 | { |
360 | // inject a COMMAND_STOP | 433 | // inject a COMMAND_STOP |
361 | impl->addCommand(LLMediaBase::COMMAND_STOP); | 434 | impl->addCommand(LLMediaBase::COMMAND_STOP); |
@@ -372,6 +445,7 @@ LLMediaImplGStreamer::bus_callback (GstBus *bus, | |||
372 | */ | 445 | */ |
373 | return TRUE; | 446 | return TRUE; |
374 | } | 447 | } |
448 | } // extern "C" | ||
375 | 449 | ||
376 | /////////////////////////////////////////////////////////// | 450 | /////////////////////////////////////////////////////////// |
377 | // virtual | 451 | // virtual |
@@ -379,15 +453,15 @@ bool | |||
379 | LLMediaImplGStreamer:: | 453 | LLMediaImplGStreamer:: |
380 | navigateTo ( const std::string urlIn ) | 454 | navigateTo ( const std::string urlIn ) |
381 | { | 455 | { |
456 | if (!mDoneInit) | ||
457 | return false; // error | ||
458 | |||
382 | DEBUGMSG("Setting media URI: %s", urlIn.c_str()); | 459 | DEBUGMSG("Setting media URI: %s", urlIn.c_str()); |
383 | 460 | ||
384 | if (NULL == mPump | 461 | if (NULL == mPump || |
385 | #ifdef LL_GST_SOUNDSINK | 462 | NULL == mPlaybin) |
386 | || NULL == mAudioSink | ||
387 | #endif | ||
388 | || NULL == mPlaybin) | ||
389 | { | 463 | { |
390 | return false; | 464 | return false; // error |
391 | } | 465 | } |
392 | 466 | ||
393 | setStatus( LLMediaBase::STATUS_NAVIGATING ); | 467 | setStatus( LLMediaBase::STATUS_NAVIGATING ); |
@@ -396,15 +470,6 @@ navigateTo ( const std::string urlIn ) | |||
396 | g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL); | 470 | g_object_set (G_OBJECT (mPlaybin), "uri", urlIn.c_str(), NULL); |
397 | //g_object_set (G_OBJECT (mPlaybin), "uri", "file:///tmp/movie", NULL); | 471 | //g_object_set (G_OBJECT (mPlaybin), "uri", "file:///tmp/movie", NULL); |
398 | 472 | ||
399 | // get playbin's bus - perhaps this can/should be done in ctor | ||
400 | GstBus *bus = llgst_pipeline_get_bus (GST_PIPELINE (mPlaybin)); | ||
401 | if (!bus) | ||
402 | { | ||
403 | return false; | ||
404 | } | ||
405 | llgst_bus_add_watch (bus, bus_callback, this); | ||
406 | llgst_object_unref (bus); | ||
407 | |||
408 | // navigateTo implicitly plays, too. | 473 | // navigateTo implicitly plays, too. |
409 | play(); | 474 | play(); |
410 | 475 | ||
@@ -417,7 +482,14 @@ bool | |||
417 | LLMediaImplGStreamer:: | 482 | LLMediaImplGStreamer:: |
418 | unload () | 483 | unload () |
419 | { | 484 | { |
485 | if (!mDoneInit) | ||
486 | return false; // error | ||
487 | |||
420 | DEBUGMSG("unloading media..."); | 488 | DEBUGMSG("unloading media..."); |
489 | |||
490 | // stop getting callbacks for this bus | ||
491 | g_source_remove(mBusWatchID); | ||
492 | |||
421 | if (mPlaybin) | 493 | if (mPlaybin) |
422 | { | 494 | { |
423 | llgst_element_set_state (mPlaybin, GST_STATE_NULL); | 495 | llgst_element_set_state (mPlaybin, GST_STATE_NULL); |
@@ -433,7 +505,7 @@ unload () | |||
433 | 505 | ||
434 | if (mediaData) | 506 | if (mediaData) |
435 | { | 507 | { |
436 | delete mediaData; | 508 | delete [] mediaData; |
437 | mediaData = NULL; | 509 | mediaData = NULL; |
438 | } | 510 | } |
439 | 511 | ||
@@ -448,14 +520,14 @@ bool | |||
448 | LLMediaImplGStreamer:: | 520 | LLMediaImplGStreamer:: |
449 | updateMedia () | 521 | updateMedia () |
450 | { | 522 | { |
523 | if (!mDoneInit) | ||
524 | return false; // error | ||
525 | |||
451 | DEBUGMSG("updating media..."); | 526 | DEBUGMSG("updating media..."); |
452 | 527 | ||
453 | // sanity check | 528 | // sanity check |
454 | if (NULL == mPump | 529 | if (NULL == mPump || |
455 | #ifdef LL_GST_SOUNDSINK | 530 | NULL == mPlaybin) |
456 | || NULL == mAudioSink | ||
457 | #endif | ||
458 | || NULL == mPlaybin) | ||
459 | { | 531 | { |
460 | DEBUGMSG("dead media..."); | 532 | DEBUGMSG("dead media..."); |
461 | return false; | 533 | return false; |
@@ -517,7 +589,7 @@ updateMedia () | |||
517 | mVideoSink->retained_frame_height != getMediaHeight()) | 589 | mVideoSink->retained_frame_height != getMediaHeight()) |
518 | // *TODO: also check for change in format | 590 | // *TODO: also check for change in format |
519 | { | 591 | { |
520 | // just resize containe | 592 | // just resize container |
521 | int neww = mVideoSink->retained_frame_width; | 593 | int neww = mVideoSink->retained_frame_width; |
522 | int newh = mVideoSink->retained_frame_height; | 594 | int newh = mVideoSink->retained_frame_height; |
523 | int newd = SLVPixelFormatBytes[mVideoSink->retained_frame_format]; | 595 | int newd = SLVPixelFormatBytes[mVideoSink->retained_frame_format]; |
@@ -621,12 +693,12 @@ LLMediaImplGStreamer:: | |||
621 | seek( double time ) | 693 | seek( double time ) |
622 | { | 694 | { |
623 | bool success = false; | 695 | bool success = false; |
624 | if (mPlaybin) | 696 | if (mDoneInit && mPlaybin) |
625 | { | 697 | { |
626 | success = llgst_element_seek(mPlaybin, 1.0F, GST_FORMAT_TIME, | 698 | success = llgst_element_seek(mPlaybin, 1.0F, GST_FORMAT_TIME, |
627 | GstSeekFlags(GST_SEEK_FLAG_FLUSH | | 699 | GstSeekFlags(GST_SEEK_FLAG_FLUSH | |
628 | GST_SEEK_FLAG_KEY_UNIT), | 700 | GST_SEEK_FLAG_KEY_UNIT), |
629 | GST_SEEK_TYPE_SET, gint64(time*1000000000.0F), | 701 | GST_SEEK_TYPE_SET, gint64(time*GST_SECOND), |
630 | GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); | 702 | GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); |
631 | } | 703 | } |
632 | DEBUGMSG("MEDIA SEEK REQUEST to %fsec result was %d", | 704 | DEBUGMSG("MEDIA SEEK REQUEST to %fsec result was %d", |
@@ -634,6 +706,49 @@ seek( double time ) | |||
634 | return success; | 706 | return success; |
635 | } | 707 | } |
636 | 708 | ||
709 | bool | ||
710 | LLMediaImplGStreamer:: | ||
711 | getTimePos(double &sec_out) | ||
712 | { | ||
713 | bool got_position = false; | ||
714 | if (mPlaybin) | ||
715 | { | ||
716 | gint64 pos; | ||
717 | GstFormat timefmt = GST_FORMAT_TIME; | ||
718 | got_position = | ||
719 | llgst_element_query_position && | ||
720 | llgst_element_query_position(mPlaybin, | ||
721 | &timefmt, | ||
722 | &pos); | ||
723 | got_position = got_position | ||
724 | && (timefmt == GST_FORMAT_TIME); | ||
725 | // GStreamer may have other ideas, but we consider the current position | ||
726 | // undefined if not PLAYING or PAUSED | ||
727 | got_position = got_position && | ||
728 | (GST_STATE(mPlaybin) == GST_STATE_PLAYING || | ||
729 | GST_STATE(mPlaybin) == GST_STATE_PAUSED); | ||
730 | if (got_position && !GST_CLOCK_TIME_IS_VALID(pos)) | ||
731 | { | ||
732 | if (GST_STATE(mPlaybin) == GST_STATE_PLAYING) | ||
733 | { | ||
734 | // if we're playing then we treat an invalid clock time | ||
735 | // as 0, for complicated reasons (insert reason here) | ||
736 | pos = 0; | ||
737 | } | ||
738 | else | ||
739 | { | ||
740 | got_position = false; | ||
741 | } | ||
742 | |||
743 | } | ||
744 | // If all the preconditions succeeded... we can trust the result. | ||
745 | if (got_position) | ||
746 | { | ||
747 | sec_out = double(pos) / double(GST_SECOND); // gst to sec | ||
748 | } | ||
749 | } | ||
750 | return got_position; | ||
751 | } | ||
637 | 752 | ||
638 | /////////////////////////////////////////////////////////////////////////////// | 753 | /////////////////////////////////////////////////////////////////////////////// |
639 | // virtual | 754 | // virtual |
@@ -648,7 +763,7 @@ setVolume(float volume) | |||
648 | return true; // nothing to do, everything's fine | 763 | return true; // nothing to do, everything's fine |
649 | 764 | ||
650 | mVolume = volume; | 765 | mVolume = volume; |
651 | if (mPlaybin) | 766 | if (mDoneInit && mPlaybin) |
652 | { | 767 | { |
653 | g_object_set(mPlaybin, "volume", mVolume, NULL); | 768 | g_object_set(mPlaybin, "volume", mVolume, NULL); |
654 | return true; | 769 | return true; |
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h index f1ffd3a..07b698d 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.h +++ b/linden/indra/llmedia/llmediaimplgstreamer.h | |||
@@ -18,7 +18,8 @@ | |||
18 | * There are special exceptions to the terms and conditions of the GPL as | 18 | * There are special exceptions to the terms and conditions of the GPL as |
19 | * it is applied to this Source Code. View the full text of the exception | 19 | * it is applied to this Source Code. View the full text of the exception |
20 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 20 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
21 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 21 | * online at |
22 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
22 | * | 23 | * |
23 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
24 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
@@ -48,9 +49,6 @@ extern "C" { | |||
48 | } | 49 | } |
49 | 50 | ||
50 | #include "llmediaimplgstreamervidplug.h" | 51 | #include "llmediaimplgstreamervidplug.h" |
51 | #ifdef LL_GST_SOUNDSINK | ||
52 | #include "llmediaimplgstreamersndplug.h" | ||
53 | #endif // LL_GST_SOUNDSINK | ||
54 | 52 | ||
55 | class LLMediaManagerData; | 53 | class LLMediaManagerData; |
56 | class LLMediaImplMaker; | 54 | class LLMediaImplMaker; |
@@ -81,30 +79,38 @@ class LLMediaImplGStreamer: | |||
81 | 79 | ||
82 | LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;}; | 80 | LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;}; |
83 | 81 | ||
84 | private: | ||
85 | // misc | 82 | // misc |
86 | bool unload(); | ||
87 | bool pause(); | 83 | bool pause(); |
88 | bool stop(); | 84 | bool stop(); |
89 | bool play(); | 85 | bool play(); |
90 | static gboolean bus_callback (GstBus *bus, | 86 | bool getTimePos(double &sec_out); |
91 | GstMessage *message, | 87 | static const double MIN_LOOP_SEC = 1.0F; |
92 | gpointer data); | 88 | |
89 | private: | ||
90 | bool unload(); | ||
91 | |||
92 | static bool mDoneInit; | ||
93 | |||
94 | guint mBusWatchID; | ||
95 | |||
93 | unsigned char* mediaData; | 96 | unsigned char* mediaData; |
94 | int mMediaRowbytes; | 97 | int mMediaRowbytes; |
95 | 98 | ||
96 | int mTextureFormatPrimary; | 99 | int mTextureFormatPrimary; |
97 | int mTextureFormatType; | 100 | int mTextureFormatType; |
98 | 101 | ||
99 | // GStreamer-specific | 102 | // Very GStreamer-specific |
100 | GMainLoop *mPump; // event pump for this media | 103 | GMainLoop *mPump; // event pump for this media |
101 | GstElement *mPlaybin; | 104 | GstElement *mPlaybin; |
102 | GstSLVideo *mVideoSink; | 105 | GstSLVideo *mVideoSink; |
103 | #ifdef LL_GST_SOUNDSINK | ||
104 | GstSLSound *mAudioSink; | ||
105 | #endif // LL_GST_SOUNDSINK | ||
106 | }; | 106 | }; |
107 | 107 | ||
108 | extern "C" { | ||
109 | gboolean llmediaimplgstreamer_bus_callback (GstBus *bus, | ||
110 | GstMessage *message, | ||
111 | gpointer data); | ||
112 | } | ||
113 | |||
108 | class LLMediaImplGStreamerMaker : public LLMediaImplMaker | 114 | class LLMediaImplGStreamerMaker : public LLMediaImplMaker |
109 | { | 115 | { |
110 | public: | 116 | public: |
diff --git a/linden/indra/llmedia/llmediaimplgstreamer_syms.cpp b/linden/indra/llmedia/llmediaimplgstreamer_syms.cpp index 20ee00b..db26dda 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer_syms.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer_syms.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -42,21 +43,28 @@ extern "C" { | |||
42 | 43 | ||
43 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) RTN (*ll##GSTSYM)(__VA_ARGS__) = NULL | 44 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) RTN (*ll##GSTSYM)(__VA_ARGS__) = NULL |
44 | #include "llmediaimplgstreamer_syms_raw.inc" | 45 | #include "llmediaimplgstreamer_syms_raw.inc" |
45 | #include "llmediaimplgstreamer_syms_rawa.inc" | ||
46 | #include "llmediaimplgstreamer_syms_rawv.inc" | 46 | #include "llmediaimplgstreamer_syms_rawv.inc" |
47 | #undef LL_GST_SYM | 47 | #undef LL_GST_SYM |
48 | 48 | ||
49 | // a couple of stubs for disgusting reasons | ||
50 | GstDebugCategory* | ||
51 | ll_gst_debug_category_new(gchar *name, guint color, gchar *description) | ||
52 | { | ||
53 | static GstDebugCategory dummy; | ||
54 | return &dummy; | ||
55 | } | ||
56 | void ll_gst_debug_register_funcptr(GstDebugFuncPtr func, gchar* ptrname) | ||
57 | { | ||
58 | } | ||
49 | 59 | ||
50 | static bool sSymsGrabbed = false; | 60 | static bool sSymsGrabbed = false; |
51 | static apr_pool_t *sSymGSTDSOMemoryPool = NULL; | 61 | static apr_pool_t *sSymGSTDSOMemoryPool = NULL; |
52 | static apr_dso_handle_t *sSymGSTDSOHandleG = NULL; | 62 | static apr_dso_handle_t *sSymGSTDSOHandleG = NULL; |
53 | static apr_dso_handle_t *sSymGSTDSOHandleV = NULL; | 63 | static apr_dso_handle_t *sSymGSTDSOHandleV = NULL; |
54 | static apr_dso_handle_t *sSymGSTDSOHandleA = NULL; | ||
55 | 64 | ||
56 | 65 | ||
57 | bool grab_gst_syms(std::string gst_dso_name, | 66 | bool grab_gst_syms(std::string gst_dso_name, |
58 | std::string gst_dso_name_vid, | 67 | std::string gst_dso_name_vid) |
59 | std::string gst_dso_name_aud) | ||
60 | { | 68 | { |
61 | if (sSymsGrabbed) | 69 | if (sSymsGrabbed) |
62 | { | 70 | { |
@@ -87,40 +95,20 @@ bool grab_gst_syms(std::string gst_dso_name, | |||
87 | sSymGSTDSOHandle = NULL; | 95 | sSymGSTDSOHandle = NULL; |
88 | } | 96 | } |
89 | 97 | ||
90 | if ( APR_SUCCESS == (rv = apr_dso_load(&sSymGSTDSOHandle, | 98 | if ( APR_SUCCESS == |
91 | gst_dso_name_aud.c_str(), | 99 | (rv = apr_dso_load(&sSymGSTDSOHandle, |
92 | sSymGSTDSOMemoryPool) )) | 100 | gst_dso_name_vid.c_str(), |
101 | sSymGSTDSOMemoryPool) )) | ||
93 | { | 102 | { |
94 | INFOMSG("Found DSO: %s", gst_dso_name_aud.c_str()); | 103 | INFOMSG("Found DSO: %s", gst_dso_name_vid.c_str()); |
95 | #include "llmediaimplgstreamer_syms_rawa.inc" | ||
96 | |||
97 | if ( sSymGSTDSOHandle ) | ||
98 | { | ||
99 | sSymGSTDSOHandleA = sSymGSTDSOHandle; | ||
100 | sSymGSTDSOHandle = NULL; | ||
101 | } | ||
102 | |||
103 | if ( APR_SUCCESS == | ||
104 | (rv = apr_dso_load(&sSymGSTDSOHandle, | ||
105 | gst_dso_name_vid.c_str(), | ||
106 | sSymGSTDSOMemoryPool) )) | ||
107 | { | ||
108 | INFOMSG("Found DSO: %s", gst_dso_name_vid.c_str()); | ||
109 | #include "llmediaimplgstreamer_syms_rawv.inc" | 104 | #include "llmediaimplgstreamer_syms_rawv.inc" |
110 | } | 105 | rtn = !sym_error; |
111 | else | ||
112 | { | ||
113 | INFOMSG("Couldn't load DSO: %s", gst_dso_name_vid.c_str()); | ||
114 | rtn = false; // failure | ||
115 | } | ||
116 | } | 106 | } |
117 | else | 107 | else |
118 | { | 108 | { |
119 | INFOMSG("Couldn't load DSO: %s", gst_dso_name_aud.c_str()); | 109 | INFOMSG("Couldn't load DSO: %s", gst_dso_name_vid.c_str()); |
120 | rtn = false; // failure | 110 | rtn = false; // failure |
121 | } | 111 | } |
122 | |||
123 | rtn = !sym_error; | ||
124 | } | 112 | } |
125 | else | 113 | else |
126 | { | 114 | { |
@@ -156,12 +144,6 @@ void ungrab_gst_syms() | |||
156 | sSymGSTDSOHandleG = NULL; | 144 | sSymGSTDSOHandleG = NULL; |
157 | } | 145 | } |
158 | 146 | ||
159 | if ( sSymGSTDSOHandleA ) | ||
160 | { | ||
161 | apr_dso_unload(sSymGSTDSOHandleA); | ||
162 | sSymGSTDSOHandleA = NULL; | ||
163 | } | ||
164 | |||
165 | if ( sSymGSTDSOHandleV ) | 147 | if ( sSymGSTDSOHandleV ) |
166 | { | 148 | { |
167 | apr_dso_unload(sSymGSTDSOHandleV); | 149 | apr_dso_unload(sSymGSTDSOHandleV); |
@@ -177,7 +159,6 @@ void ungrab_gst_syms() | |||
177 | // NULL-out all of the symbols we'd grabbed | 159 | // NULL-out all of the symbols we'd grabbed |
178 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) do{ll##GSTSYM = NULL;}while(0) | 160 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) do{ll##GSTSYM = NULL;}while(0) |
179 | #include "llmediaimplgstreamer_syms_raw.inc" | 161 | #include "llmediaimplgstreamer_syms_raw.inc" |
180 | #include "llmediaimplgstreamer_syms_rawa.inc" | ||
181 | #include "llmediaimplgstreamer_syms_rawv.inc" | 162 | #include "llmediaimplgstreamer_syms_rawv.inc" |
182 | #undef LL_GST_SYM | 163 | #undef LL_GST_SYM |
183 | 164 | ||
diff --git a/linden/indra/llmedia/llmediaimplgstreamer_syms.h b/linden/indra/llmedia/llmediaimplgstreamer_syms.h index 6957b1c..4220bdb 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer_syms.h +++ b/linden/indra/llmedia/llmediaimplgstreamer_syms.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -38,13 +39,11 @@ extern "C" { | |||
38 | } | 39 | } |
39 | 40 | ||
40 | bool grab_gst_syms(std::string gst_dso_name, | 41 | bool grab_gst_syms(std::string gst_dso_name, |
41 | std::string gst_dso_name_vid, | 42 | std::string gst_dso_name_vid); |
42 | std::string gst_dso_name_aud); | ||
43 | void ungrab_gst_syms(); | 43 | void ungrab_gst_syms(); |
44 | 44 | ||
45 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) extern RTN (*ll##GSTSYM)(__VA_ARGS__) | 45 | #define LL_GST_SYM(REQ, GSTSYM, RTN, ...) extern RTN (*ll##GSTSYM)(__VA_ARGS__) |
46 | #include "llmediaimplgstreamer_syms_raw.inc" | 46 | #include "llmediaimplgstreamer_syms_raw.inc" |
47 | #include "llmediaimplgstreamer_syms_rawa.inc" | ||
48 | #include "llmediaimplgstreamer_syms_rawv.inc" | 47 | #include "llmediaimplgstreamer_syms_rawv.inc" |
49 | #undef LL_GST_SYM | 48 | #undef LL_GST_SYM |
50 | 49 | ||
@@ -61,12 +60,13 @@ void ungrab_gst_syms(); | |||
61 | #define GST_TYPE_PIPELINE (llgst_pipeline_get_type()) | 60 | #define GST_TYPE_PIPELINE (llgst_pipeline_get_type()) |
62 | #undef GST_TYPE_ELEMENT | 61 | #undef GST_TYPE_ELEMENT |
63 | #define GST_TYPE_ELEMENT (llgst_element_get_type()) | 62 | #define GST_TYPE_ELEMENT (llgst_element_get_type()) |
64 | #undef GST_TYPE_AUDIO_SINK | ||
65 | #define GST_TYPE_AUDIO_SINK (llgst_audio_sink_get_type()) | ||
66 | #undef GST_TYPE_VIDEO_SINK | 63 | #undef GST_TYPE_VIDEO_SINK |
67 | #define GST_TYPE_VIDEO_SINK (llgst_video_sink_get_type()) | 64 | #define GST_TYPE_VIDEO_SINK (llgst_video_sink_get_type()) |
65 | // more regrettable hacks to stub-out these .h-exposed GStreamer internals | ||
66 | void ll_gst_debug_register_funcptr(GstDebugFuncPtr func, gchar* ptrname); | ||
68 | #undef _gst_debug_register_funcptr | 67 | #undef _gst_debug_register_funcptr |
69 | #define _gst_debug_register_funcptr ll_gst_debug_register_funcptr | 68 | #define _gst_debug_register_funcptr ll_gst_debug_register_funcptr |
69 | GstDebugCategory* ll_gst_debug_category_new(gchar *name, guint color, gchar *description); | ||
70 | #undef _gst_debug_category_new | 70 | #undef _gst_debug_category_new |
71 | #define _gst_debug_category_new ll_gst_debug_category_new | 71 | #define _gst_debug_category_new ll_gst_debug_category_new |
72 | #undef __gst_debug_enabled | 72 | #undef __gst_debug_enabled |
diff --git a/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc b/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc index 08ba6df..b81872a 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc +++ b/linden/indra/llmedia/llmediaimplgstreamer_syms_raw.inc | |||
@@ -19,8 +19,6 @@ LL_GST_SYM(true, gst_element_class_add_pad_template, void, GstElementClass *klas | |||
19 | LL_GST_SYM(true, gst_element_class_set_details, void, GstElementClass *klass, const GstElementDetails *details); | 19 | LL_GST_SYM(true, gst_element_class_set_details, void, GstElementClass *klass, const GstElementDetails *details); |
20 | LL_GST_SYM(true, gst_caps_unref, void, GstCaps* caps); | 20 | LL_GST_SYM(true, gst_caps_unref, void, GstCaps* caps); |
21 | LL_GST_SYM(true, gst_caps_ref, GstCaps *, GstCaps* caps); | 21 | LL_GST_SYM(true, gst_caps_ref, GstCaps *, GstCaps* caps); |
22 | LL_GST_SYM(true, _gst_debug_register_funcptr, void, GstDebugFuncPtr func, gchar* ptrname); | ||
23 | LL_GST_SYM(true, _gst_debug_category_new, GstDebugCategory *, gchar *name, guint color, gchar *description); | ||
24 | LL_GST_SYM(true, gst_caps_is_empty, gboolean, const GstCaps *caps); | 22 | LL_GST_SYM(true, gst_caps_is_empty, gboolean, const GstCaps *caps); |
25 | LL_GST_SYM(true, gst_caps_from_string, GstCaps *, const gchar *string); | 23 | LL_GST_SYM(true, gst_caps_from_string, GstCaps *, const gchar *string); |
26 | LL_GST_SYM(true, gst_caps_replace, void, GstCaps **caps, GstCaps *newcaps); | 24 | LL_GST_SYM(true, gst_caps_replace, void, GstCaps **caps, GstCaps *newcaps); |
@@ -37,6 +35,12 @@ LL_GST_SYM(true, gst_structure_get_name, G_CONST_RETURN gchar *, const GstStruct | |||
37 | LL_GST_SYM(true, gst_element_seek, bool, GstElement *, gdouble, GstFormat, GstSeekFlags, GstSeekType, gint64, GstSeekType, gint64); | 35 | LL_GST_SYM(true, gst_element_seek, bool, GstElement *, gdouble, GstFormat, GstSeekFlags, GstSeekType, gint64, GstSeekType, gint64); |
38 | 36 | ||
39 | // optional symbols to grab | 37 | // optional symbols to grab |
38 | LL_GST_SYM(false, gst_registry_fork_set_enabled, void, gboolean enabled); | ||
40 | LL_GST_SYM(false, gst_segtrap_set_enabled, void, gboolean enabled); | 39 | LL_GST_SYM(false, gst_segtrap_set_enabled, void, gboolean enabled); |
41 | LL_GST_SYM(false, gst_message_parse_buffering, void, GstMessage *message, gint *percent); | 40 | LL_GST_SYM(false, gst_message_parse_buffering, void, GstMessage *message, gint *percent); |
42 | LL_GST_SYM(false, gst_message_parse_info, void, GstMessage *message, GError **gerror, gchar **debug); | 41 | LL_GST_SYM(false, gst_message_parse_info, void, GstMessage *message, GError **gerror, gchar **debug); |
42 | LL_GST_SYM(false, gst_element_query_position, gboolean, GstElement *element, GstFormat *format, gint64 *cur); | ||
43 | |||
44 | // GStreamer 'internal' symbols which may not be visible in some runtimes but are still used in expanded GStreamer header macros - yuck! We'll substitute our own stubs for these. | ||
45 | //LL_GST_SYM(true, _gst_debug_register_funcptr, void, GstDebugFuncPtr func, gchar* ptrname); | ||
46 | //LL_GST_SYM(true, _gst_debug_category_new, GstDebugCategory *, gchar *name, guint color, gchar *description); | ||
diff --git a/linden/indra/llmedia/llmediaimplgstreamer_syms_rawa.inc b/linden/indra/llmedia/llmediaimplgstreamer_syms_rawa.inc deleted file mode 100644 index 0be99b5..0000000 --- a/linden/indra/llmedia/llmediaimplgstreamer_syms_rawa.inc +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | |||
2 | // required symbols to grab | ||
3 | LL_GST_SYM(true, gst_audio_sink_get_type, GType, void); | ||
4 | |||
5 | // optional symbols to grab | ||
diff --git a/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp b/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp index dc3fe61..5e96666 100644 --- a/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamervidplug.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -81,10 +82,10 @@ static void | |||
81 | gst_slvideo_base_init (gpointer gclass) | 82 | gst_slvideo_base_init (gpointer gclass) |
82 | { | 83 | { |
83 | static GstElementDetails element_details = { | 84 | static GstElementDetails element_details = { |
84 | "PluginTemplate", | 85 | (gchar*)"PluginTemplate", |
85 | "Generic/PluginTemplate", | 86 | (gchar*)"Generic/PluginTemplate", |
86 | "Generic Template Element", | 87 | (gchar*)"Generic Template Element", |
87 | "Linden Lab" | 88 | (gchar*)"Linden Lab" |
88 | }; | 89 | }; |
89 | GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); | 90 | GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); |
90 | 91 | ||
@@ -317,14 +318,6 @@ gst_slvideo_stop (GstBaseSink * bsink) | |||
317 | } | 318 | } |
318 | 319 | ||
319 | 320 | ||
320 | static gboolean | ||
321 | gst_slvideo_unlock (GstBaseSink * bsink) | ||
322 | { | ||
323 | // nothing really to do here. | ||
324 | return TRUE; | ||
325 | } | ||
326 | |||
327 | |||
328 | /* initialize the plugin's class */ | 321 | /* initialize the plugin's class */ |
329 | static void | 322 | static void |
330 | gst_slvideo_class_init (GstSLVideoClass * klass) | 323 | gst_slvideo_class_init (GstSLVideoClass * klass) |
@@ -343,17 +336,19 @@ gst_slvideo_class_init (GstSLVideoClass * klass) | |||
343 | 336 | ||
344 | gstelement_class->change_state = gst_slvideo_change_state; | 337 | gstelement_class->change_state = gst_slvideo_change_state; |
345 | 338 | ||
346 | gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_slvideo_get_caps); | 339 | #define LLGST_DEBUG_FUNCPTR(p) (p) |
347 | gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR( gst_slvideo_set_caps); | 340 | gstbasesink_class->get_caps = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_caps); |
348 | //gstbasesink_class->buffer_alloc=GST_DEBUG_FUNCPTR(gst_slvideo_buffer_alloc); | 341 | gstbasesink_class->set_caps = LLGST_DEBUG_FUNCPTR( gst_slvideo_set_caps); |
349 | //gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_slvideo_get_times); | 342 | //gstbasesink_class->buffer_alloc=LLGST_DEBUG_FUNCPTR(gst_slvideo_buffer_alloc); |
350 | gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_slvideo_show_frame); | 343 | //gstbasesink_class->get_times = LLGST_DEBUG_FUNCPTR (gst_slvideo_get_times); |
351 | gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_slvideo_show_frame); | 344 | gstbasesink_class->preroll = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame); |
345 | gstbasesink_class->render = LLGST_DEBUG_FUNCPTR (gst_slvideo_show_frame); | ||
352 | 346 | ||
353 | gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_slvideo_start); | 347 | gstbasesink_class->start = LLGST_DEBUG_FUNCPTR (gst_slvideo_start); |
354 | gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_slvideo_stop); | 348 | gstbasesink_class->stop = LLGST_DEBUG_FUNCPTR (gst_slvideo_stop); |
355 | 349 | ||
356 | gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_slvideo_unlock); | 350 | // gstbasesink_class->unlock = LLGST_DEBUG_FUNCPTR (gst_slvideo_unlock); |
351 | #undef LLGST_DEBUG_FUNCPTR | ||
357 | } | 352 | } |
358 | 353 | ||
359 | 354 | ||
@@ -433,8 +428,8 @@ plugin_init (GstPlugin * plugin) | |||
433 | { | 428 | { |
434 | //fprintf(stderr, "\n\n\nPLUGIN INIT\n\n\n"); | 429 | //fprintf(stderr, "\n\n\nPLUGIN INIT\n\n\n"); |
435 | 430 | ||
436 | GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, "private-slvideo-plugin", | 431 | GST_DEBUG_CATEGORY_INIT (gst_slvideo_debug, (gchar*)"private-slvideo-plugin", |
437 | 0, "Second Life Video Sink"); | 432 | 0, (gchar*)"Second Life Video Sink"); |
438 | 433 | ||
439 | return llgst_element_register (plugin, "private-slvideo", | 434 | return llgst_element_register (plugin, "private-slvideo", |
440 | GST_RANK_NONE, GST_TYPE_SLVIDEO); | 435 | GST_RANK_NONE, GST_TYPE_SLVIDEO); |
diff --git a/linden/indra/llmedia/llmediaimplgstreamervidplug.h b/linden/indra/llmedia/llmediaimplgstreamervidplug.h index 660d261..3db064c 100644 --- a/linden/indra/llmedia/llmediaimplgstreamervidplug.h +++ b/linden/indra/llmedia/llmediaimplgstreamervidplug.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplllmozlib.cpp b/linden/indra/llmedia/llmediaimplllmozlib.cpp index 05d7220..689d4b4 100644 --- a/linden/indra/llmedia/llmediaimplllmozlib.cpp +++ b/linden/indra/llmedia/llmediaimplllmozlib.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplllmozlib.h b/linden/indra/llmedia/llmediaimplllmozlib.h index 18b1c6a..f71300e 100644 --- a/linden/indra/llmedia/llmediaimplllmozlib.h +++ b/linden/indra/llmedia/llmediaimplllmozlib.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplquicktime.cpp b/linden/indra/llmedia/llmediaimplquicktime.cpp index 5bd530d..76cacee 100644 --- a/linden/indra/llmedia/llmediaimplquicktime.cpp +++ b/linden/indra/llmedia/llmediaimplquicktime.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplquicktime.h b/linden/indra/llmedia/llmediaimplquicktime.h index c8de1dd..d4e1db8 100644 --- a/linden/indra/llmedia/llmediaimplquicktime.h +++ b/linden/indra/llmedia/llmediaimplquicktime.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaimplregister.h b/linden/indra/llmedia/llmediaimplregister.h index fcc3ab7..5191274 100644 --- a/linden/indra/llmedia/llmediaimplregister.h +++ b/linden/indra/llmedia/llmediaimplregister.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediamanager.cpp b/linden/indra/llmedia/llmediamanager.cpp index 6db8dbe..e1c7608 100644 --- a/linden/indra/llmedia/llmediamanager.cpp +++ b/linden/indra/llmedia/llmediamanager.cpp | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
@@ -150,8 +151,10 @@ LLMediaManager* LLMediaManager::getInstance() | |||
150 | // (static) | 151 | // (static) |
151 | void LLMediaManager::setBrowserUserAgent(std::string user_agent) | 152 | void LLMediaManager::setBrowserUserAgent(std::string user_agent) |
152 | { | 153 | { |
154 | #if LL_LLMOZLIB_ENABLED | ||
153 | // *HACK: Breaks encapsulation model, as initClass does above. JC | 155 | // *HACK: Breaks encapsulation model, as initClass does above. JC |
154 | LLMediaImplLLMozLib::setBrowserUserAgent(user_agent); | 156 | LLMediaImplLLMozLib::setBrowserUserAgent(user_agent); |
157 | #endif // LL_LLMOZLIB_ENABLED | ||
155 | } | 158 | } |
156 | 159 | ||
157 | //////////////////////////////////////////////////////////////////////////////// | 160 | //////////////////////////////////////////////////////////////////////////////// |
diff --git a/linden/indra/llmedia/llmediamanager.h b/linden/indra/llmedia/llmediamanager.h index f618f4c..dc832d5 100644 --- a/linden/indra/llmedia/llmediamanager.h +++ b/linden/indra/llmedia/llmediamanager.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |
diff --git a/linden/indra/llmedia/llmediaobserver.h b/linden/indra/llmedia/llmediaobserver.h index e6da4f6..5f794bb 100644 --- a/linden/indra/llmedia/llmediaobserver.h +++ b/linden/indra/llmedia/llmediaobserver.h | |||
@@ -17,7 +17,8 @@ | |||
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | 20 | * online at |
21 | * http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | 22 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 23 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 24 | * that you have read and understood your obligations described above, |