StreamerPlugin: Add reference count

* Keep the Streamer around until everyone released it.
This commit is contained in:
Dario Casalinuovo
2016-09-07 18:19:10 +02:00
parent 95a5e62515
commit 79bd3b4837
2 changed files with 14 additions and 7 deletions
+2
View File
@@ -4,6 +4,7 @@
#include <MediaIO.h> #include <MediaIO.h>
#include <MediaTrack.h> #include <MediaTrack.h>
#include <Referenceable.h>
#include <Url.h> #include <Url.h>
#include "MediaPlugin.h" #include "MediaPlugin.h"
@@ -27,6 +28,7 @@ private:
virtual void _ReservedStreamer5(); virtual void _ReservedStreamer5();
MediaPlugin* fMediaPlugin; MediaPlugin* fMediaPlugin;
BReferenceable fReference;
uint32 fReserved[5]; uint32 fReserved[5];
// needed for plug-in reference count management // needed for plug-in reference count management
+12 -7
View File
@@ -25,8 +25,7 @@ PluginManager gPluginManager;
#define MAX_STREAMERS 40 #define MAX_STREAMERS 40
class DataIOAdapter : public BAdapterIO class DataIOAdapter : public BAdapterIO {
{
public: public:
DataIOAdapter(BDataIO* dataIO) DataIOAdapter(BDataIO* dataIO)
: :
@@ -78,8 +77,7 @@ private:
}; };
class BMediaIOWrapper : public BMediaIO class BMediaIOWrapper : public BMediaIO {
{
public: public:
BMediaIOWrapper(BDataIO* source) BMediaIOWrapper(BDataIO* source)
: :
@@ -639,6 +637,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source)
if ((*streamer)->Sniff(url, &streamSource) == B_OK) { if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
TRACE("PluginManager::CreateStreamer: Sniff success\n"); TRACE("PluginManager::CreateStreamer: Sniff success\n");
*source = streamSource; *source = streamSource;
(*streamer)->fReference.AcquireReference();
return B_OK; return B_OK;
} }
@@ -657,12 +656,18 @@ PluginManager::DestroyStreamer(Streamer* streamer)
if (streamer != NULL) { if (streamer != NULL) {
TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer, TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n", streamer,
streamer->fMediaPlugin); 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 // since otherwise we may actually unload the code for the
// destructor... // destructor...
MediaPlugin* plugin = streamer->fMediaPlugin; MediaPlugin* plugin = streamer->fMediaPlugin;
delete streamer; streamer->fReference.ReleaseReference();
PutPlugin(plugin);
// Delete the streamer only when every reference is released
if (streamer->fReference.CountReferences() == 0) {
delete streamer;
PutPlugin(plugin);
}
} }
} }