123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- /*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2014, Digium, Inc.
- *
- * Joshua Colp <jcolp@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
- /*!
- * \file
- * \brief Media Format API
- *
- * \author Joshua Colp <jcolp@digium.com>
- */
- #include "asterisk/codec.h"
- #ifndef _AST_FORMAT_H_
- #define _AST_FORMAT_H_
- struct ast_format;
- /*! \brief Format comparison results */
- enum ast_format_cmp_res {
- /*! Both formats are equivalent to each other */
- AST_FORMAT_CMP_EQUAL = 0,
- /*! Both formats are completely different and not the same in any way */
- AST_FORMAT_CMP_NOT_EQUAL,
- /*! Both formats are similar but not equivalent */
- AST_FORMAT_CMP_SUBSET,
- };
- /*! \brief Optional format interface to extend format operations */
- struct ast_format_interface {
- /*!
- * \brief Callback for when the format is destroyed, used to release attribute resources
- *
- * \param format The format structure to destroy
- */
- void (*const format_destroy)(struct ast_format *format);
- /*!
- * \brief Callback for when the format is cloned, used to clone attributes
- *
- * \param src Source format of attributes
- * \param dst Destination format for attributes
- *
- * \retval 0 success
- * \retval -1 failure
- */
- int (*const format_clone)(const struct ast_format *src, struct ast_format *dst);
- /*!
- * \brief Determine if format 1 is a subset of format 2.
- *
- * \param format1 First format to compare
- * \param format2 Second format which the first is compared against
- *
- * \retval ast_format_cmp_res representing the result of comparing format1 and format2.
- */
- enum ast_format_cmp_res (* const format_cmp)(const struct ast_format *format1,
- const struct ast_format *format2);
- /*!
- * \brief Get a format with the joint compatible attributes of both provided formats.
- *
- * \param format1 The first format
- * \param format2 The second format
- *
- * \retval non-NULL if joint format
- * \retval NULL if no joint format
- *
- * \note The returned format has its reference count incremented and must be released using
- * ao2_ref or ao2_cleanup.
- */
- struct ast_format *(* const format_get_joint)(const struct ast_format *format1,
- const struct ast_format *format2);
- /*!
- * \brief Set an attribute on a format
- *
- * \param name The name of the attribute
- * \param value The value of the attribute
- *
- * \retval non-NULL success
- * \retval NULL failure
- */
- struct ast_format *(* const format_attribute_set)(const struct ast_format *format,
- const char *name, const char *value);
- /*!
- * \brief Parse SDP attribute information, interpret it, and store it in the format structure.
- *
- * \param format Format to set attributes on
- * \param attributes A string containing only the attributes from the fmtp line
- *
- * \retval non-NULL Success, values were valid
- * \retval NULL Failure, some values were not acceptable
- */
- struct ast_format *(* const format_parse_sdp_fmtp)(const struct ast_format *format, const char *attributes);
- /*!
- * \brief Generate SDP attribute information from an ast_format structure.
- *
- * \param format The format containing attributes
- * \param payload The payload number to place into the fmtp line
- * \param str The generated fmtp line
- *
- * \note This callback should generate a full fmtp line using the provided payload number.
- */
- void (* const format_generate_sdp_fmtp)(const struct ast_format *format, unsigned int payload,
- struct ast_str **str);
- /*!
- * \since 13.6.0
- * \brief Retrieve a particular format attribute setting
- *
- * \param format The format containing attributes
- * \param name The name of the attribute to retrieve
- *
- * \retval NULL if the parameter is not set on the format
- * \retval non-NULL the format attribute value
- */
- const void *(* const format_attribute_get)(const struct ast_format *format, const char *name);
- };
- /*!
- * \brief Initialize media format support
- *
- * \retval 0 success
- * \retval -1 failure
- */
- int ast_format_init(void);
- /*!
- * \brief Create a new media format
- *
- * \param codec The codec to use
- *
- * \retval non-NULL success
- * \retval NULL failure
- *
- * \note The format is returned with reference count incremented. It must be released using
- * ao2_ref or ao2_cleanup.
- */
- struct ast_format *ast_format_create(struct ast_codec *codec);
- /*!
- * \brief Create a new media format with a specific name
- *
- * \param format_name The name to use for the format
- * \param codec The codec to use
- *
- * \note This creation function should be used when the name of the \c codec
- * cannot be explicitly used for the name of the format. This is the case for
- * codecs with multiple sample rates
- *
- * \note The format is returned with reference count incremented. It must be released using
- * ao2_ref or ao2_cleanup.
- *
- * \retval non-NULL success
- * \retval NULL failure
- */
- struct ast_format *ast_format_create_named(const char *format_name, struct ast_codec *codec);
- /*!
- * \brief Clone an existing media format so it can be modified
- *
- * \param format The existing media format
- *
- * \note The returned format is a new ao2 object. It must be released using ao2_cleanup.
- *
- * \retval non-NULL success
- * \retval NULL failure
- */
- struct ast_format *ast_format_clone(const struct ast_format *format);
- /*!
- * \brief Compare two formats
- *
- * \retval ast_format_cmp_res representing the result of comparing format1 and format2.
- */
- enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2);
- /*!
- * \brief Get a common joint capability between two formats
- *
- * \retval non-NULL if joint capability exists
- * \retval NULL if no joint capability exists
- *
- * \note The returned format must be treated as immutable.
- */
- struct ast_format *ast_format_joint(const struct ast_format *format1, const struct ast_format *format2);
- /*!
- * \brief Set an attribute on a format to a specific value
- *
- * \param format The format to set the attribute on
- * \param name Attribute name
- * \param value Attribute value
- *
- * \retval non-NULL success
- * \retval NULL failure
- */
- struct ast_format *ast_format_attribute_set(const struct ast_format *format, const char *name,
- const char *value);
- /*!
- * \since 13.6.0
- *
- * \param format The format to retrieve the attribute from
- * \param name Attribute name
- *
- * \retval non-NULL the attribute value
- * \retval NULL the attribute does not exist or is unset
- */
- const void *ast_format_attribute_get(const struct ast_format *format, const char *name);
- /*!
- * \brief This function is used to have a media format aware module parse and interpret
- * SDP attribute information. Once interpreted this information is stored on the format
- * itself using Asterisk format attributes.
- *
- * \param format to set
- * \param attributes string containing the fmtp line from the SDP
- *
- * \retval non-NULL success, attribute values were valid
- * \retval NULL failure, values were not acceptable
- */
- struct ast_format *ast_format_parse_sdp_fmtp(const struct ast_format *format, const char *attributes);
- /*!
- * \brief This function is used to produce an fmtp SDP line for an Asterisk format. The
- * attributes present on the Asterisk format are translated into the SDP equivalent.
- *
- * \param format to generate an fmtp line for
- * \param payload numerical payload for the fmtp line
- * \param str structure that the fmtp line will be appended to
- */
- void ast_format_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str);
- /*!
- * \brief Register a format interface for use with the provided codec
- *
- * \param codec The name of codec the interface is applicable to
- * \param interface A pointer to the interface implementation
- * \param mod The module this format interface is provided by
- *
- * \retval 0 success
- * \retval -1 failure
- */
- int __ast_format_interface_register(const char *codec, const struct ast_format_interface *interface, struct ast_module *mod);
- /*!
- * \brief Register a format interface for use with the provided codec
- *
- * \param codec The name of codec the interface is applicable to
- * \param interface A pointer to the interface implementation
- *
- * \retval 0 success
- * \retval -1 failure
- */
- #define ast_format_interface_register(codec, interface) __ast_format_interface_register(codec, interface, ast_module_info->self)
- /*!
- * \brief Get the attribute data on a format
- *
- * \param format The media format
- *
- * \return Currently set attribute data
- */
- void *ast_format_get_attribute_data(const struct ast_format *format);
- /*!
- * \brief Set the attribute data on a format
- *
- * \param format The media format
- * \param attribute_data The attribute data
- */
- void ast_format_set_attribute_data(struct ast_format *format, void *attribute_data);
- /*!
- * \brief Get the name associated with a format
- *
- * \param format The media format
- *
- * \return The name of the format
- */
- const char *ast_format_get_name(const struct ast_format *format);
- /*!
- * \brief Get the codec associated with a format
- *
- * \param format The media format
- *
- * \return The codec
- *
- * \note The reference count of the returned codec is increased by 1 and must be decremented
- */
- struct ast_codec *ast_format_get_codec(const struct ast_format *format);
- /*!
- * \brief Get the codec identifier associated with a format
- *
- * \param format The media format
- *
- * \return codec identifier
- */
- unsigned int ast_format_get_codec_id(const struct ast_format *format);
- /*!
- * \brief Get the codec name associated with a format
- *
- * \param format The media format
- *
- * \return The codec name
- */
- const char *ast_format_get_codec_name(const struct ast_format *format);
- /*!
- * \brief Get whether or not the format can be smoothed
- *
- * \param format The media format
- *
- * \retval 0 the format cannot be smoothed
- * \retval 1 the format can be smoothed
- */
- int ast_format_can_be_smoothed(const struct ast_format *format);
- /*!
- * \since 13.17.0
- *
- * \brief Get smoother flags for this format
- *
- * \param format The media format
- *
- * \return smoother flags for the provided format
- */
- int ast_format_get_smoother_flags(const struct ast_format *format);
- /*!
- * \brief Get the media type of a format
- *
- * \param format The media format
- *
- * \return the media type
- */
- enum ast_media_type ast_format_get_type(const struct ast_format *format);
- /*!
- * \brief Get the default framing size (in milliseconds) for a format
- *
- * \param format The media format
- *
- * \return default framing size in milliseconds
- */
- unsigned int ast_format_get_default_ms(const struct ast_format *format);
- /*!
- * \brief Get the minimum amount of media carried in this format
- *
- * \param format The media format
- *
- * \return minimum framing size in milliseconds
- */
- unsigned int ast_format_get_minimum_ms(const struct ast_format *format);
- /*!
- * \brief Get the maximum amount of media carried in this format
- *
- * \param format The media format
- *
- * \return maximum framing size in milliseconds
- */
- unsigned int ast_format_get_maximum_ms(const struct ast_format *format);
- /*!
- * \brief Get the minimum number of bytes expected in a frame for this format
- *
- * \param format The media format
- *
- * \return minimum expected bytes in a frame for this format
- */
- unsigned int ast_format_get_minimum_bytes(const struct ast_format *format);
- /*!
- * \brief Get the sample rate of a media format
- *
- * \param format The media format
- *
- * \return sample rate
- */
- unsigned int ast_format_get_sample_rate(const struct ast_format *format);
- /*!
- * \brief Get the length (in milliseconds) for the format with a given number of samples
- *
- * \param format The media format
- * \param samples The number of samples
- *
- * \return length of media (in milliseconds)
- */
- unsigned int ast_format_determine_length(const struct ast_format *format, unsigned int samples);
- /*!
- * \since 12
- * \brief Get the message type used for signaling a format registration
- *
- * \retval Stasis message type for format registration
- * \retval NULL on error
- */
- struct stasis_message_type *ast_format_register_type(void);
- /*!
- * \since 12
- * \brief Get the message type used for signaling a format unregistration
- *
- * \retval Stasis message type for format unregistration
- * \retval NULL on error
- */
- struct stasis_message_type *ast_format_unregister_type(void);
- #endif /* _AST_FORMAT_H */
|