/* * Copyright 2009, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT license. */ #ifndef _MEDIA_TYPES_H #define _MEDIA_TYPES_H #include #include #include #include struct media_codec_info { char pretty_name[96]; /* eg: "SuperSqueeze Encoder by Foo Inc" */ char short_name[32]; /* eg: "SuperSqueeze" */ int32 id; /* opaque id passed to BMediaFile::CreateTrack() */ int32 sub_id; int32 pad[63]; }; /*! \brief Use this to iterate through the available encoders for a given file format. \param cookie A pointer to a preallocated cookie, which you need to initialize to \c 0 before calling this function the first time. \param fileFormat A pointer to a valid media_file_format structure as can be obtained through get_next_file_format(). \param inputFormat This is the type of data given to the encoder. \param _outputFormat This is the type of data the encoder will output. \param _codecInfo Pointer to a preallocated media_codec_info structure, information about the encoder is placed there. \return - \c B_OK: Everything went fine. - \c B_BAD_INDEX: There are no more encoders. */ status_t get_next_encoder(int32* cookie, const media_file_format* fileFormat, const media_format* inputFormat, media_format* _outputFormat, media_codec_info* _codecInfo); /*! \brief Use this to iterate through the available encoders with restrictions to the input and output media_format while the encoders can specialize wildcards in the media_formats. \param cookie A pointer to a preallocated cookie, which you need to initialize to \c 0 before calling this function the first time. \param fileFormat A pointer to a valid media_file_format structure as can be obtained through get_next_file_format(). You can pass \c NULL if you don't care. \param inputFormat This is the type of data given to the encoder, wildcards are accepted. \param outputFormat This is the type of data you want the encoder to output. Wildcards are accepted. \param _codecInfo Pointer to a preallocated media_codec_info structure, information about the encoder is placed there. \param _acceptedInputFormat This is the type of data that the encoder will accept as input. Wildcards in \a inFormat will be specialized here. \param _acceptedOutputFormat This is the type of data that the encoder will output. Wildcards in \a _outFormat will be specialized here. \return - \c B_OK: Everything went fine. - \c B_BAD_INDEX: There are no more encoders. */ status_t get_next_encoder(int32* cookie, const media_file_format* fileFormat, const media_format* inputFormat, const media_format* outputFormat, media_codec_info* _codecInfo, media_format* _acceptedInputFormat, media_format* _acceptedOutputFormat); /*! \brief Iterate over the all the available encoders without media_format restrictions. \param cookie A pointer to a preallocated cookie, which you need to initialize to \c 0 before calling this function the first time. \param _codecInfo Pointer to a preallocated media_codec_info structure, information about the encoder is placed there. \return - \c B_OK: Everything went fine. - \c B_BAD_INDEX: There are no more encoders. */ status_t get_next_encoder(int32* cookie, media_codec_info* _codecInfo); enum media_file_accept_format_flags { B_MEDIA_REJECT_WILDCARDS = 0x1 }; bool does_file_accept_format(const media_file_format* fileFormat, media_format* format, uint32 flags = 0); typedef struct { uint8 data[16]; } GUID; enum beos_format { B_BEOS_FORMAT_RAW_AUDIO = 'rawa', B_BEOS_FORMAT_RAW_VIDEO = 'rawv' }; typedef struct { int32 format; } media_beos_description; typedef struct { uint32 codec; uint32 vendor; } media_quicktime_description; typedef struct { uint32 codec; } media_avi_description; typedef struct { uint32 id; } media_avr_description; typedef struct { GUID guid; } media_asf_description; enum mpeg_id { B_MPEG_ANY = 0, B_MPEG_1_AUDIO_LAYER_1 = 0x101, B_MPEG_1_AUDIO_LAYER_2 = 0x102, B_MPEG_1_AUDIO_LAYER_3 = 0x103, /* "MP3" */ B_MPEG_1_VIDEO = 0x111, B_MPEG_2_AUDIO_LAYER_1 = 0x201, B_MPEG_2_AUDIO_LAYER_2 = 0x202, B_MPEG_2_AUDIO_LAYER_3 = 0x203, B_MPEG_2_VIDEO = 0x211, B_MPEG_2_5_AUDIO_LAYER_1 = 0x301, B_MPEG_2_5_AUDIO_LAYER_2 = 0x302, B_MPEG_2_5_AUDIO_LAYER_3 = 0x303, }; typedef struct { uint32 id; } media_mpeg_description; typedef struct { uint32 codec; } media_wav_description; typedef struct { uint32 codec; } media_aiff_description; typedef struct { uint32 file_format; uint32 codec; } media_misc_description; typedef struct _media_format_description { _media_format_description(); ~_media_format_description(); _media_format_description( const _media_format_description& other); _media_format_description& operator=( const _media_format_description& other); media_format_family family; uint32 _reserved_[3]; union { media_beos_description beos; media_quicktime_description quicktime; media_avi_description avi; media_asf_description asf; media_mpeg_description mpeg; media_wav_description wav; media_aiff_description aiff; media_misc_description misc; media_avr_description avr; uint32 _reserved_[12]; } u; } media_format_description; class BMediaFormats { public: BMediaFormats(); virtual ~BMediaFormats(); status_t InitCheck(); // Make sure you memset() your descs to 0 before you start filling // them in! Else you may register some bogus value. enum make_format_flags { B_EXCLUSIVE = 0x1, // Fail if this format has already been // registered. B_NO_MERGE = 0x2, // Don't re-number any formats if there are // multiple clashing previous registrations, // but fail instead. B_SET_DEFAULT = 0x4 // Set the first format to be the default for // the format family (when registering more // than one in the same family). Only use in // Encoder add-ons. }; status_t MakeFormatFor(const media_format_description* descriptions, int32 descriptionCount, media_format* _inOutFormat, uint32 flags = 0, void* _reserved = 0); status_t GetFormatFor(const media_format_description& description, media_format* _outFormat); status_t GetCodeFor(const media_format& format, media_format_family family, media_format_description* _outDescription); status_t RewindFormats(); status_t GetNextFormat(media_format* _outFormat, media_format_description* _outDescription); // You need to lock/unlock (only) when using // RewindFormats()/GetNextFormat(). bool Lock(); void Unlock(); // convenience functions static status_t GetBeOSFormatFor(uint32 fourcc, media_format* _outFormat, media_type type = B_MEDIA_UNKNOWN_TYPE); static status_t GetAVIFormatFor(uint32 fourcc, media_format* _outFormat, media_type type = B_MEDIA_UNKNOWN_TYPE); static status_t GetQuicktimeFormatFor(uint32 vendor, uint32 fourcc, media_format* _outFormat, media_type type = B_MEDIA_UNKNOWN_TYPE); // Deprecated: status_t MakeFormatFor(const media_format_description& description, const media_format& inFormat, media_format* _outFormat); private: int32 fIteratorIndex; uint32 _reserved[30]; }; bool operator==(const media_format_description& a, const media_format_description& b); bool operator<(const media_format_description& a, const media_format_description& b); bool operator==(const GUID& a, const GUID& b); bool operator<(const GUID& a, const GUID& b); #endif // _MEDIA_TYPES_H