95a9da8d01c22ff93afd7fd92fcf50255afb0fe1
[asterisk/asterisk.git] / codecs / g722 / g722.h
1 /*
2  * SpanDSP - a series of DSP components for telephony
3  *
4  * g722.h - The ITU G.722 codec.
5  *
6  * Written by Steve Underwood <steveu@coppice.org>
7  *
8  * Copyright (C) 2005 Steve Underwood
9  *
10  *  Despite my general liking of the GPL, I place my own contributions 
11  *  to this code in the public domain for the benefit of all mankind -
12  *  even the slimy ones who might try to proprietize my work and use it
13  *  to my detriment.
14  *
15  * Based on a single channel G.722 codec which is:
16  *
17  *****    Copyright (c) CMU    1993      *****
18  * Computer Science, Speech Group
19  * Chengxiang Lu and Alex Hauptmann
20  *
21  * $Id$
22  */
23
24
25 /*! \file */
26
27 #if !defined(_G722_H_)
28 #define _G722_H_
29
30 /*! \page g722_page G.722 encoding and decoding
31 \section g722_page_sec_1 What does it do?
32 The G.722 module is a bit exact implementation of the ITU G.722 specification for all three
33 specified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests.
34
35 To allow fast and flexible interworking with narrow band telephony, the encoder and decoder
36 support an option for the linear audio to be an 8k samples/second stream. In this mode the
37 codec is considerably faster, and still fully compatible with wideband terminals using G.722.
38
39 \section g722_page_sec_2 How does it work?
40 ???.
41 */
42
43 enum
44 {
45     G722_SAMPLE_RATE_8000 = 0x0001,
46     G722_PACKED = 0x0002
47 };
48
49 typedef struct
50 {
51     /*! TRUE if the operating in the special ITU test mode, with the band split filters
52              disabled. */
53     int itu_test_mode;
54     /*! TRUE if the G.722 data is packed */
55     int packed;
56     /*! TRUE if encode from 8k samples/second */
57     int eight_k;
58     /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
59     int bits_per_sample;
60
61     /*! Signal history for the QMF */
62     int x[24];
63
64     struct
65     {
66         int s;
67         int sp;
68         int sz;
69         int r[3];
70         int a[3];
71         int ap[3];
72         int p[3];
73         int d[7];
74         int b[7];
75         int bp[7];
76         int sg[7];
77         int nb;
78         int det;
79     } band[2];
80
81     unsigned int in_buffer;
82     int in_bits;
83     unsigned int out_buffer;
84     int out_bits;
85 } g722_encode_state_t;
86
87 typedef struct
88 {
89     /*! TRUE if the operating in the special ITU test mode, with the band split filters
90              disabled. */
91     int itu_test_mode;
92     /*! TRUE if the G.722 data is packed */
93     int packed;
94     /*! TRUE if decode to 8k samples/second */
95     int eight_k;
96     /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
97     int bits_per_sample;
98
99     /*! Signal history for the QMF */
100     int x[24];
101
102     struct
103     {
104         int s;
105         int sp;
106         int sz;
107         int r[3];
108         int a[3];
109         int ap[3];
110         int p[3];
111         int d[7];
112         int b[7];
113         int bp[7];
114         int sg[7];
115         int nb;
116         int det;
117     } band[2];
118     
119     unsigned int in_buffer;
120     int in_bits;
121     unsigned int out_buffer;
122     int out_bits;
123 } g722_decode_state_t;
124
125 #ifdef __cplusplus
126 extern "C" {
127 #endif
128
129 g722_encode_state_t *g722_encode_init(g722_encode_state_t *s, int rate, int options);
130 int g722_encode_release(g722_encode_state_t *s);
131 int g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const int16_t amp[], int len);
132
133 g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, int rate, int options);
134 int g722_decode_release(g722_decode_state_t *s);
135 int g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len);
136
137 #ifdef __cplusplus
138 }
139 #endif
140
141 #endif