LLMediaImplGStreamer:: LLMediaImplGStreamer () : mediaData ( NULL ), mMediaRowbytes ( 1 ), mTextureFormatPrimary ( LL_MEDIA_BGRA ), mTextureFormatType ( LL_MEDIA_UNSIGNED_INT_8_8_8_8_REV ), mPump ( NULL ), mPlaybin ( NULL ), mVideoSink ( NULL ) #ifdef LL_GST_SOUNDSINK ,mAudioSink ( NULL ) #endif // LL_GST_SOUNDSINK { DEBUGMSG("constructing media..."); setMediaDepth(4); // Create a pumpable main-loop for this media mPump = g_main_loop_new (NULL, FALSE); if (!mPump) { return; // error } // instantiate a playbin element to do the hard work mPlaybin = llgst_element_factory_make ("playbin", "play"); if (!mPlaybin) { // todo: cleanup pump return; // error } if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) { // instantiate and connect a custom video sink mVideoSink = GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo")); if (!mVideoSink) { WARNMSG("Could not instantiate private-slvideo element."); // todo: cleanup. return; // error } g_object_set(mPlaybin, "video-sink", mVideoSink, NULL); #ifdef LL_GST_SOUNDSINK // instantiate and connect a custom audio sink mAudioSink = GST_SLSOUND(llgst_element_factory_make ("private-slsound", "slsound")); if (!mAudioSink) { WARNMSG("Could not instantiate private-slsound element."); // todo: cleanup. return; // error } g_object_set(mPlaybin, "audio-sink", mAudioSink, NULL); #endif } }
BOOL LLMediaImplGStreamer:: init () { static bool done_init = false; if (!done_init) { // Init the glib type system - we need it. g_type_init(); // Get symbols! if (! grab_gst_syms("libgstreamer-0.10.so.0", "libgstvideo-0.10.so.0", "libgstaudio-0.10.so.0") ) { llwarns << "Couldn't find suitable GStreamer 0.10 support on this system - video playback disabled." << llendl; return FALSE; } if (llgst_segtrap_set_enabled) llgst_segtrap_set_enabled(FALSE); else llwarns << "gst_segtrap_set_enabled() is not available; Second Life automated crash-reporter may cease to function until next restart." << llendl; if (0 == llgst_init_check(NULL, NULL, NULL)) { llwarns << "GST init failed for unspecified reason." << llendl; return FALSE; } // Init our custom plugins - only really need do this once. gst_slvideo_init_class(); #if 0 gst_slsound_init_class(); #endif done_init = true; } mVolume = 0.1234567; // minor hack to force an initial volume update // Create a pumpable main-loop for this media mPump = g_main_loop_new (NULL, FALSE); if (!mPump) { return FALSE; } // instantiate a playbin element to do the hard work mPlaybin = llgst_element_factory_make ("playbin", "play"); if (!mPlaybin) { // todo: cleanup pump return FALSE; } if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) { // instantiate and connect a custom video sink mVideoSink = GST_SLVIDEO(llgst_element_factory_make ("private-slvideo", "slvideo")); if (!mVideoSink) { llwarns << "Could not instantiate private-slvideo element." << llendl; // todo: cleanup. return FALSE; } g_object_set(mPlaybin, "video-sink", mVideoSink, NULL); #ifdef LL_GST_SOUNDSINK // instantiate and connect a custom audio sink mAudioSink = GST_SLSOUND(llgst_element_factory_make ("private-slsound", "slsound")); if (!mAudioSink) { llwarns << "Could not instantiate private-slsound element." << llendl; // todo: cleanup. return FALSE; } g_object_set(mPlaybin, "audio-sink", mAudioSink, NULL); #endif } return LLMediaMovieBase::init(); }