StreamerPlugin: Add reference count
* Keep the Streamer around until everyone released it.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,14 +656,20 @@ 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;
|
||||||
|
streamer->fReference.ReleaseReference();
|
||||||
|
|
||||||
|
// Delete the streamer only when every reference is released
|
||||||
|
if (streamer->fReference.CountReferences() == 0) {
|
||||||
delete streamer;
|
delete streamer;
|
||||||
PutPlugin(plugin);
|
PutPlugin(plugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|||||||
Reference in New Issue
Block a user