From 0554aeded09cd508b0094d8db4d8b189319eb867 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 24 Nov 2006 14:12:54 +0000 Subject: [PATCH] Many bugfixes and improvements for the preloading system: * Fixed memory handling. Now using Ptr::Ref. * Various bugfixes. * Speedup: Use preloaded data whenever possible. --- .../playlistExecutor/src/GstreamerPlayer.cxx | 37 +++++++------------ .../playlistExecutor/src/GstreamerPlayer.h | 3 +- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.cxx b/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.cxx index 53642dc73..8f7297820 100644 --- a/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.cxx +++ b/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.cxx @@ -38,6 +38,7 @@ #include "LiveSupport/Core/TimeConversion.h" #include "GstreamerPlayer.h" +#include using namespace boost::posix_time; @@ -114,8 +115,6 @@ GstreamerPlayer :: initialize(void) throw (std::exception) m_audioconvert = 0; m_audioscale = 0; - m_preloadThread = 0; - g_signal_connect(m_pipeline, "error", G_CALLBACK(errorHandler), this); // TODO: read the caps from the config file @@ -292,14 +291,14 @@ GstreamerPlayer :: preload(const std::string fileUrl) if (m_preloadThread) { m_preloadThread->stop(); - // Wait for thread exit - while (m_preloadThread) {} + m_preloadThread->join(); + m_preloadThread.reset(); } Ptr::Ref loader; loader.reset(new Preloader(this, fileUrl)); - m_preloadThread = new Thread(loader); + m_preloadThread.reset(new Thread(loader)); m_preloadThread->start(); } @@ -323,8 +322,6 @@ GstreamerPlayer :: open(const std::string fileUrl) debug() << "Opening URL: " << fileUrl << endl; - //preload(fileUrl); - std::string filePath; if (fileUrl.find("file://") == 0) { @@ -337,6 +334,11 @@ GstreamerPlayer :: open(const std::string fileUrl) throw std::invalid_argument("badly formed URL or unsupported protocol"); } + if (m_preloadThread) { + debug() << "Waiting for Preloader thread to finish..." << endl; + m_preloadThread->join(); + } + const bool isSmil = fileUrl.substr(fileUrl.size()-5, fileUrl.size()) == ".smil" ? true : false; const bool isPreloaded = (m_preloadUrl == fileUrl); @@ -640,15 +642,12 @@ Preloader::Preloader(GstreamerPlayer* player, const std::string url) throw() : RunnableInterface() , m_player(player) , m_fileUrl(url) - , m_stop(false) {} Preloader::~Preloader() throw() { DEBUG_BLOCK - - m_player->m_preloadThread = 0; } @@ -677,9 +676,8 @@ void Preloader::run() throw() return; } - m_player->m_preloadUrl.clear(); - if (!p->m_preloadUrl.empty()) { + p->m_preloadUrl.clear(); g_object_unref(G_OBJECT(p->m_preloadFilesrc)); g_object_unref(G_OBJECT(p->m_preloadDecoder)); } @@ -697,18 +695,13 @@ void Preloader::run() throw() gst_element_set_state(pipe, GST_STATE_PLAYING); gint64 position = 0LL; - while (position == 0LL && gst_bin_iterate(GST_BIN(pipe)) && !m_stop) { + while (position == 0LL && gst_bin_iterate(GST_BIN(pipe))) { GstFormat format = GST_FORMAT_DEFAULT; gst_element_query(fakesink, GST_QUERY_POSITION, &format, &position); } gst_element_set_state(pipe, GST_STATE_PAUSED); - if (m_stop) { - gst_object_unref(GST_OBJECT(pipe)); - return; - } - g_object_ref(G_OBJECT(p->m_preloadFilesrc)); g_object_ref(G_OBJECT(p->m_preloadDecoder)); gst_bin_remove_many(GST_BIN(pipe), p->m_preloadFilesrc, p->m_preloadDecoder, NULL); @@ -717,7 +710,7 @@ void Preloader::run() throw() p->m_preloadUrl = fileUrl; - delete this; + p->m_preloadThread.reset(); } @@ -726,10 +719,6 @@ void Preloader::signal(int) throw() void Preloader::stop() throw() -{ - DEBUG_BLOCK - - m_stop = true; -} +{} diff --git a/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.h b/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.h index 64feaa85b..d296b16b2 100644 --- a/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.h +++ b/campcaster/src/modules/playlistExecutor/src/GstreamerPlayer.h @@ -154,7 +154,7 @@ class GstreamerPlayer : virtual public Configurable, GstElement * m_preloadFilesrc; GstElement * m_preloadDecoder; - Thread * m_preloadThread; + Ptr::Ref m_preloadThread; /** * The type for the vector of listeners. @@ -451,7 +451,6 @@ class Preloader : public RunnableInterface private: GstreamerPlayer* m_player; std::string m_fileUrl; - bool m_stop; };