From 88b7e23cebcb943aa2ce160512f4ff7afe3797a5 Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Sat, 4 Apr 2009 00:08:19 -0500 Subject: Refactored the heart of the GST play code to startPlay(). --- linden/indra/llmedia/llmediaimplgstreamer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'linden/indra/llmedia/llmediaimplgstreamer.cpp') diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp index 532ec00..2ba33a1 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp @@ -713,13 +713,18 @@ bool LLMediaImplGStreamer::play() if (!mPlaybin || mState == GST_STATE_NULL) return true; + startPlay(); + + return true; +} + +void LLMediaImplGStreamer::startPlay() +{ GstElement *pipeline = (GstElement *)gst_object_ref(GST_OBJECT(mPlaybin)); gst_object_unref(pipeline); gst_element_set_state(pipeline, GST_STATE_PLAYING); mState = GST_STATE_PLAYING; - /*gst_element_set_state(mPlaybin, GST_STATE_PLAYING); - mState = GST_STATE_PLAYING;*/ GstStateChangeReturn state_change = gst_element_get_state(mPlaybin, NULL, NULL, GST_CLOCK_TIME_NONE); LL_DEBUGS("MediaImpl") << "get_state: " << gst_element_state_change_return_get_name(state_change) << LL_ENDL; @@ -730,8 +735,6 @@ bool LLMediaImplGStreamer::play() setStatus(LLMediaBase::STATUS_STOPPED); stop(); } - - return true; } /////////////////////////////////////////////////////////////////////////////// -- cgit v1.1 From 15296967b6beec8e6f6c5ff4b7e8c274e5d05dca Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Sun, 5 Apr 2009 23:41:16 -0500 Subject: LLMediaImplGStreamer creates new thread for playing. This keeps the viewer responsive while GStreamer does its thing. --- linden/indra/llmedia/llmediaimplgstreamer.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'linden/indra/llmedia/llmediaimplgstreamer.cpp') diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp index 2ba33a1..c8f793d 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp @@ -30,10 +30,12 @@ * $/LicenseInfo$ */ -#include "llmediaimplgstreamer.h" - ///#if LL_GSTREAMER_ENABLED +#include "linden_common.h" + +#include "llmediaimplgstreamer.h" + extern "C" { #include #include @@ -43,9 +45,8 @@ extern "C" { #include "llmediaimplregister.h" #include "llmediaimplgstreamervidplug.h" +#include "llgstplaythread.h" -#include "llerror.h" -#include "linden_common.h" // register this impl with media manager factory static LLMediaImplRegister sLLMediaImplGStreamerReg( "LLMediaImplGStreamer", new LLMediaImplGStreamerMaker() ); @@ -72,7 +73,8 @@ LLMediaImplGStreamer () : mPump ( NULL ), mPlaybin ( NULL ), mVideoSink ( NULL ), - mState( GST_STATE_NULL ) + mState( GST_STATE_NULL ), + mPlayThread ( NULL ) { startup( NULL ); // Startup gstreamer if it hasn't been already. @@ -713,7 +715,20 @@ bool LLMediaImplGStreamer::play() if (!mPlaybin || mState == GST_STATE_NULL) return true; - startPlay(); + // Clean up the existing thread, if any. + if( mPlayThread != NULL && mPlayThread->isStopped()) + { + delete mPlayThread; + mPlayThread = NULL; + } + + if( mPlayThread == NULL ) + { + // Make a new thread to start playing. This keeps the viewer + // responsive while the stream is resolved and buffered. + mPlayThread = new LLGstPlayThread( (LLMediaImplCommon *)this, "GstPlayThread", NULL); + mPlayThread->start(); + } return true; } -- cgit v1.1