[asterisk-commits] branch crichter/frame-data - r7992 in /team/crichter/frame-data: ./ cdr/ chan...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Jan 11 17:22:37 CST 2006


Author: crichter
Date: Wed Jan 11 17:22:22 2006
New Revision: 7992

URL: http://svn.digium.com/view/asterisk?rev=7992&view=rev
Log:
Merged revisions 7980-7982 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/team/crichter/0.3.0

........
r7980 | crichter | 2006-01-11 11:27:48 +0100 (Mi, 11 Jan 2006) | 1 line

log underruns with higher debuglevel
........
r7981 | crichter | 2006-01-11 13:11:51 +0100 (Mi, 11 Jan 2006) | 1 line

merged -r 7670:7980 manually
........
r7982 | crichter | 2006-01-11 14:53:41 +0100 (Mi, 11 Jan 2006) | 1 line

fixed bug 179 from bugs.beronet.com (can't set empty options in misdn.conf)
........

Added:
    team/crichter/frame-data/formats/format_h264.c
      - copied unchanged from r7982, team/crichter/0.3.0/formats/format_h264.c
Modified:
    team/crichter/frame-data/   (props changed)
    team/crichter/frame-data/aescrypt.c
    team/crichter/frame-data/aeskey.c
    team/crichter/frame-data/callerid.c
    team/crichter/frame-data/cdr/   (props changed)
    team/crichter/frame-data/cdr/cdr_csv.c
    team/crichter/frame-data/cdr/cdr_custom.c
    team/crichter/frame-data/channels/chan_misdn_config.c
    team/crichter/frame-data/codecs/   (props changed)
    team/crichter/frame-data/codecs/ilbc/   (props changed)
    team/crichter/frame-data/codecs/lpc10/   (props changed)
    team/crichter/frame-data/cryptostub.c
    team/crichter/frame-data/file.c
    team/crichter/frame-data/formats/   (props changed)
    team/crichter/frame-data/formats/Makefile
    team/crichter/frame-data/formats/format_pcm.c
    team/crichter/frame-data/formats/format_pcm_alaw.c
    team/crichter/frame-data/privacy.c
    team/crichter/frame-data/res/   (props changed)
    team/crichter/frame-data/res/res_agi.c
    team/crichter/frame-data/res/res_crypto.c
    team/crichter/frame-data/res/res_musiconhold.c
    team/crichter/frame-data/res/res_osp.c
    team/crichter/frame-data/srv.c

Propchange: team/crichter/frame-data/
------------------------------------------------------------------------------
--- svnmerge-blocked (original)
+++ svnmerge-blocked Wed Jan 11 17:22:22 2006
@@ -1,1 +1,1 @@
-/branches/1.2:7497
+/branches/1.2:7497,7915,7960,7965,7970,7976

Propchange: team/crichter/frame-data/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Jan 11 17:22:22 2006
@@ -1,1 +1,1 @@
-/team/crichter/0.3.0:1-7942
+/team/crichter/0.3.0:1-7991

Modified: team/crichter/frame-data/aescrypt.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/aescrypt.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/aescrypt.c (original)
+++ team/crichter/frame-data/aescrypt.c Wed Jan 11 17:22:22 2006
@@ -31,12 +31,16 @@
  Issue Date: 26/08/2003
 
 */
+
 /*! \file
-\brief  This file contains the code for implementing encryption and decryption
- for AES (Rijndael) for block and key sizes of 16, 24 and 32 bytes. It
- can optionally be replaced by code written in assembler using NASM. For
- further details see the file aesopt.h
-*/
+ *
+ * \brief  This file contains the code for implementing encryption and decryption
+ * for AES (Rijndael) for block and key sizes of 16, 24 and 32 bytes. It
+ * can optionally be replaced by code written in assembler using NASM. For
+ * further details see the file aesopt.h
+ *
+ * \author Dr Brian Gladman <brg at gladman.me.uk>
+ */
 
 #include "aesopt.h"
 

Modified: team/crichter/frame-data/aeskey.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/aeskey.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/aeskey.c (original)
+++ team/crichter/frame-data/aeskey.c Wed Jan 11 17:22:22 2006
@@ -31,11 +31,15 @@
  Issue Date: 26/08/2003
 
 */
+
 /*! \file
-\brief  This file contains the code for implementing the key schedule for AES
- (Rijndael) for block and key sizes of 16, 24, and 32 bytes. See aesopt.h
- for further details including optimisation.
-*/
+ *
+ *  \brief  This file contains the code for implementing the key schedule for AES
+ *  (Rijndael) for block and key sizes of 16, 24, and 32 bytes. See aesopt.h
+ *  for further details including optimisation.
+ *
+ * \author Dr Brian Gladman <brg at gladman.me.uk>
+ */
 
 #include "aesopt.h"
 

Modified: team/crichter/frame-data/callerid.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/callerid.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/callerid.c (original)
+++ team/crichter/frame-data/callerid.c Wed Jan 11 17:22:22 2006
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief CallerID Generation support 
- * 
+ *
+ * \author Mark Spencer <markster at digium.com> 
  */
 
 #include <time.h>
@@ -56,6 +57,9 @@
 	int flags;
 	int sawflag;
 	int len;
+
+	int skipflag; 
+	unsigned short crc;
 };
 
 
@@ -250,6 +254,278 @@
 	gen_tones(outbuf + pos, len, codec, casdr1, casdi1, casdr2, casdi2, &cr1, &ci1, &cr2, &ci2);
 	return 0;
 }
+
+static unsigned short calc_crc(unsigned short crc, unsigned char data)
+{
+   	unsigned int i, j, org, dst;
+   	org = data;
+   	dst = 0;
+   	for (i=0; i<CHAR_BIT; i++) {
+       	org <<= 1;
+       	dst >>= 1;
+       	if (org & 0x100) {
+           	dst |= 0x80;
+       	}
+   	}
+   	data = (unsigned char)dst;
+	crc ^= (unsigned int)data << (16 - CHAR_BIT);
+	for ( j=0; j<CHAR_BIT; j++ ) {
+		if ( crc & 0x8000U ) crc = (crc << 1) ^ 0x1021U ;
+		else crc <<= 1 ;
+	}
+   	return crc;
+}
+
+int callerid_feed_jp(struct callerid_state *cid, unsigned char *ubuf, int len, int codec)
+{
+	int mylen = len;
+	int olen;
+	int b = 'X';
+	int b2 ;
+	int res;
+	int x;
+	short *buf = malloc(2 * len + cid->oldlen);
+	short *obuf = buf;
+
+	if (!buf) {
+		ast_log(LOG_WARNING, "Out of memory\n");
+		return -1;
+	}
+
+	memset(buf, 0, 2 * len + cid->oldlen);
+	memcpy(buf, cid->oldstuff, cid->oldlen);
+	mylen += cid->oldlen/2;
+
+	for (x=0;x<len;x++) 
+		buf[x+cid->oldlen/2] = AST_XLAW(ubuf[x]);
+
+	while (mylen >= 160) {
+        b = b2 = 0 ;
+		olen = mylen;
+		res = fsk_serie(&cid->fskd, buf, &mylen, &b);
+
+		if (mylen < 0) {
+			ast_log(LOG_ERROR, "fsk_serie made mylen < 0 (%d)\n", mylen);
+			return -1;
+		}
+
+		buf += (olen - mylen);
+
+		if (res < 0) {
+			ast_log(LOG_NOTICE, "fsk_serie failed\n");
+			return -1;
+		}
+
+		if (res == 1) {
+
+			b2 = b ;
+			b  = b & 0x7f ;
+
+			/* crc checksum calculation */
+			if ( cid->sawflag > 1 ) {
+				cid->crc = calc_crc(cid->crc, (unsigned char)b2);
+			}
+
+			/* Ignore invalid bytes */
+			if (b > 0xff) {
+				continue;
+			}
+
+			/* skip DLE if needed */
+			if ( cid->sawflag > 0 ) {
+				if ( cid->sawflag != 5 && cid->skipflag == 0 && b == 0x10 ) {
+					cid->skipflag = 1 ;
+					continue ;
+				}
+			}
+			if ( cid->skipflag == 1 ) {
+				cid->skipflag = 0 ;
+			}
+
+			/* caller id retrieval */
+			switch(cid->sawflag) {
+				case 0: /* DLE */
+					if (b == 0x10) {
+						cid->sawflag = 1;
+						cid->skipflag = 0;
+						cid->crc = 0;
+					}
+					break;
+				case 1: /* SOH */
+					if (b == 0x01) {
+						cid->sawflag = 2;
+					}
+					break ;
+				case 2: /* HEADER */
+					if (b == 0x07) {
+						cid->sawflag = 3;
+					}
+					break;
+				case 3: /* STX */
+					if (b == 0x02) {
+						cid->sawflag = 4;
+					}
+					break;
+				case 4: /* SERVICE TYPE */
+					if (b == 0x40) {
+						cid->sawflag = 5;
+					}
+					break;
+				case 5: /* Frame Length */
+					cid->sawflag = 6;
+					break;	
+				case 6: /* NUMBER TYPE */
+					cid->sawflag = 7;
+					cid->pos = 0;
+					cid->rawdata[cid->pos++] = b;
+					break;
+				case 7:	/* NUMBER LENGTH */
+					cid->sawflag = 8;
+					cid->len = b;
+					if ( (cid->len+2) >= sizeof( cid->rawdata ) ) {
+						ast_log(LOG_WARNING, "too long caller id string\n" ) ;
+						return -1;
+					}
+					cid->rawdata[cid->pos++] = b;
+					break;
+				case 8:	/* Retrieve message */
+					cid->rawdata[cid->pos++] = b;
+					cid->len--;
+					if (cid->len<=0) {
+						cid->rawdata[cid->pos] = '\0';
+						cid->sawflag = 9;
+					}
+					break;
+				case 9:	/* ETX */
+					cid->sawflag = 10;
+					break;
+				case 10: /* CRC Checksum 1 */
+					cid->sawflag = 11;
+					break;
+				case 11: /* CRC Checksum 2 */
+					cid->sawflag = 12;
+					if ( cid->crc != 0 ) {
+						ast_log(LOG_WARNING, "crc checksum error\n" ) ;
+						return -1;
+					} 
+					/* extract caller id data */
+					for (x=0; x<cid->pos; ) {
+						switch (cid->rawdata[x++]) {
+							case 0x02: /* caller id  number */
+								cid->number[0] = '\0';
+								cid->name[0] = '\0';
+								cid->flags = 0;
+								res = cid->rawdata[x++];
+								ast_copy_string(cid->number, &cid->rawdata[x], res+1 );
+                                x += res;
+								break;
+							case 0x21: /* additional information */
+								/* length */
+                                x++; 
+								/* number type */
+                           		switch (cid->rawdata[x]) { 
+									case 0x00: /* unknown */
+									case 0x01: /* international number */
+									case 0x02: /* domestic number */
+									case 0x03: /* network */
+									case 0x04: /* local call */
+									case 0x06: /* short dial number */
+									case 0x07: /* reserved */
+									default:   /* reserved */
+										ast_log(LOG_NOTICE, "cid info:#1=%X\n", cid->rawdata[x]);
+										break ;
+								}
+                                x++; 
+								/* numbering plan octed 4 */
+                                x++; 
+								/* numbering plan octed 5 */
+                           		switch (cid->rawdata[x]) { 
+									case 0x00: /* unknown */
+									case 0x01: /* recommendation E.164 ISDN */
+									case 0x03: /* recommendation X.121 */
+									case 0x04: /* telex dial plan */
+									case 0x08: /* domestic dial plan */
+									case 0x09: /* private dial plan */
+									case 0x05: /* reserved */
+									default:   /* reserved */
+										ast_log(LOG_NOTICE, "cid info:#2=%X\n", cid->rawdata[x]);
+										break ;
+								}
+                                x++; 
+								break ;
+							case 0x04: /* no callerid reason */
+								/* length */
+                                x++; 
+								/* no callerid reason code */
+                            	switch (cid->rawdata[x]) {
+									case 'P': /* caller id denied by user */
+									case 'O': /* service not available */
+									case 'C': /* pay phone */
+									case 'S': /* service congested */
+                    					cid->flags |= CID_UNKNOWN_NUMBER;
+										ast_log(LOG_NOTICE, "no cid reason:%c\n",cid->rawdata[x]);
+										break ;
+								}
+                                x++; 
+								break ;
+							case 0x09: /* dialed number */
+								/* length */
+								res = cid->rawdata[x++];
+								/* dialed number */
+								x += res;
+								break ;
+							case 0x22: /* dialed number additional information */
+                                /* length */
+                                x++;
+                                /* number type */
+                                switch (cid->rawdata[x]) {
+                                    case 0x00: /* unknown */
+                                    case 0x01: /* international number */
+                                    case 0x02: /* domestic number */
+                                    case 0x03: /* network */
+                                    case 0x04: /* local call */
+                                    case 0x06: /* short dial number */
+                                    case 0x07: /* reserved */
+                                    default:   /* reserved */
+                                        ast_log(LOG_NOTICE, "did info:#1=%X\n", cid->rawdata[x]);
+                                        break ;
+                                }
+                                x++;
+                                /* numbering plan octed 4 */
+                                x++;
+                                /* numbering plan octed 5 */
+                                switch (cid->rawdata[x]) {
+                                    case 0x00: /* unknown */
+                                    case 0x01: /* recommendation E.164 ISDN */
+                                    case 0x03: /* recommendation X.121 */
+                                    case 0x04: /* telex dial plan */
+                                    case 0x08: /* domestic dial plan */
+                                    case 0x09: /* private dial plan */
+                                    case 0x05: /* reserved */
+                                    default:   /* reserved */
+                                        ast_log(LOG_NOTICE, "did info:#2=%X\n", cid->rawdata[x]);
+                                        break ;
+                                }
+                                x++;
+                                break ;
+						}
+					}
+					return 1;
+					break;
+				default:
+					ast_log(LOG_ERROR, "invalid value in sawflag %d\n", cid->sawflag);
+			}
+		}
+	}
+	if (mylen) {
+		memcpy(cid->oldstuff, buf, mylen * 2);
+		cid->oldlen = mylen * 2;
+	} else
+		cid->oldlen = 0;
+	free(obuf);
+	return 0;
+}
+
 
 int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int len, int codec)
 {

Propchange: team/crichter/frame-data/cdr/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,1 +1,3 @@
 .depend
+*.a
+*.so

Modified: team/crichter/frame-data/cdr/cdr_csv.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/cdr/cdr_csv.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/cdr/cdr_csv.c (original)
+++ team/crichter/frame-data/cdr/cdr_csv.c Wed Jan 11 17:22:22 2006
@@ -21,6 +21,8 @@
 /*! \file
  *
  * \brief Comma Separated Value CDR records.
+ *
+ * \author Mark Spencer <markster at digium.com>
  * 
  * \arg See also \ref AstCDR
  * \ingroup cdr_drivers

Modified: team/crichter/frame-data/cdr/cdr_custom.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/cdr/cdr_custom.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/cdr/cdr_custom.c (original)
+++ team/crichter/frame-data/cdr/cdr_custom.c Wed Jan 11 17:22:22 2006
@@ -21,7 +21,9 @@
 /*! \file
  *
  * \brief Custom Comma Separated Value CDR records.
- * 
+ *
+ * \author Mark Spencer <markster at digium.com>
+ *
  * \arg See also \ref AstCDR
  *
  * Logs in LOG_DIR/cdr_custom

Modified: team/crichter/frame-data/channels/chan_misdn_config.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/channels/chan_misdn_config.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/channels/chan_misdn_config.c (original)
+++ team/crichter/frame-data/channels/chan_misdn_config.c Wed Jan 11 17:22:22 2006
@@ -522,8 +522,10 @@
 			dest->str = (char *)malloc((len + 1) * sizeof(char));
 			strncpy(dest->str, value, len);
 			dest->str[len] = 0;
-		} else
-			re = -1;
+		} else {
+			dest->str = (char *)malloc( sizeof(char));
+			dest->str[0] = 0;
+		}
 		break;
 	case MISDN_CTYPE_INT:
 		if (sscanf(value, "%d", &tmp)) {

Propchange: team/crichter/frame-data/codecs/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,3 +1,3 @@
-g723.1
-g723.1b
 .depend
+*.a
+*.so

Propchange: team/crichter/frame-data/codecs/ilbc/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,0 +1,3 @@
+.depend
+*.a
+*.so

Propchange: team/crichter/frame-data/codecs/lpc10/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,0 +1,3 @@
+.depend
+*.a
+*.so

Modified: team/crichter/frame-data/cryptostub.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/cryptostub.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/cryptostub.c (original)
+++ team/crichter/frame-data/cryptostub.c Wed Jan 11 17:22:22 2006
@@ -14,6 +14,13 @@
  * 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 Stubs for res_crypto routines
+ *
+ * \author Mark Spencer <markster at digium.com>
  */
 
 #include <unistd.h>

Modified: team/crichter/frame-data/file.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/file.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/file.c (original)
+++ team/crichter/frame-data/file.c Wed Jan 11 17:22:22 2006
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
  *
  * Mark Spencer <markster at digium.com>
  *
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief Generic File Format Support.
- * 
+ *
+ * \author Mark Spencer <markster at digium.com> 
  */
 
 #include <sys/types.h>
@@ -49,48 +50,49 @@
 #include "asterisk/lock.h"
 #include "asterisk/app.h"
 #include "asterisk/pbx.h"
+#include "asterisk/linkedlists.h"
 
 struct ast_format {
-	/* Name of format */
+	/*! Name of format */
 	char name[80];
-	/* Extensions (separated by | if more than one) 
-	   this format can read.  First is assumed for writing (e.g. .mp3) */
+	/*! Extensions (separated by | if more than one) 
+	    this format can read.  First is assumed for writing (e.g. .mp3) */
 	char exts[80];
-	/* Format of frames it uses/provides (one only) */
+	/*! Format of frames it uses/provides (one only) */
 	int format;
-	/* Open an input stream, and start playback */
+	/*! Open an input stream, and start playback */
 	struct ast_filestream * (*open)(FILE * f);
-	/* Open an output stream, of a given file descriptor and comment it appropriately if applicable */
+	/*! Open an output stream, of a given file descriptor and comment it appropriately if applicable */
 	struct ast_filestream * (*rewrite)(FILE *f, const char *comment);
-	/* Write a frame to a channel */
+	/*! Write a frame to a channel */
 	int (*write)(struct ast_filestream *, struct ast_frame *);
-	/* seek num samples into file, whence(think normal seek) */
+	/*! seek num samples into file, whence(think normal seek) */
 	int (*seek)(struct ast_filestream *, long offset, int whence);
-	/* trunc file to current position */
+	/*! trunc file to current position */
 	int (*trunc)(struct ast_filestream *fs);
-	/* tell current position */
+	/*! tell current position */
 	long (*tell)(struct ast_filestream *fs);
-	/* Read the next frame from the filestream (if available) and report when to get next one
+	/*! Read the next frame from the filestream (if available) and report when to get next one
 		(in samples) */
 	struct ast_frame * (*read)(struct ast_filestream *, int *whennext);
-	/* Close file, and destroy filestream structure */
+	/*! Close file, and destroy filestream structure */
 	void (*close)(struct ast_filestream *);
-	/* Retrieve file comment */
+	/*! Retrieve file comment */
 	char * (*getcomment)(struct ast_filestream *);
-	/* Link */
-	struct ast_format *next;
+	/*! Link */
+	AST_LIST_ENTRY(ast_format) list;
 };
 
 struct ast_filestream {
-	/* Everybody reserves a block of AST_RESERVED_POINTERS pointers for us */
+	/*! Everybody reserves a block of AST_RESERVED_POINTERS pointers for us */
 	struct ast_format *fmt;
 	int flags;
 	mode_t mode;
 	char *filename;
 	char *realfilename;
-	/* Video file stream */
+	/*! Video file stream */
 	struct ast_filestream *vfs;
-	/* Transparently translate from another format -- just once */
+	/*! Transparently translate from another format -- just once */
 	struct ast_trans_pvt *trans;
 	struct ast_tranlator_pvt *tr;
 	int lastwriteformat;
@@ -98,9 +100,7 @@
 	struct ast_channel *owner;
 };
 
-AST_MUTEX_DEFINE_STATIC(formatlock);
-
-static struct ast_format *formats = NULL;
+static AST_LIST_HEAD_STATIC(formats, ast_format);
 
 int ast_format_register(const char *name, const char *exts, int format,
 						struct ast_filestream * (*open)(FILE *f),
@@ -114,23 +114,21 @@
 						char * (*getcomment)(struct ast_filestream *))
 {
 	struct ast_format *tmp;
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
-	tmp = formats;
-	while(tmp) {
+	AST_LIST_TRAVERSE(&formats, tmp, list) {
 		if (!strcasecmp(name, tmp->name)) {
-			ast_mutex_unlock(&formatlock);
+			AST_LIST_UNLOCK(&formats);
 			ast_log(LOG_WARNING, "Tried to register '%s' format, already registered\n", name);
 			return -1;
 		}
-		tmp = tmp->next;
 	}
 	tmp = malloc(sizeof(struct ast_format));
 	if (!tmp) {
 		ast_log(LOG_WARNING, "Out of memory\n");
-		ast_mutex_unlock(&formatlock);
+		AST_LIST_UNLOCK(&formats);
 		return -1;
 	}
 	ast_copy_string(tmp->name, name, sizeof(tmp->name));
@@ -145,9 +143,8 @@
 	tmp->close = close;
 	tmp->format = format;
 	tmp->getcomment = getcomment;
-	tmp->next = formats;
-	formats = tmp;
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_INSERT_HEAD(&formats, tmp, list);
+	AST_LIST_UNLOCK(&formats);
 	if (option_verbose > 1)
 		ast_verbose( VERBOSE_PREFIX_2 "Registered file format %s, extension(s) %s\n", name, exts);
 	return 0;
@@ -155,36 +152,35 @@
 
 int ast_format_unregister(const char *name)
 {
-	struct ast_format *tmp, *tmpl = NULL;
-	if (ast_mutex_lock(&formatlock)) {
+	struct ast_format *tmp;
+	int res = -1;
+
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
-	tmp = formats;
-	while(tmp) {
+	AST_LIST_TRAVERSE_SAFE_BEGIN(&formats, tmp, list) {
 		if (!strcasecmp(name, tmp->name)) {
-			if (tmpl) 
-				tmpl->next = tmp->next;
-			else
-				formats = tmp->next;
+			AST_LIST_REMOVE_CURRENT(&formats, list);
 			free(tmp);
-			ast_mutex_unlock(&formatlock);
-			if (option_verbose > 1)
+			res = 0;
+		}
+	}
+	AST_LIST_TRAVERSE_SAFE_END
+	AST_LIST_UNLOCK(&formats);
+
+	if (tmp) {
+		if (option_verbose > 1)
 				ast_verbose( VERBOSE_PREFIX_2 "Unregistered format %s\n", name);
-			return 0;
-		}
-		tmpl = tmp;
-		tmp = tmp->next;
-	}
-	ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name);
-	return -1;
+	} else
+		ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name);
+
+	return res;
 }
 
 int ast_stopstream(struct ast_channel *tmp)
 {
 	/* Stop a running stream if there is one */
-	if (tmp->vstream)
-		ast_closestream(tmp->vstream);
 	if (tmp->stream) {
 		ast_closestream(tmp->stream);
 		if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat))
@@ -202,8 +198,7 @@
 		if (fs->fmt->format < AST_FORMAT_MAX_AUDIO) {
 			/* This is the audio portion.  Call the video one... */
 			if (!fs->vfs && fs->filename) {
-				/* XXX Support other video formats XXX */
-				const char *type = "h263";
+				const char *type = ast_getformatname(f->subclass & ~0x1);
 				fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode);
 				ast_log(LOG_DEBUG, "Opened video output file\n");
 			}
@@ -362,15 +357,11 @@
 	if (action == ACTION_OPEN)
 		ret = -1;
 	/* Check for a specific format */
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
-		if (action == ACTION_EXISTS)
-			return 0;
-		else
-			return -1;
-	}
-	f = formats;
-	while(f) {
+		return res;
+	}
+	AST_LIST_TRAVERSE(&formats, f, list) {
 		if (!fmt || exts_compare(f->exts, fmt)) {
 			char *stringp=NULL;
 			exts = ast_strdupa(f->exts);
@@ -451,9 +442,8 @@
 			} while(ext);
 			
 		}
-		f = f->next;
-	}
-	ast_mutex_unlock(&formatlock);
+	}
+	AST_LIST_UNLOCK(&formats);
 	if ((action == ACTION_EXISTS) || (action == ACTION_OPEN))
 		res = ret ? ret : -1;
 	return res;
@@ -499,10 +489,14 @@
 		} else
 			snprintf(filename2, sizeof(filename2), "%s/%s", preflang, filename);
 		fmts = ast_fileexists(filename2, NULL, NULL);
+		if (fmts > 0) 
+			fmts &= AST_FORMAT_AUDIO_MASK;
 	}
 	if (fmts < 1) {
 		ast_copy_string(filename2, filename, sizeof(filename2));
 		fmts = ast_fileexists(filename2, NULL, NULL);
+		if (fmts > 0)
+			fmts &= AST_FORMAT_AUDIO_MASK;
 	}
 	if (fmts < 1) {
 		ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
@@ -534,30 +528,35 @@
 	*/
 	int fd = -1;
 	int fmts = -1;
+	unsigned int format;
 	char filename2[256];
 	char lang2[MAX_LANGUAGE];
-	/* XXX H.263 only XXX */
-	char *fmt = "h263";
-	if (!ast_strlen_zero(preflang)) {
-		snprintf(filename2, sizeof(filename2), "%s/%s", preflang, filename);
-		fmts = ast_fileexists(filename2, fmt, NULL);
+	const char *fmt;
+	for (format = AST_FORMAT_MAX_AUDIO << 1; format <= AST_FORMAT_MAX_VIDEO; format = format << 1) {
+		if (!(chan->nativeformats & format))
+			continue;
+		fmt = ast_getformatname(format);
+		if (!ast_strlen_zero(preflang)) {
+			snprintf(filename2, sizeof(filename2), "%s/%s", preflang, filename);
+			fmts = ast_fileexists(filename2, fmt, NULL);
+			if (fmts < 1) {
+				ast_copy_string(lang2, preflang, sizeof(lang2));
+				snprintf(filename2, sizeof(filename2), "%s/%s", lang2, filename);
+				fmts = ast_fileexists(filename2, fmt, NULL);
+			}
+		}
 		if (fmts < 1) {
-			ast_copy_string(lang2, preflang, sizeof(lang2));
-			snprintf(filename2, sizeof(filename2), "%s/%s", lang2, filename);
+			ast_copy_string(filename2, filename, sizeof(filename2));
 			fmts = ast_fileexists(filename2, fmt, NULL);
 		}
-	}
-	if (fmts < 1) {
-		ast_copy_string(filename2, filename, sizeof(filename2));
-		fmts = ast_fileexists(filename2, fmt, NULL);
-	}
-	if (fmts < 1) {
-		return NULL;
-	}
- 	fd = ast_filehelper(filename2, (char *)chan, fmt, ACTION_OPEN);
-	if (fd >= 0)
-		return chan->vstream;
-	ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
+		if (fmts < 1) {
+			continue;
+		}
+	 	fd = ast_filehelper(filename2, (char *)chan, fmt, ACTION_OPEN);
+		if (fd >= 0)
+			return chan->vstream;
+		ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
+	}
 	return NULL;
 }
 
@@ -726,6 +725,10 @@
 		f->realfilename = NULL;
 	}
 	f->fmt->close(f);
+	if (f->vfs) {
+		ast_closestream(f->vfs);
+		f->vfs = NULL;
+	}
 	return 0;
 }
 
@@ -796,12 +799,14 @@
 int ast_streamfile(struct ast_channel *chan, const char *filename, const char *preflang)
 {
 	struct ast_filestream *fs;
-	struct ast_filestream *vfs;
+	struct ast_filestream *vfs=NULL;
+	char fmt[256];
 
 	fs = ast_openstream(chan, filename, preflang);
-	vfs = ast_openvstream(chan, filename, preflang);
+	if (fs)
+		vfs = ast_openvstream(chan, filename, preflang);
 	if (vfs)
-		ast_log(LOG_DEBUG, "Ooh, found a video stream, too\n");
+		ast_log(LOG_DEBUG, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format));
 	if (fs){
 		if (ast_applystream(chan, fs))
 			return -1;
@@ -817,7 +822,7 @@
 #endif
 		return 0;
 	}
-	ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname(chan->nativeformats), strerror(errno));
+	ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno));
 	return -1;
 }
 
@@ -828,12 +833,15 @@
 	struct ast_filestream *fs = NULL;
 	char *fn;
 
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return NULL;
 	}
 
-	for (f = formats; f && !fs; f = f->next) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
+		if (fs)
+			break;
+
 		if (!exts_compare(f->exts, type))
 			continue;
 
@@ -860,7 +868,7 @@
 		free(fn);
 	}
 
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_UNLOCK(&formats);
 	if (!fs) 
 		ast_log(LOG_WARNING, "No such format '%s'\n", type);
 
@@ -878,7 +886,7 @@
 	char *buf = NULL;
 	size_t size = 0;
 
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return NULL;
 	}
@@ -893,7 +901,10 @@
 	
 	myflags |= O_WRONLY | O_CREAT;
 
-	for (f = formats; f && !fs; f = f->next) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
+		if (fs)
+			break;
+
 		if (!exts_compare(f->exts, type))
 			continue;
 
@@ -975,7 +986,7 @@
 			free(fn);
 	}
 
-	ast_mutex_unlock(&formatlock);
+	AST_LIST_UNLOCK(&formats);
 	if (!fs)
 		ast_log(LOG_WARNING, "No such format '%s'\n", type);
 
@@ -1251,18 +1262,16 @@
 		return RESULT_SHOWUSAGE;
 	ast_cli(fd, FORMAT, "Format", "Name", "Extensions");
 	        
-	if (ast_mutex_lock(&formatlock)) {
+	if (AST_LIST_LOCK(&formats)) {
 		ast_log(LOG_WARNING, "Unable to lock format list\n");
 		return -1;
 	}
 
-	f = formats;
-	while(f) {
+	AST_LIST_TRAVERSE(&formats, f, list) {
 		ast_cli(fd, FORMAT2, ast_getformatname(f->format), f->name, f->exts);
-		f = f->next;
 		count_fmt++;
-	};
-	ast_mutex_unlock(&formatlock);
+	}
+	AST_LIST_UNLOCK(&formats);
 	ast_cli(fd, "%d file formats registered.\n", count_fmt);
 	return RESULT_SUCCESS;
 #undef FORMAT

Propchange: team/crichter/frame-data/formats/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,1 +1,3 @@
 .depend
+*.a
+*.so

Modified: team/crichter/frame-data/formats/Makefile
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/formats/Makefile?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/formats/Makefile (original)
+++ team/crichter/frame-data/formats/Makefile Wed Jan 11 17:22:22 2006
@@ -14,7 +14,7 @@
 FORMAT_LIBS=format_gsm.so format_wav.so \
 	format_wav_gsm.so format_vox.so format_pcm.so format_g729.so \
 	format_pcm_alaw.so format_h263.so format_g726.so format_ilbc.so \
-	format_sln.so format_au.so
+	format_sln.so format_au.so format_h264.so
 FORMAT_LIBS+=format_jpeg.so
 
 #

Modified: team/crichter/frame-data/formats/format_pcm.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/formats/format_pcm.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/formats/format_pcm.c (original)
+++ team/crichter/frame-data/formats/format_pcm.c Wed Jan 11 17:22:22 2006
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
  *
  * Mark Spencer <markster at digium.com>
  *
@@ -44,6 +44,7 @@
 #include "asterisk/sched.h"
 #include "asterisk/module.h"
 #include "asterisk/endian.h"
+#include "asterisk/ulaw.h"
 
 #define BUF_SIZE 160		/* 160 samples */
 
@@ -66,6 +67,8 @@
 static char *name = "pcm";
 static char *desc = "Raw uLaw 8khz Audio support (PCM)";
 static char *exts = "pcm|ulaw|ul|mu";
+
+static char ulaw_silence[BUF_SIZE];
 
 static struct ast_filestream *pcm_open(FILE *f)
 {
@@ -173,24 +176,46 @@
 
 static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
 {
-	off_t offset=0,min,cur,max;
-
-	min = 0;
+	long cur, max, offset = 0;
+
 	cur = ftell(fs->f);
 	fseek(fs->f, 0, SEEK_END);
 	max = ftell(fs->f);
-	if (whence == SEEK_SET)
+
+	switch (whence) {
+	case SEEK_SET:
 		offset = sample_offset;
-	else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
-		offset = sample_offset + cur;
-	else if (whence == SEEK_END)
+		break;
+	case SEEK_END:
 		offset = max - sample_offset;
-	if (whence != SEEK_FORCECUR) {
-		offset = (offset > max)?max:offset;
-	}
-	/* always protect against seeking past begining. */
-	offset = (offset < min)?min:offset;
-	return fseek(fs->f, offset, SEEK_SET);
+		break;
+	case SEEK_CUR:
+	case SEEK_FORCECUR:
+		offset = cur + sample_offset;
+		break;
+	}
+
+	switch (whence) {
+	case SEEK_FORCECUR:
+		if (offset > max) {
+			size_t left = offset - max;
+			size_t res;
+
+			while (left) {
+				res = fwrite(ulaw_silence, sizeof(ulaw_silence[0]),
+					     (left > BUF_SIZE) ? BUF_SIZE : left, fs->f);
+				if (res == -1)
+					return res;
+				left -= res * sizeof(ulaw_silence[0]);
+			}
+			return offset;
+		}
+		/* fall through */
+	default:
+		offset = (offset > max) ? max : offset;
+		offset = (offset < 0) ? 0 : offset;
+		return fseek(fs->f, offset, SEEK_SET);
+	}
 }
 
 static int pcm_trunc(struct ast_filestream *fs)
@@ -212,18 +237,21 @@
 
 int load_module()
 {
+	int index;
+
+	for (index = 0; index < (sizeof(ulaw_silence) / sizeof(ulaw_silence[0])); index++)
+		ulaw_silence[index] = AST_LIN2MU(0);
+
 	return ast_format_register(name, exts, AST_FORMAT_ULAW,
-								pcm_open,
-								pcm_rewrite,
-								pcm_write,
-								pcm_seek,
-								pcm_trunc,
-								pcm_tell,
-								pcm_read,
-								pcm_close,
-								pcm_getcomment);
-								
-								
+				   pcm_open,
+				   pcm_rewrite,
+				   pcm_write,
+				   pcm_seek,
+				   pcm_trunc,
+				   pcm_tell,
+				   pcm_read,
+				   pcm_close,
+				   pcm_getcomment);
 }
 
 int unload_module()

Modified: team/crichter/frame-data/formats/format_pcm_alaw.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/formats/format_pcm_alaw.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/formats/format_pcm_alaw.c (original)
+++ team/crichter/frame-data/formats/format_pcm_alaw.c Wed Jan 11 17:22:22 2006
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
  *
  * Mark Spencer <markster at digium.com>
  *
@@ -45,6 +45,7 @@
 #include "asterisk/sched.h"
 #include "asterisk/module.h"
 #include "asterisk/endian.h"
+#include "asterisk/alaw.h"
 
 #define BUF_SIZE 160		/* 160 samples */
 
@@ -73,6 +74,8 @@
 static char *desc = "Raw aLaw 8khz PCM Audio support";
 static char *exts = "alaw|al";
 
+static char alaw_silence[BUF_SIZE];
+
 
 #if 0
 /* Returns time in msec since system boot. */
@@ -248,24 +251,46 @@
 
 static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
 {
-	off_t offset=0,min,cur,max;
-
-	min = 0;
+	long cur, max, offset = 0;
+
 	cur = ftell(fs->f);
 	fseek(fs->f, 0, SEEK_END);
 	max = ftell(fs->f);
-	if (whence == SEEK_SET)
+
+	switch (whence) {
+	case SEEK_SET:
 		offset = sample_offset;
-	else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
-		offset = sample_offset + cur;
-	else if (whence == SEEK_END)
+		break;
+	case SEEK_END:
 		offset = max - sample_offset;
-	if (whence != SEEK_FORCECUR) {
-		offset = (offset > max)?max:offset;
-	}
-	/* Always protect against seeking past begining */
-	offset = (offset < min)?min:offset;
-	return fseek(fs->f, offset, SEEK_SET);
+		break;
+	case SEEK_CUR:
+	case SEEK_FORCECUR:
+		offset = cur + sample_offset;
+		break;
+	}
+
+	switch (whence) {
+	case SEEK_FORCECUR:
+		if (offset > max) {
+			size_t left = offset - max;
+			size_t res;
+
+			while (left) {
+				res = fwrite(alaw_silence, sizeof(alaw_silence[0]),
+					     (left > BUF_SIZE) ? BUF_SIZE : left, fs->f);
+				if (res == -1)
+					return res;
+				left -= res * sizeof(alaw_silence[0]);
+			}
+			return offset;
+		}
+		/* fall through */
+	default:
+		offset = (offset > max) ? max : offset;
+		offset = (offset < 0) ? 0 : offset;
+		return fseek(fs->f, offset, SEEK_SET);
+	}
 }
 
 static int pcm_trunc(struct ast_filestream *fs)
@@ -288,16 +313,21 @@
 
 int load_module()
 {
+	int index;
+
+	for (index = 0; index < (sizeof(alaw_silence) / sizeof(alaw_silence[0])); index++)
+		alaw_silence[index] = AST_LIN2A(0);
+
 	return ast_format_register(name, exts, AST_FORMAT_ALAW,
-								pcm_open,
-								pcm_rewrite,
-								pcm_write,
-								pcm_seek,
-								pcm_trunc,
-								pcm_tell,
-								pcm_read,
-								pcm_close,
-								pcm_getcomment);
+				   pcm_open,
+				   pcm_rewrite,
+				   pcm_write,
+				   pcm_seek,
+				   pcm_trunc,
+				   pcm_tell,
+				   pcm_read,
+				   pcm_close,
+				   pcm_getcomment);
 }
 
 int unload_module()

Modified: team/crichter/frame-data/privacy.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/privacy.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/privacy.c (original)
+++ team/crichter/frame-data/privacy.c Wed Jan 11 17:22:22 2006
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief Privacy Routines
- * 
+ *
+ * \author Mark Spencer <markster at digium.com> 
  */
 
 #include <stdio.h>

Propchange: team/crichter/frame-data/res/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Jan 11 17:22:22 2006
@@ -1,1 +1,3 @@
 .depend
+*.a
+*.so

Modified: team/crichter/frame-data/res/res_agi.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/res/res_agi.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/res/res_agi.c (original)
+++ team/crichter/frame-data/res/res_agi.c Wed Jan 11 17:22:22 2006
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief AGI - the Asterisk Gateway Interface
- * 
+ *
+ * \author Mark Spencer <markster at digium.com> 
  */
 
 #include <sys/types.h>

Modified: team/crichter/frame-data/res/res_crypto.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/res/res_crypto.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/res/res_crypto.c (original)
+++ team/crichter/frame-data/res/res_crypto.c Wed Jan 11 17:22:22 2006
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief Provide Cryptographic Signature capability
- * 
+ *
+ * \author Mark Spencer <markster at digium.com> 
  */
 
 #include <sys/types.h>

Modified: team/crichter/frame-data/res/res_musiconhold.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/res/res_musiconhold.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/res/res_musiconhold.c (original)
+++ team/crichter/frame-data/res/res_musiconhold.c Wed Jan 11 17:22:22 2006
@@ -22,6 +22,7 @@
  *
  * \arg See also \ref Config_moh
  * 
+ * \author Mark Spencer <markster at digium.com>
  */
 
 #include <stdlib.h>

Modified: team/crichter/frame-data/res/res_osp.c
URL: http://svn.digium.com/view/asterisk/team/crichter/frame-data/res/res_osp.c?rev=7992&r1=7991&r2=7992&view=diff
==============================================================================
--- team/crichter/frame-data/res/res_osp.c (original)
+++ team/crichter/frame-data/res/res_osp.c Wed Jan 11 17:22:22 2006
@@ -19,7 +19,9 @@
 /*! \file
  *
  * \brief Provide Open Settlement Protocol capability
- * 
+ *
+ * \author Mark Spencer <markster at digium.com>
+ *
  * \arg See also: \ref chan_sip.c
  */
 
@@ -514,6 +516,44 @@
 	return res;	
 }
 
+static int check_dest(struct ast_osp_result *result, char *token, int tokensize)
+{
+	OSPE_DEST_OSP_ENABLED enabled;
+	OSPE_DEST_PROT prot;
+	int res = 1;
+
+	/* Check destination OSP version */
+	if (!OSPPTransactionIsDestOSPEnabled(result->handle, &enabled) && (enabled == OSPE_OSP_FALSE)) {
+		result->token[0] = 0;
+	} else {

[... 198 lines stripped ...]


More information about the asterisk-commits mailing list