root/headers/os/media/MediaAddOn.h
/*
 * Copyright 2009, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _MEDIA_ADD_ON_H
#define _MEDIA_ADD_ON_H


#include <image.h>

#include <MediaDefs.h>
#include <Flattenable.h>


class BMediaNode;
class BMimeType;
struct entry_ref;

struct dormant_node_info {
                                                                dormant_node_info();
                                                                ~dormant_node_info();

                        media_addon_id          addon;
                        int32                           flavor_id;
                        char                            name[B_MEDIA_NAME_LENGTH];

private:
                        char                            reserved[128];
};

// flavor_flags
enum {
        B_FLAVOR_IS_GLOBAL      = 0x100000L,            // force in media_addon_server,
                                                                                        // only one instance
        B_FLAVOR_IS_LOCAL       = 0x200000L                     // force in loading app, many
                                                                                        // instances if none is set, could
                                                                                        // go either way
};

struct flavor_info {
        const char*                     name;
        const char*                     info;
        uint64                          kinds;                          // node kind
        uint32                          flavor_flags;
        int32                           internal_id;            // For BMediaAddOn internal use
        int32                           possible_count;         // 0 for "any number"

        int32                           in_format_count;        // for BufferConsumer kinds
        uint32                          in_format_flags;        // set to 0
        const media_format*     in_formats;

        int32                           out_format_count;       // for BufferProducer kinds
        uint32                          out_format_flags;       // set to 0
        const media_format*     out_formats;

        uint32                          _reserved_[16];

private:
        flavor_info&            operator=(const flavor_info& other);
};

struct dormant_flavor_info : public flavor_info, public BFlattenable {
                                                                dormant_flavor_info();
        virtual                                         ~dormant_flavor_info();

                                                                dormant_flavor_info(
                                                                        const dormant_flavor_info& other);
                        dormant_flavor_info& operator=(const dormant_flavor_info& other);
                        dormant_flavor_info& operator=(const flavor_info& other);

                        dormant_node_info       node_info;

                        void                            set_name(const char* name);
                        void                            set_info(const char* info);
                        void                            add_in_format(const media_format& format);
                        void                            add_out_format(const media_format& format);

        virtual bool                            IsFixedSize() const;
        virtual type_code                       TypeCode() const;
        virtual ssize_t                         FlattenedSize() const;
        virtual status_t                        Flatten(void* buffer, ssize_t size) const;
        virtual status_t                        Unflatten(type_code type, const void* buffer,
                                                                        ssize_t size);
};


namespace BPrivate {
        namespace media {
                class DormantNodeManager;
        };
};


//! a MediaAddOn is something which can manufacture MediaNodes
class BMediaAddOn {
public:
        explicit                                        BMediaAddOn(image_id image);
        virtual                                         ~BMediaAddOn();

        virtual status_t                        InitCheck(const char** _failureText);
        virtual int32                           CountFlavors();
        virtual status_t                        GetFlavorAt(int32 index,
                                                                        const flavor_info** _info);
        virtual BMediaNode*                     InstantiateNodeFor(const flavor_info* info,
                                                                        BMessage* config, status_t* _error);
        virtual status_t                        GetConfigurationFor(BMediaNode* yourNode,
                                                                        BMessage* intoMessage);
        virtual bool                            WantsAutoStart();
        virtual status_t                        AutoStart(int index, BMediaNode** _node,
                                                                        int32* _internalID, bool* _hasMore);

        // NOTE: Only implement if you have a B_FILE_INTERFACE node
        virtual status_t                        SniffRef(const entry_ref& file,
                                                                        BMimeType* ioMimeType, float* _quality,
                                                                        int32* _internalID);
        // NOTE: This is broken if you deal with producers and consumers both.
        // Implement SniffTypeKind instead. If you implement SniffTypeKind, this
        // doesn't get called.
        virtual status_t                        SniffType(const BMimeType& type,
                                                                        float* _quality, int32* _internalID);

        virtual status_t                        GetFileFormatList(int32 forNodeFlavorID,
                                                                        media_file_format* _writableFormats,
                                                                        int32 writableFormatsCount,
                                                                        int32* _writableFormatsTotalCount,
                                                                        media_file_format* _readableFormats,
                                                                        int32 readableFormatsCount,
                                                                        int32* _readableFormatsTotalCount,
                                                                        void* _reserved);

        // NOTE: Like SniffType, but for the specific kind(s)
        virtual status_t                        SniffTypeKind(const BMimeType& type,
                                                                        uint64 kinds, float* _quality,
                                                                        int32* _internalID, void* _reserved);

                        image_id                        ImageID();
                        media_addon_id          AddonID();

protected:
        // Calling this will cause everyone to get notified, and also
        // cause the server to re-scan your flavor info. It is thread safe.
                        status_t                        NotifyFlavorChange();

        // TODO: Needs a Perform() virtual method!

private:
        // FBC padding and forbidden methods
                                                                BMediaAddOn();
                                                                BMediaAddOn(const BMediaAddOn& other);
                        BMediaAddOn&            operator=(const BMediaAddOn& other);

                        friend class BPrivate::media::DormantNodeManager;

        virtual status_t                        _Reserved_MediaAddOn_2(void*);
        virtual status_t                        _Reserved_MediaAddOn_3(void*);
        virtual status_t                        _Reserved_MediaAddOn_4(void*);
        virtual status_t                        _Reserved_MediaAddOn_5(void*);
        virtual status_t                        _Reserved_MediaAddOn_6(void*);
        virtual status_t                        _Reserved_MediaAddOn_7(void*);

                        image_id                        fImage;
                        media_addon_id          fAddon;

                        uint32                          _reserved_media_add_on_[7];
};


#if BUILDING_MEDIA_ADDON
        extern "C" _EXPORT BMediaAddOn* make_media_addon(image_id yourImage);
#endif


#endif // _MEDIA_ADD_ON_H