root/headers/private/media/PluginManager.h
/*
 * Copyright 2015, Dario Casalinuovo. All rights reserved.
 * Copyright 2012, Fredrik Modéen. All rights reserved.
 * Copyright 2004-2007, Marcus Overhagen. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PLUGIN_MANAGER_H
#define _PLUGIN_MANAGER_H


#include <string.h>


#include "DecoderPlugin.h"
#include "EncoderPlugin.h"
#include "ReaderPlugin.h"
#include "StreamerPlugin.h"
#include "WriterPlugin.h"

#include <TList.h>
#include <Locker.h>


namespace BPrivate { namespace media {

class PluginManager {
public:
                                                                PluginManager();
                                                                ~PluginManager();
        
                        MediaPlugin*            GetPlugin(const entry_ref& ref);
                        void                            PutPlugin(MediaPlugin* plugin);

        // Readers and Decoders
                        status_t                        CreateReader(Reader** reader,
                                                                        int32* streamCount, media_file_format* mff,
                                                                        BDataIO* source);
                        void                            DestroyReader(Reader* reader);

                        status_t                        CreateDecoder(Decoder** decoder,
                                                                        const media_format& format);
                        status_t                        CreateDecoder(Decoder** decoder,
                                                                        const media_codec_info& mci);
                        status_t                        GetDecoderInfo(Decoder* decoder,
                                                                        media_codec_info* _info) const;
                        void                            DestroyDecoder(Decoder* decoder);

        // Writers and Encoders 
                        status_t                        CreateWriter(Writer** writer,
                                                                        const media_file_format& mff,
                                                                        BDataIO* target);
                        void                            DestroyWriter(Writer* writer);

                        status_t                        CreateEncoder(Encoder** encoder,
                                                                        const media_codec_info* codecInfo,
                                                                        uint32 flags);

                        status_t                        CreateEncoder(Encoder** encoder,
                                                                        const media_format& format);

                        void                            DestroyEncoder(Encoder* encoder);

                        status_t                        CreateStreamer(Streamer** streamer,
                                                                        BUrl url, BDataIO** source);
                        void                            DestroyStreamer(Streamer* streamer);

private:
                        status_t                        _LoadPlugin(const entry_ref& ref,
                                                                        MediaPlugin** plugin, image_id* image);

                        struct plugin_info {
                                char                    name[260];
                                int                             usecount;
                                MediaPlugin*    plugin;
                                image_id                image;
                
                                plugin_info& operator=(const plugin_info& other)
                                {
                                        strcpy(name, other.name);
                                        usecount = other.usecount;
                                        plugin = other.plugin;
                                        image = other.image;
                                        return *this;
                                }
                        };

                        List<plugin_info>       fPluginList;
                        BLocker                         fLocker;
};

} } // namespace BPrivate::media

using namespace BPrivate::media;

extern PluginManager gPluginManager;

#endif // _PLUGIN_MANAGER_H