diff options
Diffstat (limited to 'include/asterisk/format.h')
-rw-r--r-- | include/asterisk/format.h | 162 |
1 files changed, 143 insertions, 19 deletions
diff --git a/include/asterisk/format.h b/include/asterisk/format.h index 09212abc8..67e4178a2 100644 --- a/include/asterisk/format.h +++ b/include/asterisk/format.h @@ -26,8 +26,9 @@ #ifndef _AST_FORMAT_H_ #define _AST_FORMAT_H_ +#include "asterisk/astobj2.h" +#include "asterisk/silk.h" #define AST_FORMAT_ATTR_SIZE 128 - #define AST_FORMAT_INC 100000 /*! This is the value that ends a var list of format attribute @@ -55,32 +56,49 @@ enum ast_format_id { AST_FORMAT_G726_AAL2 = 5 + AST_FORMAT_TYPE_AUDIO, /*! ADPCM (IMA) */ AST_FORMAT_ADPCM = 6 + AST_FORMAT_TYPE_AUDIO, - /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ - AST_FORMAT_SLINEAR = 7 + AST_FORMAT_TYPE_AUDIO, /*! LPC10, 180 samples/frame */ - AST_FORMAT_LPC10 = 8 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_LPC10 = 7 + AST_FORMAT_TYPE_AUDIO, /*! G.729A audio */ - AST_FORMAT_G729A = 9 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_G729A = 8 + AST_FORMAT_TYPE_AUDIO, /*! SpeeX Free Compression */ - AST_FORMAT_SPEEX = 10 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SPEEX = 9 + AST_FORMAT_TYPE_AUDIO, /*! iLBC Free Compression */ - AST_FORMAT_ILBC = 11 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_ILBC = 10 + AST_FORMAT_TYPE_AUDIO, /*! ADPCM (G.726, 32kbps, RFC3551 codeword packing) */ - AST_FORMAT_G726 = 12 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_G726 = 11 + AST_FORMAT_TYPE_AUDIO, /*! G.722 */ - AST_FORMAT_G722 = 13 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_G722 = 12 + AST_FORMAT_TYPE_AUDIO, /*! G.722.1 (also known as Siren7, 32kbps assumed) */ - AST_FORMAT_SIREN7 = 14 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SIREN7 = 13 + AST_FORMAT_TYPE_AUDIO, /*! G.722.1 Annex C (also known as Siren14, 48kbps assumed) */ - AST_FORMAT_SIREN14 = 15 + AST_FORMAT_TYPE_AUDIO, - /*! Raw 16-bit Signed Linear (16000 Hz) PCM */ - AST_FORMAT_SLINEAR16 = 16 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SIREN14 = 14 + AST_FORMAT_TYPE_AUDIO, /*! G.719 (64 kbps assumed) */ - AST_FORMAT_G719 = 17 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_G719 = 15 + AST_FORMAT_TYPE_AUDIO, /*! SpeeX Wideband (16kHz) Free Compression */ - AST_FORMAT_SPEEX16 = 18 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SPEEX16 = 16 + AST_FORMAT_TYPE_AUDIO, /*! Raw mu-law data (G.711) */ - AST_FORMAT_TESTLAW = 19 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_TESTLAW = 17 + AST_FORMAT_TYPE_AUDIO, + /*! SILK format */ + AST_FORMAT_SILK = 18 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (8000 Hz) PCM */ + AST_FORMAT_SLINEAR = 19 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (12000 Hz) PCM */ + AST_FORMAT_SLINEAR12 = 20 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (16000 Hz) PCM */ + AST_FORMAT_SLINEAR16 = 21 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (24000 Hz) PCM */ + AST_FORMAT_SLINEAR24 = 22 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (32000 Hz) PCM */ + AST_FORMAT_SLINEAR32 = 23 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (44100 Hz) PCM just because we can. */ + AST_FORMAT_SLINEAR44 = 24 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (48000 Hz) PCM */ + AST_FORMAT_SLINEAR48 = 25 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (96000 Hz) PCM */ + AST_FORMAT_SLINEAR96 = 26 + AST_FORMAT_TYPE_AUDIO, + /*! Raw 16-bit Signed Linear (192000 Hz) PCM. maybe we're taking this too far. */ + AST_FORMAT_SLINEAR192 = 27 + AST_FORMAT_TYPE_AUDIO, + AST_FORMAT_SPEEX32 = 28 + AST_FORMAT_TYPE_AUDIO, /*! H.261 Video */ AST_FORMAT_H261 = 1 + AST_FORMAT_TYPE_VIDEO, @@ -107,6 +125,7 @@ enum ast_format_id { /*! Determine what type of media a ast_format_id is. */ #define AST_FORMAT_GET_TYPE(id) (((int) (id / AST_FORMAT_INC)) * AST_FORMAT_INC) + /*! \brief This structure contains the buffer used for format attributes */ struct ast_format_attr { /*! The buffer formats can use to represent attributes */ @@ -133,6 +152,22 @@ enum ast_format_cmp_res { AST_FORMAT_CMP_SUBSET, }; +/*! \brief Definition of supported media formats (codecs) */ +struct ast_format_list { + struct ast_format format; /*!< The unique format. */ + char name[64]; /*!< short name */ + unsigned int samplespersecond; /*!< Number of samples per second (8000/16000) */ + char desc[128]; /*!< Description */ + int fr_len; /*!< Single frame length in bytes */ + int min_ms; /*!< Min value */ + int max_ms; /*!< Max value */ + int inc_ms; /*!< Increment */ + int def_ms; /*!< Default value */ + unsigned int flags; /*!< Smoother flags */ + int cur_ms; /*!< Current value */ + int custom_entry; +}; + /*! \brief A format must register an attribute interface if it requires the use of the format attributes void pointer */ struct ast_format_attr_interface { /*! format type */ @@ -154,6 +189,34 @@ struct ast_format_attr_interface { /*! \brief Set format capabilities from a list of key value pairs ending with AST_FORMAT_ATTR_END. * \note This function does not need to call va_end of the va_list. */ void (* const format_attr_set)(struct ast_format_attr *format_attr, va_list ap); + + /*! + * \brief Find out if format capabilities in va_list are in format. + * \note This function does not need to call va_end of the va_list. + * + * \note This function is optional. In many cases the format_attr_cmp + * function can be used to derive these results. If it is possible + * that some format attributes have no bearing on the equality of two formats, this + * function must exist. + * + * \retval 0 if all attributes exist + * \retval -1 if any of the attributes not present + */ + int (* const format_attr_isset)(const struct ast_format_attr *format_attr, va_list ap); + + /* + * \brief Return a value for a specific format key. Return that value in the void pointer. + * + * \note It is not expected that all key value pairs can be returned, but those that can should + * be documented as such. + * + * \note This function is optional if key value pairs are not allowed to be accessed. This + * will result in -1 always being returned. + * + * \retval 0 Success, value was found and copied into void pointer. + * \retval -1 failure, Value was either not found, or not allowed to be accessed. + */ + int (* const format_attr_get_val)(const struct ast_format_attr *format_attr, int key, void *val); }; /*! @@ -218,7 +281,18 @@ void ast_format_clear(struct ast_format *format); * \return 0, The format key value pairs are within the capabilities defined in this structure. * \return -1, The format key value pairs are _NOT_ within the capabilities of this structure. */ -int ast_format_isset(struct ast_format *format, ... ); +int ast_format_isset(const struct ast_format *format, ... ); + +/*! + * \brief Get a value from a format containing attributes. + * \note The key represents the format attribute to be retrieved, and the void pointer + * is to the structure that value will be stored in. It must be known what structure a + * key represents. + * + * \retval 0, success + * \retval -1, failure + */ +int ast_format_get_value(const struct ast_format *format, int key, void *value); /*! * \brief Compare ast_formats structures @@ -287,6 +361,52 @@ struct ast_format *ast_format_from_old_bitfield(struct ast_format *dst, uint64_t enum ast_format_id ast_format_id_from_old_bitfield(uint64_t src); /*! + * \brief Retrieve the global format list in a read only array. + * \note ast_format_list_destroy must be called on every format + * list retrieved from this function. + */ +const struct ast_format_list *ast_format_list_get(size_t *size); + +/*! + * \brief Destroy an ast_format_list gotten from ast_format_list_get() + */ +const struct ast_format_list *ast_format_list_destroy(const struct ast_format_list *list); + +/*! \brief Get the name of a format + * \param format id of format + * \return A static string containing the name of the format or "unknown" if unknown. + */ +const char* ast_getformatname(const struct ast_format *format); + +/*! \brief Returns a string containing all formats pertaining to an format id. + * \param buf a buffer for the output string + * \param size size of buf (bytes) + * \param format id. + * \return The return value is buf. + */ +char* ast_getformatname_multiple_byid(char *buf, size_t size, enum ast_format_id id); + +/*! + * \brief Gets a format from a name. + * \param name string of format + * \param format structure to return the format in. + * \return This returns the format pointer given to it on success and NULL on failure + */ +struct ast_format *ast_getformatbyname(const char *name, struct ast_format *format); + +/*! + * \brief Get a name from a format + * \param format to get name of + * \return This returns a static string identifying the format on success, 0 on error. + */ +const char *ast_codec2str(struct ast_format *format); + +/*! + * \brief Get the sample rate for a given format. + */ +int ast_format_rate(const struct ast_format *format); + +/*! * \brief register ast_format_attr_interface with core. * * \retval 0 success @@ -303,8 +423,12 @@ int ast_format_attr_reg_interface(const struct ast_format_attr_interface *interf int ast_format_attr_unreg_interface(const struct ast_format_attr_interface *interface); /*! - * \brief Init the ast_format attribute interface register container. + * \brief Determine if a format is 16bit signed linear of any sample rate. */ -int ast_format_attr_init(void); +int ast_format_is_slinear(const struct ast_format *format); +/*! + * \brief Get the best slinear format id for a given sample rate + */ +enum ast_format_id ast_format_slin_by_rate(unsigned int rate); #endif /* _AST_FORMAT_H */ |