[asterisk-commits] branch mattf/asterisk-wideband - r7385 in /team/mattf/asterisk-wideband: ./ i...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Dec 7 16:39:41 CST 2005


Author: mattf
Date: Wed Dec  7 16:39:40 2005
New Revision: 7385

URL: http://svn.digium.com/view/asterisk?rev=7385&view=rev
Log:
Interface changes to prepare for non 8khz audio.

Modified:
    team/mattf/asterisk-wideband/frame.c
    team/mattf/asterisk-wideband/include/asterisk/frame.h
    team/mattf/asterisk-wideband/include/asterisk/time.h
    team/mattf/asterisk-wideband/rtp.c
    team/mattf/asterisk-wideband/translate.c

Modified: team/mattf/asterisk-wideband/frame.c
URL: http://svn.digium.com/view/asterisk/team/mattf/asterisk-wideband/frame.c?rev=7385&r1=7384&r2=7385&view=diff
==============================================================================
--- team/mattf/asterisk-wideband/frame.c (original)
+++ team/mattf/asterisk-wideband/frame.c Wed Dec  7 16:39:40 2005
@@ -60,6 +60,7 @@
 	int bits;	/*!< bitmask value */
 	char *name;	/*!< short name */
 	char *desc;	/*!< Description */
+	int samplerate;
 };
 
 struct ast_smoother {
@@ -79,32 +80,32 @@
 
 /*! \brief Definition of supported media formats (codecs) */
 static struct ast_format_list AST_FORMAT_LIST[] = {
-	{ 1, AST_FORMAT_G723_1 , "g723" , "G.723.1"},	/*!< codec_g723_1.c */
-	{ 1, AST_FORMAT_GSM, "gsm" , "GSM"},		/*!< codec_gsm.c */
-	{ 1, AST_FORMAT_ULAW, "ulaw", "G.711 u-law" },	/*!< codec_ulaw.c */
-	{ 1, AST_FORMAT_ALAW, "alaw", "G.711 A-law" },	/*!< codec_alaw.c */
-	{ 1, AST_FORMAT_G726, "g726", "G.726" },	/*!< codec_g726.c */
-	{ 1, AST_FORMAT_ADPCM, "adpcm" , "ADPCM"},	/*!< codec_adpcm.c */
-	{ 1, AST_FORMAT_SLINEAR, "slin",  "16 bit Signed Linear PCM"},	/*!<  */
-	{ 1, AST_FORMAT_LPC10, "lpc10", "LPC10" },	/*!< codec_lpc10.c */
-	{ 1, AST_FORMAT_G729A, "g729", "G.729A" },	/*!< Binary commercial distribution */
-	{ 1, AST_FORMAT_SPEEX, "speex", "SpeeX" },	/*!< codec_speex.c */
-	{ 1, AST_FORMAT_ILBC, "ilbc", "iLBC"},	/*!< codec_ilbc.c */
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, AST_FORMAT_MAX_AUDIO, "maxaudio", "Maximum audio format" },
-	{ 1, AST_FORMAT_JPEG, "jpeg", "JPEG image"},	/*!< See format_jpeg.c */
-	{ 1, AST_FORMAT_PNG, "png", "PNG image"},	/*!< Image format */
-	{ 1, AST_FORMAT_H261, "h261", "H.261 Video" },	/*!< Passthrough */
-	{ 1, AST_FORMAT_H263, "h263", "H.263 Video" },	/*!< Passthrough support, see format_h263.c */
-	{ 1, AST_FORMAT_H263_PLUS, "h263p", "H.263+ Video" },	/*!< See format_h263.c */
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, 0, "nothing", "undefined" },
-	{ 0, AST_FORMAT_MAX_VIDEO, "maxvideo", "Maximum video format" },
+	{ 1, AST_FORMAT_G723_1 , "g723" , "G.723.1", 8000},	/*!< codec_g723_1.c */
+	{ 1, AST_FORMAT_GSM, "gsm" , "GSM", 8000},		/*!< codec_gsm.c */
+	{ 1, AST_FORMAT_ULAW, "ulaw", "G.711 u-law", 8000},	/*!< codec_ulaw.c */
+	{ 1, AST_FORMAT_ALAW, "alaw", "G.711 A-law", 8000 },	/*!< codec_alaw.c */
+	{ 1, AST_FORMAT_G726, "g726", "G.726", 8000 },	/*!< codec_g726.c */
+	{ 1, AST_FORMAT_ADPCM, "adpcm" , "ADPCM", 8000},	/*!< codec_adpcm.c */
+	{ 1, AST_FORMAT_SLINEAR, "slin",  "16 bit Signed Linear PCM (8khz)", 8000},	/*!<  */
+	{ 1, AST_FORMAT_LPC10, "lpc10", "LPC10", 8000 },	/*!< codec_lpc10.c */
+	{ 1, AST_FORMAT_G729A, "g729", "G.729A", 8000 },	/*!< Binary commercial distribution */
+	{ 1, AST_FORMAT_SPEEX, "speex", "SpeeX", 8000 },	/*!< codec_speex.c */
+	{ 1, AST_FORMAT_ILBC, "ilbc", "iLBC", 8000},	/*!< codec_ilbc.c */
+	{ 1, AST_FORMAT_SLINEAR16, "slin16", "16 bit Signed Linear PCM (16khz)", 16000 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, AST_FORMAT_MAX_AUDIO, "maxaudio", "Maximum audio format", -1 },
+	{ 1, AST_FORMAT_JPEG, "jpeg", "JPEG image", -1},	/*!< See format_jpeg.c */
+	{ 1, AST_FORMAT_PNG, "png", "PNG image", -1},	/*!< Image format */
+	{ 1, AST_FORMAT_H261, "h261", "H.261 Video", -1 },	/*!< Passthrough */
+	{ 1, AST_FORMAT_H263, "h263", "H.263 Video", -1 },	/*!< Passthrough support, see format_h263.c */
+	{ 1, AST_FORMAT_H263_PLUS, "h263p", "H.263+ Video", -1 },	/*!< See format_h263.c */
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, 0, "nothing", "undefined", -1 },
+	{ 0, AST_FORMAT_MAX_VIDEO, "maxvideo", "Maximum video format", -1 },
 };
 
 void ast_smoother_reset(struct ast_smoother *s, int size)
@@ -233,7 +234,7 @@
 		memmove(s->data, s->data + len, s->len);
 		if (!ast_tvzero(s->delivery)) {
 			/* If we have delivery time, increment it, otherwise, leave it at 0 */
-			s->delivery = ast_tvadd(s->delivery, ast_samp2tv(s->f.samples, 8000));
+			s->delivery = ast_tvadd(s->delivery, ast_samp2tv(s->f.samples, ast_frame_samplerate(&s->f)));
 		}
 	}
 	/* Return frame */
@@ -384,6 +385,28 @@
 	return out;
 }
 
+int ast_frame_samplerate(struct ast_frame *f)
+{
+	int codec;
+	int i;
+
+	if (!f)
+		return -1;
+
+	if (f->frametype != AST_FRAME_VOICE)
+		return -1;
+
+	if (!(f->subclass & AST_AUDIO_CODEC_MASK))
+		return -1;
+
+	codec = f->subclass;
+
+	for (i = 0; codec; i++)
+		codec >>= 1;
+
+	return AST_FORMAT_LIST[i].samplerate;
+}
+
 #if 0
 /*
  * XXX

Modified: team/mattf/asterisk-wideband/include/asterisk/frame.h
URL: http://svn.digium.com/view/asterisk/team/mattf/asterisk-wideband/include/asterisk/frame.h?rev=7385&r1=7384&r2=7385&view=diff
==============================================================================
--- team/mattf/asterisk-wideband/include/asterisk/frame.h (original)
+++ team/mattf/asterisk-wideband/include/asterisk/frame.h Wed Dec  7 16:39:40 2005
@@ -93,7 +93,7 @@
 	int subclass;				
 	/*! Length of data */
 	int datalen;				
-	/*! Number of 8khz samples in this frame */
+	/*! Number of samples of the specified samplerate in this frame */
 	int samples;				
 	/*! Was the data malloc'd?  i.e. should we free it when we discard the frame? */
 	int mallocd;				
@@ -169,6 +169,7 @@
 #define AST_HTML_LINKREJECT	20
 
 /* Data formats for capabilities and frames alike */
+#define AST_AUDIO_CODEC_MASK	0xffff
 /*! G.723.1 compression */
 #define AST_FORMAT_G723_1	(1 << 0)
 /*! GSM compression */
@@ -191,6 +192,8 @@
 #define AST_FORMAT_SPEEX	(1 << 9)
 /*! iLBC Free Compression */
 #define AST_FORMAT_ILBC		(1 << 10)
+/*! Signed Linear 16khz */
+#define AST_FORMAT_SLINEAR16	(1 << 11)
 /*! Maximum audio format */
 #define AST_FORMAT_MAX_AUDIO	(1 << 15)
 /*! JPEG Images */
@@ -418,6 +421,8 @@
 #define ast_smoother_feed_le(s,f) __ast_smoother_feed(s, f, 1)
 #endif
 
+extern int ast_frame_samplerate(struct ast_frame *f);
+
 extern void ast_frame_dump(char *name, struct ast_frame *f, char *prefix);
 
 /*! \brief Initialize a codec preference to "no preference" */

Modified: team/mattf/asterisk-wideband/include/asterisk/time.h
URL: http://svn.digium.com/view/asterisk/team/mattf/asterisk-wideband/include/asterisk/time.h?rev=7385&r1=7384&r2=7385&view=diff
==============================================================================
--- team/mattf/asterisk-wideband/include/asterisk/time.h (original)
+++ team/mattf/asterisk-wideband/include/asterisk/time.h Wed Dec  7 16:39:40 2005
@@ -140,4 +140,10 @@
 }
 )
 
+AST_INLINE_API(
+struct timeval ast_fr2tv(unsigned int _nsamp, unsigned int _rate),
+{
+	return ast_tv(_nsamp / _rate, (_nsamp % _rate) * (1000000 / _rate));
+}
+)
 #endif /* _ASTERISK_TIME_H */

Modified: team/mattf/asterisk-wideband/rtp.c
URL: http://svn.digium.com/view/asterisk/team/mattf/asterisk-wideband/rtp.c?rev=7385&r1=7384&r2=7385&view=diff
==============================================================================
--- team/mattf/asterisk-wideband/rtp.c (original)
+++ team/mattf/asterisk-wideband/rtp.c Wed Dec  7 16:39:40 2005
@@ -411,9 +411,9 @@
 	return &null_frame;
 }
 
-static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
-{
-	struct timeval ts = ast_samp2tv( timestamp, 8000);
+static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark, int samplerate)
+{
+	struct timeval ts = ast_samp2tv( timestamp, samplerate);
 	if (ast_tvzero(rtp->rxcore) || mark) {
 		rtp->rxcore = ast_tvsub(ast_tvnow(), ts);
 		/* Round to 20ms for nice, pretty timestamps */
@@ -614,9 +614,9 @@
 	rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
 	if (rtp->f.subclass < AST_FORMAT_MAX_AUDIO) {
 		rtp->f.samples = ast_codec_get_samples(&rtp->f);
-		if (rtp->f.subclass == AST_FORMAT_SLINEAR) 
+		if ((rtp->f.subclass == AST_FORMAT_SLINEAR) || (rtp->f.subclass == AST_FORMAT_SLINEAR16)) 
 			ast_frame_byteswap_be(&rtp->f);
-		calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
+		calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark, ast_frame_samplerate(&rtp->f));
 	} else {
 		/* Video -- samples is # of samples vs. 90000 */
 		if (!rtp->lastividtimestamp)

Modified: team/mattf/asterisk-wideband/translate.c
URL: http://svn.digium.com/view/asterisk/team/mattf/asterisk-wideband/translate.c?rev=7385&r1=7384&r2=7385&view=diff
==============================================================================
--- team/mattf/asterisk-wideband/translate.c (original)
+++ team/mattf/asterisk-wideband/translate.c Wed Dec  7 16:39:40 2005
@@ -178,7 +178,7 @@
 			path->nextout = f->delivery;
 		}
 		/* Predict next incoming sample */
-		path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, 8000));
+		path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, ast_frame_samplerate(f)));
 	}
 	delivery = f->delivery;
 	if (consume)
@@ -203,7 +203,7 @@
 				
 				/* Predict next outgoing timestamp from samples in this
 				   frame. */
-				path->nextout = ast_tvadd(path->nextout, ast_samp2tv( out->samples, 8000));
+				path->nextout = ast_tvadd(path->nextout, ast_samp2tv( out->samples, ast_frame_samplerate(out)));
 			} else {
 				out->delivery = ast_tv(0, 0);
 			}
@@ -225,7 +225,7 @@
 	struct ast_translator_pvt *pvt;
 	struct ast_frame *f, *out;
 	struct timeval start;
-	int cost;
+	int cost, rate;
 
 	if(!samples)
 		samples = 1;
@@ -242,9 +242,22 @@
 		t->cost = 99999;
 		return;
 	}
+
+	/* Get the sample rate of the codec based on the frame */
+	f = t->sample();
+	if (!f) {
+		ast_log(LOG_WARNING, "Translator '%s' failed to produce a sample frame.\n", t->name);
+		t->destroy(pvt);
+		t->cost = 99999;
+		return;
+	}
+
+	rate = ast_frame_samplerate(f);
+	ast_frfree(f);
+
 	start = ast_tvnow();
 	/* Call the encoder until we've processed one second of time */
-	while(sofar < samples * 8000) {
+	while(sofar < samples * rate) {
 		f = t->sample();
 		if (!f) {
 			ast_log(LOG_WARNING, "Translator '%s' failed to produce a sample frame.\n", t->name);
@@ -261,7 +274,8 @@
 	}
 	cost = ast_tvdiff_ms(ast_tvnow(), start);
 	t->destroy(pvt);
-	t->cost = cost / samples;
+	/* New cost */
+	t->cost = cost / (samples / (rate / 8000));
 	if (!t->cost)
 		t->cost = 1;
 }



More information about the asterisk-commits mailing list