[asterisk-commits] dvossel: branch dvossel/fixtheworld_phase1_step3 r300163 - in /team/dvossel/f...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jan 3 22:29:38 UTC 2011


Author: dvossel
Date: Mon Jan  3 16:29:34 2011
New Revision: 300163

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=300163
Log:
Combination of phase 1 step 1 and 2

Added:
    team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h   (with props)
    team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h   (with props)
    team/dvossel/fixtheworld_phase1_step3/main/format.c   (with props)
    team/dvossel/fixtheworld_phase1_step3/main/format_cap.c   (with props)
Modified:
    team/dvossel/fixtheworld_phase1_step3/include/asterisk/translate.h
    team/dvossel/fixtheworld_phase1_step3/main/asterisk.c
    team/dvossel/fixtheworld_phase1_step3/main/translate.c

Added: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h?view=auto&rev=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h (added)
+++ team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h Mon Jan  3 16:29:34 2011
@@ -1,0 +1,257 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2010, Digium, Inc.
+ *
+ * David Vossel <dvossel at 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 Format API
+ *
+ * \author David Vossel <dvossel at digium.com>
+ */
+
+#ifndef _AST_FORMATNEW_H_
+#define _AST_FORMATNEW_H_
+
+#define AST_FORMATNEW_ATTR_SIZE 128
+
+#define AST_FORMATNEW_INC 100000
+
+/*! This is the value that ends a var list of format attribute
+ * key value pairs. */
+#define AST_FORMATNEW_ATTR_END -1
+
+/*! XXX TODO note, the FORMATNEW tag used in all of the following
+ * enums and defines is temporary and will be replaced by FORMAT once the
+ * conversion from format_t to ast_format takes place. */
+
+/* \brief Format Categories*/
+enum ast_format_type {
+	AST_FORMATNEW_TYPE_AUDIO = 1 * AST_FORMATNEW_INC,
+	AST_FORMATNEW_TYPE_VIDEO = 2 * AST_FORMATNEW_INC,
+	AST_FORMATNEW_TYPE_IMAGE = 3 * AST_FORMATNEW_INC,
+	AST_FORMATNEW_TYPE_TEXT  = 4 * AST_FORMATNEW_INC,
+};
+
+enum ast_format_id {
+	/*! G.723.1 compression */
+	AST_FORMATNEW_G723_1			= 1 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! GSM compression */
+	AST_FORMATNEW_GSM				= 2 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! Raw mu-law data (G.711) */
+	AST_FORMATNEW_ULAW				= 3 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! Raw A-law data (G.711) */
+	AST_FORMATNEW_ALAW				= 4 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! ADPCM (G.726, 32kbps, AAL2 codeword packing) */
+	AST_FORMATNEW_G726_AAL2			= 5 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! ADPCM (IMA) */
+	AST_FORMATNEW_ADPCM				= 6 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! Raw 16-bit Signed Linear (8000 Hz) PCM */
+	AST_FORMATNEW_SLINEAR			= 7 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! LPC10, 180 samples/frame */
+	AST_FORMATNEW_LPC10				= 8 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! G.729A audio */
+	AST_FORMATNEW_G729A				= 9 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! SpeeX Free Compression */
+	AST_FORMATNEW_SPEEX				= 10 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! iLBC Free Compression */
+	AST_FORMATNEW_ILBC				= 11 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! ADPCM (G.726, 32kbps, RFC3551 codeword packing) */
+	AST_FORMATNEW_G726				= 12 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! G.722 */
+	AST_FORMATNEW_G722				= 13 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! G.722.1 (also known as Siren7, 32kbps assumed) */
+	AST_FORMATNEW_SIREN7			= 14 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! G.722.1 Annex C (also known as Siren14, 48kbps assumed) */
+	AST_FORMATNEW_SIREN14			= 15 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! Raw 16-bit Signed Linear (16000 Hz) PCM */
+	AST_FORMATNEW_SLINEAR16			= 16 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! G.719 (64 kbps assumed) */
+	AST_FORMATNEW_G719				= 17 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! SpeeX Wideband (16kHz) Free Compression */
+	AST_FORMATNEW_SPEEX16			= 18 + AST_FORMATNEW_TYPE_AUDIO,
+	/*! Raw mu-law data (G.711) */
+	AST_FORMATNEW_TESTLAW			= 19 + AST_FORMATNEW_TYPE_AUDIO,
+
+	/*! H.261 Video */
+	AST_FORMATNEW_H261				= 1 + AST_FORMATNEW_TYPE_VIDEO,
+	/*! H.263 Video */
+	AST_FORMATNEW_H263				= 2 + AST_FORMATNEW_TYPE_VIDEO,
+	/*! H.263+ Video */
+	AST_FORMATNEW_H263_PLUS			= 3 + AST_FORMATNEW_TYPE_VIDEO,
+	/*! H.264 Video */
+	AST_FORMATNEW_H264				= 4 + AST_FORMATNEW_TYPE_VIDEO,
+	/*! MPEG4 Video */
+	AST_FORMATNEW_MP4_VIDEO			= 5 + AST_FORMATNEW_TYPE_VIDEO,
+
+	/*! JPEG Images */
+	AST_FORMATNEW_JPEG				= 1 + AST_FORMATNEW_TYPE_IMAGE,
+	/*! PNG Images */
+	AST_FORMATNEW_PNG				= 2 + AST_FORMATNEW_TYPE_IMAGE,
+
+	/*! T.140 RED Text format RFC 4103 */
+	AST_FORMATNEW_T140RED			= 1 + AST_FORMATNEW_TYPE_TEXT,
+	/*! T.140 Text format - ITU T.140, RFC 4103 */
+	AST_FORMATNEW_T140				= 2 + AST_FORMATNEW_TYPE_TEXT,
+};
+
+/*! Determine what type of media a ast_format_id is. */
+#define AST_FORMATNEW_GET_TYPE(id) (((enum ast_format_id) (id / AST_FORMATNEW_INC)) * AST_FORMATNEW_INC)
+
+/*! \brief This structure contains the buffer used for format attributes */
+struct ast_format_attr {
+	uint8_t format_attr[AST_FORMATNEW_ATTR_SIZE];
+};
+
+/*! \brief Represents a media format within Asterisk. */
+struct ast_format {
+	/*! The unique id representing this format from all the other formats. */
+	enum ast_format_id id;
+	/*!  Attribute structure used to associate attributes with a format. */
+	struct ast_format_attr fattr;
+};
+
+enum ast_format_cmp_res {
+	/*! structure 1 is identical to structure 2. */
+	AST_FORMAT_CMP_EQUAL = 0,
+	/*! structure 1 contains elements not in structure 2. */
+	AST_FORMAT_CMP_NOT_EQUAL,
+	/*! structure 1 is a proper subset of the elements in structure 2.*/
+	AST_FORMAT_CMP_SUBSET,
+};
+
+/*! \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 */
+	enum ast_format_id id;
+
+	/*! \brief Determine if format_attr 1 is a subset of format_attr 2.
+	 *
+	 * \retval ast_format_cmp_res representing the result of comparing fattr1 and fattr2.
+	 */
+	enum ast_format_cmp_res (* const format_attr_cmp)(struct ast_format_attr *fattr1, struct ast_format_attr *fattr2);
+
+	/*! \brief Get joint attributes of same format type if they exist.
+	 *
+	 * \retval 0 if joint attributes exist
+	 * \retval -1 if no joint attributes are present
+	 */
+	int (* const format_attr_get_joint)(struct ast_format_attr *fattr1, struct ast_format_attr *fattr2, struct ast_format_attr *result);
+
+	/*! \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 This function is used to set an ast_format object to represent a media format
+ * with optional format attributes represented by format specific key value pairs.
+ *
+ * \param format to set
+ * \param id, format id to set on format
+ * \param set_attributes, are there attributes to set on this format. 0 == false, 1 == True.
+ * \param var list of attribute key value pairs, must end with AST_FORMATNEW_ATTR_END;
+ *
+ * \details Example usage.
+ * ast_format_set(format, AST_FORMATNEW_ULAW, 0); // no capability attributes are needed for ULAW
+ *
+ * ast_format_set(format, AST_FORMATNEW_SILK, 1, // SILK has capability attributes.
+ *	  AST_FORMATNEW_SILK_ATTR_RATE, 24000,
+ *	  AST_FORMATNEW_SILK_ATTR_RATE, 16000,
+ *	  AST_FORMATNEW_SILK_ATTR_RATE, 12000,
+ *	  AST_FORMATNEW_SILK_ATTR_RATE, 8000,
+ *	  AST_FORMATNEW_ATTR_END);
+ *
+ * \return Pointer to ast_format object, same pointer that is passed in
+ * by the first argument.
+ */
+struct ast_format *ast_format_set(struct ast_format *format, enum ast_format_id id, int set_attributes, ... );
+
+/*!
+ * \brief This function is used to set an ast_format object to represent a media format
+ * with optional capability attributes represented by format specific key value pairs.
+ *
+ * \details Example usage. Is this SILK format capable of 8khz
+ * is_8khz = ast_format_isset(format, AST_FORMATNEW_SILK_CAP_RATE, 8000);
+ *
+ * \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, ... );
+
+/*!
+ * \brief Compare ast_formats structures
+ *
+ * \retval ast_format_cmp_res representing the result of comparing format1 and format2.
+ */
+enum ast_format_cmp_res ast_format_cmp(struct ast_format *format1, struct ast_format *format2);
+
+/*!
+ * \brief Find joint format attributes of two ast_format
+ * structures containing the same uid and return the intersection in the
+ * result structure.
+ *
+ * retval 0, joint attribute capabilities exist.
+ * retval -1, no joint attribute capabilities exist.
+ */
+int ast_format_joint(struct ast_format *format1, struct ast_format *format2, struct ast_format *result);
+
+/*!
+ * \brief copy format src into format dst.
+ */
+void ast_format_copy(struct ast_format *src, struct ast_format *dst);
+
+/*!
+ * \brief ast_format to iax2 bitfield format represenatation
+ *
+ * \note This is only to be used for IAX2 compatibility 
+ *
+ * \retval iax2 representation of ast_format
+ * \retval 0, if no representation existis for iax2
+ */
+uint64_t ast_format_to_iax2(struct ast_format *format);
+
+/*!
+ * \brief convert iax2 bitfield format to ast_format represenatation
+ * \note This is only to be used for IAX2 compatibility 
+ *
+ * \retval on success, pointer to the dst format in the input parameters
+ * \retval on failure, NULL
+ */
+struct ast_format *ast_format_from_iax2(uint64_t src, struct ast_format *dst);
+
+/*!
+ * \brief register ast_format_attr_interface with core.
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_format_attr_reg_interface(struct ast_format_attr_interface *interface);
+
+/*!
+ * \brief unregister format_attr interface with core.
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_format_attr_unreg_interface(struct ast_format_attr_interface *interface);
+
+/*!
+ * \brief Init the ast_format attribute interface register container.
+ */
+int ast_format_attr_init(void);
+
+#endif /* _AST_FORMATNEW_H */

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h?view=auto&rev=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h (added)
+++ team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h Mon Jan  3 16:29:34 2011
@@ -1,0 +1,152 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2010, Digium, Inc.
+ *
+ * David Vossel <dvossel at 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 Format Capability API
+ *
+ * \author David Vossel <dvossel at digium.com>
+ */
+
+#ifndef _AST_FORMATCAP_H_
+#define _AST_FORMATCAP_H_
+
+/*! Capabilities are represented by an opaque structure statically defined in format_capability.c */
+struct ast_cap;
+
+/*!
+ * \brief Allocate a new ast_cap structure.
+ *
+ * \retval ast_cap object on success.
+ * \retval NULL on failure.
+ */
+struct ast_cap *ast_cap_alloc(void);
+
+/*!
+ * \brief Destroy an ast_cap structure.
+ *
+ * \return NULL
+ */
+void *ast_cap_destroy(struct ast_cap *cap);
+
+/*!
+ * \brief Add format capability to capabilities structure.
+ *
+ * \note A copy of the input format is made and that copy is
+ * what is placed in the ast_cap structure.  The actual
+ * input format ptr is not stored.
+ */
+void ast_cap_add(struct ast_cap *cap, struct ast_format *format);
+
+/*!
+ * \brief Remove format capability from capability structure.
+ *
+ * \Note format must match Exactly to format in ast_cap object in order
+ * to be removed.
+ *
+ * \retval 0, remove was successful
+ * \retval -1, remove failed. Could not find format to remove
+ */
+int ast_cap_remove(struct ast_cap *cap, struct ast_format *format);
+
+/*!
+ * \brief Remove all format capabilities from capability
+ * structure for a specific format id.
+ *
+ * \Note This will remove _ALL_ formats matching the format id from the
+ * capabilities structure.
+ *
+ * \retval 0, remove was successful
+ * \retval -1, remove failed. Could not find formats to remove
+ */
+int ast_cap_remove_byid(struct ast_cap *cap, enum ast_format_id id);
+
+/*!
+ * \brief Find if ast_format is within the capabilities of the ast_cap object.
+ *
+ * retval 1 format is compatible with formats held in ast_cap object.
+ * retval 0 format is not compatible with any formats in ast_cap object.
+ */
+int ast_cap_iscompatible(struct ast_cap *cap, struct ast_format *format);
+
+/*!
+ * \brief Get joint capability structure.
+ *
+ * \retval !NULL success
+ * \retval NULL failure
+ */
+struct ast_cap *ast_cap_joint(struct ast_cap *cap1, struct ast_cap *cap2);
+
+/*!
+ * \brief Get all capabilities for a specific media type
+ *
+ * \retval !NULL success
+ * \retval NULL failure
+ */
+struct ast_cap *ast_cap_get_type(struct ast_cap *cap, enum ast_format_type ftype);
+
+
+/*! \brief Start iterating formats */
+void ast_cap_iter_start(struct ast_cap *cap);
+
+/*!
+ * \brief Next format in interation
+ *
+ * \details
+ * Here is how to use the ast_cap iterator.
+ *
+ * 1. call ast_cap_iter_start
+ * 2. call ast_cap_iter_next in a loop until it returns -1
+ * 3. call ast_cap_iter_end to terminate the iterator.
+ *
+ * example:
+ *
+ * ast_cap_iter_start(cap);
+ * while (!ast_cap_iter_next(cap, &format)) {
+ *
+ * }
+ * ast_cap_iter_end(Cap);
+ *
+ * \retval 0 on success, new format is copied into input format struct
+ * \retval -1, no more formats are present.
+ */
+int ast_cap_iter_next(struct ast_cap *cap, struct ast_format *format);
+
+/*!
+ * \brief Ends ast_cap iteration.
+ * \note this must be call after every ast_cap_iter_start
+ */
+void ast_cap_iter_end(struct ast_cap *cap);
+
+/*!
+ * \brief ast_cap to iax2 bitfield format represenatation
+ *
+ * \note This is only to be used for IAX2 compatibility 
+ *
+ * \retval iax2 representation of ast_cap
+ * \retval 0, if no iax2 capabilities are present in ast_cap
+ */
+uint64_t ast_cap_to_iax2(struct ast_cap *cap);
+
+/*!
+ * \brief convert iax2 bitfield format to ast_cap represenatation
+ * \note This is only to be used for IAX2 compatibility 
+ */
+void ast_cap_from_iax2(uint64_t src, struct ast_cap *dst);
+
+#endif /* _AST_FORMATCAP_H */

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/dvossel/fixtheworld_phase1_step3/include/asterisk/format_cap.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: team/dvossel/fixtheworld_phase1_step3/include/asterisk/translate.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/include/asterisk/translate.h?view=diff&rev=300163&r1=300162&r2=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/include/asterisk/translate.h (original)
+++ team/dvossel/fixtheworld_phase1_step3/include/asterisk/translate.h Mon Jan  3 16:29:34 2011
@@ -40,6 +40,74 @@
 
 struct ast_trans_pvt;	/* declared below */
 
+/*!
+ * \brief Translator Cost Table definition.
+ *
+ * \note The defined values in this table must be used to set
+ * the translator's table_cost value.
+ *
+ * \note The cost value of the first two values must always add
+ * up to be greater than the largest value defined in this table.
+ * This is done to guarantee a direct translation will always
+ * have precedence over a multi step translation.
+ *
+ * \details This table is built in a way that allows translation
+ * paths to be built that guarantee the best possible balance
+ * between performance and quality.  With this table direct
+ * translation paths between two formats always takes precedence
+ * over multi step paths, lossless intermediate steps are always
+ * chosen over lossy intermediate steps, and preservation of
+ * sample rate across the translation will always have precedence
+ * over a path that involves any re-sampling.
+ */
+enum ast_trans_cost_table {
+
+	/* Lossless Source Translation Costs */
+
+	/*! [lossless -> lossless] original sampling */
+	AST_TRANS_COST_LL_LL_ORIGSAMP = 400000,
+	/*! [lossless -> lossy]    original sampling */
+	AST_TRANS_COST_LL_LY_ORIGSAMP = 600000,
+
+	/*! [lossless -> lossless] up sample */
+	AST_TRANS_COST_LL_LL_UPSAMP   = 800000,
+	/*! [lossless -> lossy]    up sample */
+	AST_TRANS_COST_LL_LY_UPSAMP   = 825000,
+
+	/*! [lossless -> lossless] down sample */
+	AST_TRANS_COST_LL_LL_DOWNSAMP = 850000,
+	/*! [lossless -> lossy]    down sample */
+	AST_TRANS_COST_LL_LY_DOWNSAMP = 875000,
+
+	/*! [lossless -> unknown]    unknown.
+	 * This value is for a lossless source translation
+	 * with an unknown destination and or sample rate conversion. */
+	AST_TRANS_COST_LL_UNKNOWN     = 885000,
+
+	/* Lossy Source Translation Costs */
+
+	/*! [lossy -> lossless]    original sampling */
+	AST_TRANS_COST_LY_LL_ORIGSAMP = 900000,
+	/*! [lossy -> lossy]       original sampling */
+	AST_TRANS_COST_LY_LY_ORIGSAMP = 915000,
+
+	/*! [lossy -> lossless]    up sample */
+	AST_TRANS_COST_LY_LL_UPSAMP   = 930000,
+	/*! [lossy -> lossy]       up sample */
+	AST_TRANS_COST_LY_LY_UPSAMP   = 945000,
+
+	/*! [lossy -> lossless]    down sample */
+	AST_TRANS_COST_LY_LL_DOWNSAMP = 960000,
+	/*! [lossy -> lossy]       down sample */
+	AST_TRANS_COST_LY_LY_DOWNSAMP = 975000,
+
+	/*! [lossy -> unknown]    unknown.
+	 * This value is for a lossy source translation
+	 * with an unknown destination and or sample rate conversion. */
+	AST_TRANS_COST_LY_UNKNOWN     = 985000,
+
+};
+
 /*! \brief
  * Descriptor of a translator. 
  *
@@ -74,6 +142,11 @@
 	                                        *   converted to index during registration) */
 	format_t dstfmt;                       /*!< Destination format (note: bit position,
 	                                        *   converted to index during registration) */
+	int table_cost;                        /*!< Cost value associated with this translator based
+	                                        *   on translation cost table. */
+	int comp_cost;                         /*!< Cost value associated with this translator based
+	                                        *   on computation time. This cost value is computed based
+											*   on the time required to translate sample data. */
 
 	int (*newpvt)(struct ast_trans_pvt *); /*!< initialize private data 
                                             *   associated with the translator */
@@ -109,7 +182,6 @@
 
 	struct ast_module *module;             /*!< opaque reference to the parent module */
 
-	int cost;                              /*!< Cost in milliseconds for encoding/decoding 1 second of sound */
 	int active;                            /*!< Whether this translator should be used or not */
 	AST_LIST_ENTRY(ast_translator) list;   /*!< link field */
 };
@@ -262,6 +334,13 @@
  */
 const char *ast_translate_path_to_str(struct ast_trans_pvt *t, struct ast_str **str);
 
+/*!
+ * \brief Initialize the translation matrix and index to format conversion table.
+ * \retval 0 on success
+ * \retval -1 on failure
+ */
+int ast_translate_init(void);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: team/dvossel/fixtheworld_phase1_step3/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/asterisk.c?view=diff&rev=300163&r1=300162&r2=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/asterisk.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/main/asterisk.c Mon Jan  3 16:29:34 2011
@@ -111,6 +111,7 @@
 #include "asterisk/network.h"
 #include "asterisk/cli.h"
 #include "asterisk/channel.h"
+#include "asterisk/translate.h"
 #include "asterisk/features.h"
 #include "asterisk/ulaw.h"
 #include "asterisk/alaw.h"
@@ -142,6 +143,7 @@
 #include "asterisk/poll-compat.h"
 #include "asterisk/ccss.h"
 #include "asterisk/test.h"
+#include "asterisk/format.h"
 #include "asterisk/aoc.h"
 
 #include "../defaults.h"
@@ -3669,6 +3671,11 @@
 	}
 #endif
 
+	if (ast_translate_init()) {
+		printf("%s", term_quit());
+		exit(1);
+	}
+
 	ast_aoc_cli_init();
 
 	ast_makesocket();
@@ -3700,6 +3707,8 @@
 
 	astobj2_init();
 
+	ast_format_attr_init();
+
 	ast_autoservice_init();
 
 	if (ast_timing_init()) {

Added: team/dvossel/fixtheworld_phase1_step3/main/format.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/format.c?view=auto&rev=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/format.c (added)
+++ team/dvossel/fixtheworld_phase1_step3/main/format.c Mon Jan  3 16:29:34 2011
@@ -1,0 +1,524 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2010, Digium, Inc.
+ *
+ * David Vossel <dvossel at 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 Format API
+ *
+ * \author David Vossel <dvossel at digium.com>
+ */
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
+
+#include "asterisk/_private.h"
+#include "asterisk/version.h"
+#include "asterisk/format.h"
+#include "asterisk/astobj2.h"
+#include "asterisk/lock.h"
+
+/*! This is the container for all the format attribute interfaces.
+ *  An ao2 container was chosen for fast lookup. */
+static struct ao2_container *interfaces;
+
+/*! This is the lock used to protect the interfaces container.  Yes, ao2_containers
+ * do have their own locking, but we need the capability of performing read/write
+ * locks on this specific container. */
+static ast_rwlock_t ilock;
+
+/*! a wrapper is used put interfaces into the ao2 container. */
+struct interface_ao2_wrapper {
+	enum ast_format_id id;
+	struct ast_format_attr_interface *interface;
+	/*! a read write lock must be used to protect the wrapper instead
+	 * of the ao2 lock. */
+	ast_rwlock_t wraplock;
+};
+
+static int interface_cmp_cb(void *obj, void *arg, int flags)
+{
+	struct interface_ao2_wrapper *wrapper1 = obj;
+	struct interface_ao2_wrapper *wrapper2 = arg;
+
+	return (wrapper2->id == wrapper1->id) ? CMP_MATCH | CMP_STOP : 0;
+}
+
+static int interface_hash_cb(const void *obj, const int flags)
+{
+	const struct interface_ao2_wrapper *wrapper = obj;
+	return wrapper->id;
+}
+
+static void interface_destroy_cb(void *obj)
+{
+	struct interface_ao2_wrapper *wrapper = obj;
+	ast_rwlock_destroy(&wrapper->wraplock);
+}
+
+void ast_format_copy(struct ast_format *src, struct ast_format *dst)
+{
+	memcpy(dst, src, sizeof(struct ast_format));
+}
+
+/*! \internal
+ * \brief set format attributes using an interface
+ */
+static int format_set_helper(struct ast_format *format, va_list ap)
+{
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = format->id,
+	};
+
+	ast_rwlock_rdlock(&ilock);
+	if (!(wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_NOLOCK)))) {
+		ast_log(LOG_WARNING, "Could not find format interface to set\n");
+		ast_rwlock_unlock(&ilock);
+		return -1;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	ast_rwlock_rdlock(&wrapper->wraplock);
+	if (!wrapper->interface || !wrapper->interface->format_attr_set) {
+		ast_rwlock_unlock(&wrapper->wraplock);
+		ao2_ref(wrapper, -1);
+		return -1;
+	}
+
+	wrapper->interface->format_attr_set(&format->fattr, ap);
+
+	ast_rwlock_unlock(&wrapper->wraplock);
+	ao2_ref(wrapper, -1);
+
+	return 0;
+}
+
+struct ast_format *ast_format_set(struct ast_format *format, enum ast_format_id id, int set_attributes, ... )
+{
+	if (format->id != id) {
+		memset(&format->fattr, 0, sizeof(format->fattr));
+	}
+	format->id = id;
+
+	if (set_attributes) {
+		va_list ap;
+		va_start(ap, set_attributes);
+		format_set_helper(format, ap);
+		va_end(ap);
+	}
+
+	return format;
+}
+
+/*! \internal
+ * \brief determine if a list of attribute key value pairs are set on a format
+ */
+static int format_isset_helper(struct ast_format *format, va_list ap)
+{
+	int res;
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = format->id,
+	};
+	struct ast_format tmp = {
+		.id = format->id,
+		.fattr = { { 0, }, },
+	};
+
+	ast_rwlock_rdlock(&ilock);
+	if (!(wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_NOLOCK)))) {
+		ast_rwlock_unlock(&ilock);
+		return -1;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	ast_rwlock_rdlock(&wrapper->wraplock);
+	if (!wrapper->interface ||
+		!wrapper->interface->format_attr_set ||
+		!wrapper->interface->format_attr_cmp) {
+
+		ast_rwlock_unlock(&wrapper->wraplock);
+		ao2_ref(wrapper, -1);
+		return -1;
+	}
+
+	wrapper->interface->format_attr_set(&tmp.fattr, ap);
+
+	/* use our tmp structure to tell if the attributes are set or not */
+	res = wrapper->interface->format_attr_cmp(&tmp.fattr, &format->fattr);
+
+	ast_rwlock_unlock(&wrapper->wraplock);
+	ao2_ref(wrapper, -1);
+
+	return (res == AST_FORMAT_CMP_NOT_EQUAL) ? -1 : 0;
+}
+
+int ast_format_isset(struct ast_format *format, ... )
+{
+	va_list ap;
+	int res;
+
+	va_start(ap, format);
+	res = format_isset_helper(format, ap);
+	va_end(ap);
+	return res;
+}
+
+
+/*! \internal
+ * \brief cmp format attributes using an interface
+ */
+static enum ast_format_cmp_res format_cmp_helper(struct ast_format *format1, struct ast_format *format2)
+{
+	enum ast_format_cmp_res res = AST_FORMAT_CMP_EQUAL;
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = format1->id,
+	};
+
+	ast_rwlock_rdlock(&ilock);
+	if (!(wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_NOLOCK)))) {
+		ast_rwlock_unlock(&ilock);
+		return res;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	ast_rwlock_rdlock(&wrapper->wraplock);
+	if (!wrapper->interface || !wrapper->interface->format_attr_cmp) {
+		ast_rwlock_unlock(&wrapper->wraplock);
+		ao2_ref(wrapper, -1);
+		return res;
+	}
+
+	res = wrapper->interface->format_attr_cmp(&format1->fattr, &format2->fattr);
+
+	ast_rwlock_unlock(&wrapper->wraplock);
+	ao2_ref(wrapper, -1);
+
+	return res;
+}
+
+enum ast_format_cmp_res ast_format_cmp(struct ast_format *format1, struct ast_format *format2)
+{
+	if (format1->id != format2->id) {
+		return AST_FORMAT_CMP_NOT_EQUAL;
+	}
+
+	return format_cmp_helper(format1, format2);
+}
+
+/*! \internal
+ * \brief get joint format attributes using an interface
+ */
+static int format_joint_helper(struct ast_format *format1, struct ast_format *format2, struct ast_format *result)
+{
+	int res = 0;
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = format1->id,
+	};
+
+	ast_rwlock_rdlock(&ilock);
+	if (!(wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_NOLOCK)))) {
+		/* if no interface is present, we assume formats are joint by id alone */
+		ast_rwlock_unlock(&ilock);
+		return res;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	ast_rwlock_rdlock(&wrapper->wraplock);
+	if (!wrapper->interface || !wrapper->interface->format_attr_get_joint) {
+		ast_rwlock_unlock(&wrapper->wraplock);
+		ao2_ref(wrapper, -1);
+		return res;
+	}
+
+	res = wrapper->interface->format_attr_get_joint(&format1->fattr, &format2->fattr, &result->fattr);
+
+	ast_rwlock_unlock(&wrapper->wraplock);
+	ao2_ref(wrapper, -1);
+
+	return res;
+}
+
+int ast_format_joint(struct ast_format *format1, struct ast_format *format2, struct ast_format *result)
+{
+	if (format1->id != format2->id) {
+		return -1;
+	}
+	result->id = format1->id;
+	return format_joint_helper(format1, format2, result);
+}
+
+uint64_t ast_format_to_iax2(struct ast_format *format)
+{
+	switch (format->id) {
+	/*! G.723.1 compression */
+	case AST_FORMATNEW_G723_1:
+		return (1ULL << 0);
+	/*! GSM compression */
+	case AST_FORMATNEW_GSM:
+		return (1ULL << 1);
+	/*! Raw mu-law data (G.711) */
+	case AST_FORMATNEW_ULAW:
+		return (1ULL << 2);
+	/*! Raw A-law data (G.711) */
+	case AST_FORMATNEW_ALAW:
+		return (1ULL << 3);
+	/*! ADPCM (G.726, 32kbps, AAL2 codeword packing) */
+	case AST_FORMATNEW_G726_AAL2:
+		return (1ULL << 4);
+	/*! ADPCM (IMA) */
+	case AST_FORMATNEW_ADPCM:
+		return (1ULL << 5);
+	/*! Raw 16-bit Signed Linear (8000 Hz) PCM */
+	case AST_FORMATNEW_SLINEAR:
+		return (1ULL << 6);
+	/*! LPC10, 180 samples/frame */
+	case AST_FORMATNEW_LPC10:
+		return (1ULL << 7);
+	/*! G.729A audio */
+	case AST_FORMATNEW_G729A:
+		return (1ULL << 8);
+	/*! SpeeX Free Compression */
+	case AST_FORMATNEW_SPEEX:
+		return (1ULL << 9);
+	/*! iLBC Free Compression */
+	case AST_FORMATNEW_ILBC:
+		return (1ULL << 10);
+	/*! ADPCM (G.726, 32kbps, RFC3551 codeword packing) */
+	case AST_FORMATNEW_G726:
+		return (1ULL << 11);
+	/*! G.722 */
+	case AST_FORMATNEW_G722:
+		return (1ULL << 12);
+	/*! G.722.1 (also known as Siren7, 32kbps assumed) */
+	case AST_FORMATNEW_SIREN7:
+		return (1ULL << 13);
+	/*! G.722.1 Annex C (also known as Siren14, 48kbps assumed) */
+	case AST_FORMATNEW_SIREN14:
+		return (1ULL << 14);
+	/*! Raw 16-bit Signed Linear (16000 Hz) PCM */
+	case AST_FORMATNEW_SLINEAR16:
+		return (1ULL << 15);
+	/*! G.719 (64 kbps assumed) */
+	case AST_FORMATNEW_G719:
+		return (1ULL << 32);
+	/*! SpeeX Wideband (16kHz) Free Compression */
+	case AST_FORMATNEW_SPEEX16:
+		return (1ULL << 33);
+	/*! Raw mu-law data (G.711) */
+	case AST_FORMATNEW_TESTLAW:
+		return (1ULL << 47);
+
+	/*! H.261 Video */
+	case AST_FORMATNEW_H261:
+		return (1ULL << 18);
+	/*! H.263 Video */
+	case AST_FORMATNEW_H263:
+		return (1ULL << 19);
+	/*! H.263+ Video */
+	case AST_FORMATNEW_H263_PLUS:
+		return (1ULL << 20);
+	/*! H.264 Video */
+	case AST_FORMATNEW_H264:
+		return (1ULL << 21);
+	/*! MPEG4 Video */
+	case AST_FORMATNEW_MP4_VIDEO:
+		return (1ULL << 22);
+
+	/*! JPEG Images */
+	case AST_FORMATNEW_JPEG:
+		return (1ULL << 16);
+	/*! PNG Images */
+	case AST_FORMATNEW_PNG:
+		return (1ULL << 17);
+
+	/*! T.140 RED Text format RFC 4103 */
+	case AST_FORMATNEW_T140RED:
+		return (1ULL << 26);
+	/*! T.140 Text format - ITU T.140, RFC 4103 */
+	case AST_FORMATNEW_T140:
+		return (1ULL << 27);
+	}
+
+	return 0;
+}
+struct ast_format *ast_format_from_iax2(uint64_t src, struct ast_format *dst)
+{
+	switch (src) {
+	/*! G.723.1 compression */
+	case (1ULL << 0):
+		return ast_format_set(dst, AST_FORMATNEW_G723_1, 0);
+	/*! GSM compression */
+	case (1ULL << 1):
+		return ast_format_set(dst, AST_FORMATNEW_GSM, 0);
+	/*! Raw mu-law data (G.711) */
+	case (1ULL << 2):
+		return ast_format_set(dst, AST_FORMATNEW_ULAW, 0);
+	/*! Raw A-law data (G.711) */
+	case (1ULL << 3):
+		return ast_format_set(dst, AST_FORMATNEW_ALAW, 0);
+	/*! ADPCM (G.726, 32kbps, AAL2 codeword packing) */
+	case (1ULL << 4):
+		return ast_format_set(dst, AST_FORMATNEW_G726_AAL2, 0);
+	/*! ADPCM (IMA) */
+	case (1ULL << 5):
+		return ast_format_set(dst, AST_FORMATNEW_ADPCM, 0);
+	/*! Raw 16-bit Signed Linear (8000 Hz) PCM */
+	case (1ULL << 6):
+		return ast_format_set(dst, AST_FORMATNEW_SLINEAR, 0);
+	/*! LPC10, 180 samples/frame */
+	case (1ULL << 7):
+		return ast_format_set(dst, AST_FORMATNEW_LPC10, 0);
+	/*! G.729A audio */
+	case (1ULL << 8):
+		return ast_format_set(dst, AST_FORMATNEW_G729A, 0);
+	/*! SpeeX Free Compression */
+	case (1ULL << 9):
+		return ast_format_set(dst, AST_FORMATNEW_SPEEX, 0);
+	/*! iLBC Free Compression */
+	case (1ULL << 10):
+		return ast_format_set(dst, AST_FORMATNEW_ILBC, 0);
+	/*! ADPCM (G.726, 32kbps, RFC3551 codeword packing) */
+	case (1ULL << 11):
+		return ast_format_set(dst, AST_FORMATNEW_G726, 0);
+	/*! G.722 */
+	case (1ULL << 12):
+		return ast_format_set(dst, AST_FORMATNEW_G722, 0);
+	/*! G.722.1 (also known as Siren7, 32kbps assumed) */
+	case (1ULL << 13):
+		return ast_format_set(dst, AST_FORMATNEW_SIREN7, 0);
+	/*! G.722.1 Annex C (also known as Siren14, 48kbps assumed) */
+	case (1ULL << 14):
+		return ast_format_set(dst, AST_FORMATNEW_SIREN14, 0);
+	/*! Raw 16-bit Signed Linear (16000 Hz) PCM */
+	case (1ULL << 15):
+		return ast_format_set(dst, AST_FORMATNEW_SLINEAR16, 0);
+	/*! G.719 (64 kbps assumed) */
+	case (1ULL << 32):
+		return ast_format_set(dst, AST_FORMATNEW_G719, 0);
+	/*! SpeeX Wideband (16kHz) Free Compression */
+	case (1ULL << 33):
+		return ast_format_set(dst, AST_FORMATNEW_SPEEX16, 0);
+	/*! Raw mu-law data (G.711) */
+	case (1ULL << 47):
+		return ast_format_set(dst, AST_FORMATNEW_TESTLAW, 0);
+
+	/*! H.261 Video */
+	case (1ULL << 18):
+		return ast_format_set(dst, AST_FORMATNEW_H261, 0);
+	/*! H.263 Video */
+	case (1ULL << 19):
+		return ast_format_set(dst, AST_FORMATNEW_H263, 0);
+	/*! H.263+ Video */
+	case (1ULL << 20):
+		return ast_format_set(dst, AST_FORMATNEW_H263_PLUS, 0);
+	/*! H.264 Video */
+	case (1ULL << 21):
+		return ast_format_set(dst, AST_FORMATNEW_H264, 0);
+	/*! MPEG4 Video */
+	case (1ULL << 22):
+		return ast_format_set(dst, AST_FORMATNEW_MP4_VIDEO, 0);
+
+	/*! JPEG Images */
+	case (1ULL << 16):
+		return ast_format_set(dst, AST_FORMATNEW_JPEG, 0);
+	/*! PNG Images */
+	case (1ULL << 17):
+		return ast_format_set(dst, AST_FORMATNEW_PNG, 0);
+
+	/*! T.140 RED Text format RFC 4103 */
+	case (1ULL << 26):
+		return ast_format_set(dst, AST_FORMATNEW_T140RED, 0);
+	/*! T.140 Text format - ITU T.140, RFC 4103 */
+	case (1ULL << 27):
+		return ast_format_set(dst, AST_FORMATNEW_T140, 0);
+	}
+
+	return NULL;
+}
+
+int ast_format_attr_init()
+{
+	if (!(interfaces = ao2_container_alloc(256, interface_hash_cb, interface_cmp_cb))) {
+		return -1;
+	}
+	ast_rwlock_init(&ilock);
+	return 0;
+}
+
+int ast_format_attr_reg_interface(struct ast_format_attr_interface *interface)
+{
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = interface->id,
+	};
+
+	/* check for duplicates first*/
+	ast_rwlock_wrlock(&ilock);
+	if ((wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_NOLOCK)))) {
+		ast_rwlock_unlock(&ilock);
+		ast_log(LOG_WARNING, "Can not register attribute interface for format id %d, interface already exists.\n", interface->id);
+		ao2_ref(wrapper, -1);
+		return -1;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	if (!(wrapper = ao2_alloc(sizeof(*wrapper), interface_destroy_cb))) {
+		return -1;
+	}
+
+	wrapper->interface = interface;
+	wrapper->id = interface->id;
+	ast_rwlock_init(&wrapper->wraplock);
+
+	/* use the write lock whenever the interface container is modified */
+	ast_rwlock_wrlock(&ilock);
+	ao2_link(interfaces, wrapper);
+	ast_rwlock_unlock(&ilock);
+
+	ao2_ref(wrapper, -1);
+
+	return 0;
+}
+
+int ast_format_attr_unreg_interface(struct ast_format_attr_interface *interface)
+{
+	struct interface_ao2_wrapper *wrapper;
+	struct interface_ao2_wrapper tmp_wrapper = {
+		.id = interface->id,
+	};
+
+	/* use the write lock whenever the interface container is modified */
+	ast_rwlock_wrlock(&ilock);
+	if (!(wrapper = ao2_find(interfaces, &tmp_wrapper, (OBJ_POINTER | OBJ_UNLINK | OBJ_NOLOCK)))) {
+		ast_rwlock_unlock(&ilock);
+		return -1;
+	}
+	ast_rwlock_unlock(&ilock);
+
+	ast_rwlock_wrlock(&wrapper->wraplock);
+	wrapper->interface = NULL;
+	ast_rwlock_unlock(&wrapper->wraplock);
+
+	ao2_ref(wrapper, -1);
+
+	return 0;
+}

Propchange: team/dvossel/fixtheworld_phase1_step3/main/format.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/dvossel/fixtheworld_phase1_step3/main/format.c
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/dvossel/fixtheworld_phase1_step3/main/format.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/dvossel/fixtheworld_phase1_step3/main/format_cap.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/main/format_cap.c?view=auto&rev=300163
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/main/format_cap.c (added)
+++ team/dvossel/fixtheworld_phase1_step3/main/format_cap.c Mon Jan  3 16:29:34 2011
@@ -1,0 +1,318 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2010, Digium, Inc.
+ *
+ * David Vossel <dvossel at 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 Format Capability API
+ *
+ * \author David Vossel <dvossel at digium.com>
+ */
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
+
+#include "asterisk/_private.h"
+#include "asterisk/version.h"
+#include "asterisk/format.h"
+#include "asterisk/format_cap.h"
+#include "asterisk/astobj2.h"
+#include "asterisk/utils.h"
+
+
+struct ast_cap {
+	/* The capabilities structure is just an ao2 container of ast_formats */
+	struct ao2_container *formats;
+	struct ao2_iterator it;
+};
+
+/*! format exists within capabilities structure if it is identical to
+ * another format, or if the format is a proper subset of another format. */
+static int cmp_cb(void *obj, void *arg, int flags)
+{
+	struct ast_format *format1 = arg;
+	struct ast_format *format2 = obj;

[... 1712 lines stripped ...]



More information about the asterisk-commits mailing list