diff --git a/headers/private/media/StreamerPlugin.h b/headers/private/media/StreamerPlugin.h index 4fdfef5807..e25290c5bd 100644 --- a/headers/private/media/StreamerPlugin.h +++ b/headers/private/media/StreamerPlugin.h @@ -4,6 +4,7 @@ #include #include +#include #include #include "MediaPlugin.h" @@ -27,6 +28,7 @@ private: virtual void _ReservedStreamer5(); MediaPlugin* fMediaPlugin; + BReferenceable fReference; uint32 fReserved[5]; // needed for plug-in reference count management diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp index c26fa3aec8..49cd9fe69c 100644 --- a/src/kits/media/PluginManager.cpp +++ b/src/kits/media/PluginManager.cpp @@ -25,8 +25,7 @@ PluginManager gPluginManager; #define MAX_STREAMERS 40 -class DataIOAdapter : public BAdapterIO -{ +class DataIOAdapter : public BAdapterIO { public: DataIOAdapter(BDataIO* dataIO) : @@ -78,8 +77,7 @@ private: }; -class BMediaIOWrapper : public BMediaIO -{ +class BMediaIOWrapper : public BMediaIO { public: BMediaIOWrapper(BDataIO* source) : @@ -639,6 +637,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source) if ((*streamer)->Sniff(url, &streamSource) == B_OK) { TRACE("PluginManager::CreateStreamer: Sniff success\n"); *source = streamSource; + (*streamer)->fReference.AcquireReference(); return B_OK; } @@ -657,12 +656,18 @@ PluginManager::DestroyStreamer(Streamer* streamer) if (streamer != NULL) { TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer, streamer->fMediaPlugin); - // NOTE: We have to put the plug-in after deleting the encoder, + // NOTE: We have to put the plug-in after deleting the streamer, // since otherwise we may actually unload the code for the // destructor... + MediaPlugin* plugin = streamer->fMediaPlugin; - delete streamer; - PutPlugin(plugin); + streamer->fReference.ReleaseReference(); + + // Delete the streamer only when every reference is released + if (streamer->fReference.CountReferences() == 0) { + delete streamer; + PutPlugin(plugin); + } } }