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

View File

@ -4,6 +4,7 @@
#include <MediaIO.h>
#include <MediaTrack.h>
#include <Referenceable.h>
#include <Url.h>
#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

View File

@ -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);
}
}
}