mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
Version 0.1.2 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@156 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
89
codecs/lpc10/README
Executable file
89
codecs/lpc10/README
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
Tue Aug 20 16:19:51 CDT 1996
|
||||||
|
Andy Fingerhut (jaf@arl.wustl.edu)
|
||||||
|
|
||||||
|
In release 1.4, there are quite a few hand modifications to the C code
|
||||||
|
that was automatically created from the Fortran code with f2c. They
|
||||||
|
are all summarized in change log comments at the beginning of the
|
||||||
|
changed files. All of the original files from f2c were checked in to
|
||||||
|
RCS before modification, so it is possible to see exactly what changes
|
||||||
|
were made, for the extremely curious. That precaution was also for my
|
||||||
|
benefit, in case I ever recompile the Fortran sources, and want to
|
||||||
|
make similar changes to that new C source code.
|
||||||
|
|
||||||
|
Below is the README file for this directory included with the 1.3
|
||||||
|
release of the LPC-10 package. A few parts of it are a little out of
|
||||||
|
date, but it is correct for the most part.
|
||||||
|
|
||||||
|
|
||||||
|
Sun Jul 7 15:30:31 CDT 1996
|
||||||
|
Andy Fingerhut (jaf@arl.wustl.edu)
|
||||||
|
|
||||||
|
To create the LPC-10 library, copy the appropriate makefile to the
|
||||||
|
proper name for easy use, e.g., for Unix, copy makefile.unx to the
|
||||||
|
file "Makefile". The file makefile.dos has been used with some
|
||||||
|
version of the 'nmake' utility that comes with the Microsoft C
|
||||||
|
compiler (the same one used for Nautilus v1.5a, which I believe
|
||||||
|
specifies Microsoft C version 7.0 or later).
|
||||||
|
|
||||||
|
Then edit the file lpc10.h in the directory above. It should already
|
||||||
|
be set up to work properly on any Unix compiler for which "int" is 32
|
||||||
|
bits and "short" is 16 bits, and under the Microsoft C compiler
|
||||||
|
configured so that "long" is 32 bits and "int" is 16 bits. There must
|
||||||
|
be a typedef for the two types INT32 and INT16 in that file. You
|
||||||
|
should choose types that compile to those sizes using your compiler,
|
||||||
|
because there are places in the LPC-10 code that expect INT16's to
|
||||||
|
have exactly 16 bits (at least, I *think* they must be no larger), and
|
||||||
|
INT32's to have exactly 32 bits.
|
||||||
|
|
||||||
|
|
||||||
|
A few notes on how these files were created
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
(This section is mostly for my benefit, so I can remember what I did.
|
||||||
|
You don't need to read it if you just want to use this package. It
|
||||||
|
might be useful to read it if you change the Fortran sources and want
|
||||||
|
to recreate a usable library of C sources. -- Andy)
|
||||||
|
|
||||||
|
These C sources were created automatically from the Fortran sources
|
||||||
|
using f2c, for the most part. Listed below are the extra
|
||||||
|
modifications that were made after this automatic conversion. Many of
|
||||||
|
them were made so that it was not necessary to install f2c in order to
|
||||||
|
use this LPC-10 coder.
|
||||||
|
|
||||||
|
1.
|
||||||
|
|
||||||
|
Put all of those files that were necessary for only the coder, rather
|
||||||
|
than an application that uses the coder, into this subdirectory called
|
||||||
|
lpc10.
|
||||||
|
|
||||||
|
2.
|
||||||
|
|
||||||
|
Copied f2c.h from the f2c distribution into this subdirectory. Some
|
||||||
|
modifications were made to the "typedef" statements in this file, to
|
||||||
|
explicitly indicate the sizes (in bits) that different integer types
|
||||||
|
should be. The types INT32 and INT16 must be defined in a file called
|
||||||
|
lpc10.h in the directory above. Created the file f2clib.c, containing
|
||||||
|
only the functions pow_ii(), r_sign(), and i_nint() from the f2c
|
||||||
|
library.
|
||||||
|
|
||||||
|
3.
|
||||||
|
|
||||||
|
The f2c output originally had a file called contrl_com.c, that defined
|
||||||
|
a small structure containing a few variables that were used in many
|
||||||
|
different functions of the LPC10 code. Every file containing
|
||||||
|
functions that used it defined it as "extern", while contrl_com.c
|
||||||
|
actually allocated storage for the structure. Bill Dorsey, one of the
|
||||||
|
lead developers of Nautilus, said that the Microsoft C compiler had
|
||||||
|
problems either compiling this file, or linking it with all of the
|
||||||
|
other compiled files, so he just eliminated that file and removed the
|
||||||
|
"extern" keyword from the one of the files that declared it that way.
|
||||||
|
The file chosen (arbitrarily) was analys.c.
|
||||||
|
|
||||||
|
4.
|
||||||
|
|
||||||
|
Copied the makefiles for Unix and Microsoft C from the Nautilus v1.5a
|
||||||
|
distribution into the lpc10 directory. Modified them to take out
|
||||||
|
references to Nautilus. These makefiles don't create an executable,
|
||||||
|
but a library of compiled functions called liblpc10.a (Unix) or
|
||||||
|
LPC10.LIB (DOS). This library can be used when linking an executable
|
||||||
|
that calls the functions lpcini_(), lpcenc_(), and lpcdec_().
|
229
codecs/lpc10/lpc10.h
Executable file
229
codecs/lpc10/lpc10.h
Executable file
@@ -0,0 +1,229 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2000/01/05 00:20:06 markster
|
||||||
|
Version 0.1.2 from FTP
|
||||||
|
|
||||||
|
Revision 1.1 2000/01/05 00:20:06 markster
|
||||||
|
Add broken lpc10 code... It's not too far from working I don't think...
|
||||||
|
|
||||||
|
* Revision 1.1 1996/08/19 22:47:31 jaf
|
||||||
|
* Initial revision
|
||||||
|
*
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LPC10_H__
|
||||||
|
#define __LPC10_H__
|
||||||
|
|
||||||
|
#define LPC10_SAMPLES_PER_FRAME 180
|
||||||
|
#define LPC10_BITS_IN_COMPRESSED_FRAME 54
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
The "#if defined"'s in this file are by no means intended to be
|
||||||
|
complete. They are what Nautilus uses, which has been successfully
|
||||||
|
compiled under DOS with the Microsoft C compiler, and under a few
|
||||||
|
versions of Unix with the GNU C compiler.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(unix)
|
||||||
|
typedef short INT16;
|
||||||
|
typedef int INT32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__MSDOS__) || defined(MSDOS)
|
||||||
|
typedef int INT16;
|
||||||
|
typedef long INT32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* The initial values for every member of this structure is 0, except
|
||||||
|
where noted in comments. */
|
||||||
|
|
||||||
|
/* These two lines are copied from f2c.h. There should be a more
|
||||||
|
elegant way of doing this than having the same declarations in two
|
||||||
|
files. */
|
||||||
|
|
||||||
|
typedef float real;
|
||||||
|
typedef INT32 integer;
|
||||||
|
typedef INT32 logical;
|
||||||
|
typedef INT16 shortint;
|
||||||
|
|
||||||
|
struct lpc10_encoder_state {
|
||||||
|
/* State used only by function hp100 */
|
||||||
|
real z11;
|
||||||
|
real z21;
|
||||||
|
real z12;
|
||||||
|
real z22;
|
||||||
|
|
||||||
|
/* State used by function analys */
|
||||||
|
real inbuf[540], pebuf[540];
|
||||||
|
real lpbuf[696], ivbuf[312];
|
||||||
|
real bias;
|
||||||
|
integer osbuf[10]; /* no initial value necessary */
|
||||||
|
integer osptr; /* initial value 1 */
|
||||||
|
integer obound[3];
|
||||||
|
integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */
|
||||||
|
integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */
|
||||||
|
integer voibuf[8] /* was [2][4] */;
|
||||||
|
real rmsbuf[3];
|
||||||
|
real rcbuf[30] /* was [10][3] */;
|
||||||
|
real zpre;
|
||||||
|
|
||||||
|
|
||||||
|
/* State used by function onset */
|
||||||
|
real n;
|
||||||
|
real d__; /* initial value 1.f */
|
||||||
|
real fpc; /* no initial value necessary */
|
||||||
|
real l2buf[16];
|
||||||
|
real l2sum1;
|
||||||
|
integer l2ptr1; /* initial value 1 */
|
||||||
|
integer l2ptr2; /* initial value 9 */
|
||||||
|
integer lasti; /* no initial value necessary */
|
||||||
|
logical hyst; /* initial value FALSE_ */
|
||||||
|
|
||||||
|
/* State used by function voicin */
|
||||||
|
real dither; /* initial value 20.f */
|
||||||
|
real snr;
|
||||||
|
real maxmin;
|
||||||
|
real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */
|
||||||
|
integer lbve, lbue, fbve, fbue;
|
||||||
|
integer ofbue, sfbue;
|
||||||
|
integer olbue, slbue;
|
||||||
|
/* Initial values:
|
||||||
|
lbve = 3000;
|
||||||
|
fbve = 3000;
|
||||||
|
fbue = 187;
|
||||||
|
ofbue = 187;
|
||||||
|
sfbue = 187;
|
||||||
|
lbue = 93;
|
||||||
|
olbue = 93;
|
||||||
|
slbue = 93;
|
||||||
|
snr = (real) (fbve / fbue << 6);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* State used by function dyptrk */
|
||||||
|
real s[60];
|
||||||
|
integer p[120] /* was [60][2] */;
|
||||||
|
integer ipoint;
|
||||||
|
real alphax;
|
||||||
|
|
||||||
|
/* State used by function chanwr */
|
||||||
|
integer isync;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct lpc10_decoder_state {
|
||||||
|
|
||||||
|
/* State used by function decode */
|
||||||
|
integer iptold; /* initial value 60 */
|
||||||
|
logical first; /* initial value TRUE_ */
|
||||||
|
integer ivp2h;
|
||||||
|
integer iovoic;
|
||||||
|
integer iavgp; /* initial value 60 */
|
||||||
|
integer erate;
|
||||||
|
integer drc[30] /* was [3][10] */;
|
||||||
|
integer dpit[3];
|
||||||
|
integer drms[3];
|
||||||
|
|
||||||
|
/* State used by function synths */
|
||||||
|
real buf[360];
|
||||||
|
integer buflen; /* initial value 180 */
|
||||||
|
|
||||||
|
/* State used by function pitsyn */
|
||||||
|
integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||||
|
integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||||
|
real rmso; /* initial value 1.f */
|
||||||
|
real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||||
|
integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
||||||
|
logical first_pitsyn; /* initial value TRUE_ */
|
||||||
|
|
||||||
|
/* State used by function bsynz */
|
||||||
|
integer ipo;
|
||||||
|
real exc[166];
|
||||||
|
real exc2[166];
|
||||||
|
real lpi1;
|
||||||
|
real lpi2;
|
||||||
|
real lpi3;
|
||||||
|
real hpi1;
|
||||||
|
real hpi2;
|
||||||
|
real hpi3;
|
||||||
|
real rmso_bsynz;
|
||||||
|
|
||||||
|
/* State used by function random */
|
||||||
|
integer j; /* initial value 2 */
|
||||||
|
integer k; /* initial value 5 */
|
||||||
|
shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */
|
||||||
|
|
||||||
|
/* State used by function deemp */
|
||||||
|
real dei1;
|
||||||
|
real dei2;
|
||||||
|
real deo1;
|
||||||
|
real deo2;
|
||||||
|
real deo3;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Calling sequence:
|
||||||
|
|
||||||
|
Call create_lpc10_encoder_state(), which returns a pointer to an
|
||||||
|
already initialized lpc10_encoder_state structure.
|
||||||
|
|
||||||
|
lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
|
||||||
|
array speech[], and writes indices 0 through
|
||||||
|
(LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
|
||||||
|
and writes the lpc10_encoder_state structure contents. The
|
||||||
|
lpc10_encoder_state structure should *not* be initialized for every
|
||||||
|
frame of encoded speech. Once at the beginning of execution, done
|
||||||
|
automatically for you by create_lpc10_encoder_state(), is enough.
|
||||||
|
|
||||||
|
init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
|
||||||
|
structure. This might be useful if you are finished processing one
|
||||||
|
sound sample, and want to reuse the same lpc10_encoder_state
|
||||||
|
structure to process another sound sample. There might be other
|
||||||
|
uses as well.
|
||||||
|
|
||||||
|
Note that the comments in the lpc10/lpcenc.c file imply that indices
|
||||||
|
1 through 180 of array speech[] are read. These comments were
|
||||||
|
written for the Fortran version of the code, before it was
|
||||||
|
automatically converted to C by the conversion program f2c. f2c
|
||||||
|
seems to use the convention that the pointers to arrays passed as
|
||||||
|
function arguments point to the first index used in the Fortran
|
||||||
|
code, whatever index that might be (usually 1), and then it modifies
|
||||||
|
the pointer inside of the function, like so:
|
||||||
|
|
||||||
|
if (speech) {
|
||||||
|
--speech;
|
||||||
|
}
|
||||||
|
|
||||||
|
So that the code can access the first value at index 1 and the last
|
||||||
|
at index 180. This makes the translated C code "closer" to the
|
||||||
|
original Fortran code.
|
||||||
|
|
||||||
|
The calling sequence for the decoder is similar to the encoder. The
|
||||||
|
only significant difference is that the array bits[] is read
|
||||||
|
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
|
||||||
|
array speech[] is written (indices 0 through
|
||||||
|
(LPC10_SAMPLES_PER_FRAME-1)).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct lpc10_encoder_state * create_lpc10_encoder_state ();
|
||||||
|
void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
|
||||||
|
int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
|
||||||
|
|
||||||
|
struct lpc10_decoder_state * create_lpc10_decoder_state ();
|
||||||
|
void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
|
||||||
|
int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
|
||||||
|
|
||||||
|
#endif /* __LPC10_H__ */
|
@@ -54,6 +54,7 @@ struct ast_frame_chain {
|
|||||||
#define AST_FRAME_VIDEO 3 /* Video frame, maybe?? :) */
|
#define AST_FRAME_VIDEO 3 /* Video frame, maybe?? :) */
|
||||||
#define AST_FRAME_CONTROL 4 /* A control frame, subclass is AST_CONTROL_* */
|
#define AST_FRAME_CONTROL 4 /* A control frame, subclass is AST_CONTROL_* */
|
||||||
#define AST_FRAME_NULL 5 /* An empty, useless frame */
|
#define AST_FRAME_NULL 5 /* An empty, useless frame */
|
||||||
|
#define AST_FRAME_IAX 6 /* Inter Aterisk Exchange private frame type */
|
||||||
|
|
||||||
/* Data formats for capabilities and frames alike */
|
/* Data formats for capabilities and frames alike */
|
||||||
#define AST_FORMAT_G723_1 (1 << 0) /* G.723.1 compression */
|
#define AST_FORMAT_G723_1 (1 << 0) /* G.723.1 compression */
|
||||||
@@ -61,8 +62,9 @@ struct ast_frame_chain {
|
|||||||
#define AST_FORMAT_ULAW (1 << 2) /* Raw mu-law data (G.711) */
|
#define AST_FORMAT_ULAW (1 << 2) /* Raw mu-law data (G.711) */
|
||||||
#define AST_FORMAT_ALAW (1 << 3) /* Raw A-law data (G.711) */
|
#define AST_FORMAT_ALAW (1 << 3) /* Raw A-law data (G.711) */
|
||||||
#define AST_FORMAT_MP3 (1 << 4) /* MPEG-2 layer 3 */
|
#define AST_FORMAT_MP3 (1 << 4) /* MPEG-2 layer 3 */
|
||||||
#define AST_FORMAT_ADPCM (1 << 5) /* ADPCM */
|
#define AST_FORMAT_ADPCM (1 << 5) /* ADPCM (whose?) */
|
||||||
#define AST_FORMAT_SLINEAR (1 << 6) /* Raw 16-bit Signed Linear (8000 Hz) PCM */
|
#define AST_FORMAT_SLINEAR (1 << 6) /* Raw 16-bit Signed Linear (8000 Hz) PCM */
|
||||||
|
#define AST_FORMAT_LPC10 (1 << 7) /* LPC10, 180 samples/frame */
|
||||||
#define AST_FORMAT_MAX_AUDIO (1 << 15) /* Maximum audio format */
|
#define AST_FORMAT_MAX_AUDIO (1 << 15) /* Maximum audio format */
|
||||||
#define AST_FORMAT_JPEG (1 << 16) /* JPEG Images */
|
#define AST_FORMAT_JPEG (1 << 16) /* JPEG Images */
|
||||||
#define AST_FORMAT_PNG (1 << 17) /* PNG Images */
|
#define AST_FORMAT_PNG (1 << 17) /* PNG Images */
|
||||||
@@ -91,8 +93,21 @@ void ast_frfree(struct ast_frame *fr);
|
|||||||
you should call this function. */
|
you should call this function. */
|
||||||
struct ast_frame *ast_frisolate(struct ast_frame *fr);
|
struct ast_frame *ast_frisolate(struct ast_frame *fr);
|
||||||
|
|
||||||
|
/* Dupliates a frame -- should only rarely be used, typically frisolate is
|
||||||
|
good enough */
|
||||||
|
struct ast_frame *ast_frdup(struct ast_frame *fr);
|
||||||
|
|
||||||
void ast_frchain(struct ast_frame_chain *fc);
|
void ast_frchain(struct ast_frame_chain *fc);
|
||||||
|
|
||||||
|
/* Read a frame from a stream or packet fd, as written by fd_write */
|
||||||
|
struct ast_frame *ast_fr_fdread(int fd);
|
||||||
|
|
||||||
|
/* Write a frame to an fd */
|
||||||
|
int ast_fr_fdwrite(int fd, struct ast_frame *frame);
|
||||||
|
|
||||||
|
/* Get a format by its name */
|
||||||
|
extern int ast_getformatbyname(char *name);
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user