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: g722.h,v 1.10 2006/06/16 12:45:53 steveu Exp $
22 *
23 * Modifications for WebRtc, 2011/04/28, by tlegrand:
24 * -Changed to use WebRtc types
25 * -Added new defines for minimum and maximum values of short int
26 */
27
28
29/*! \file */
30
31#if !defined(_G722_ENC_DEC_H_)
32#define _G722_ENC_DEC_H_
33
34#include "webrtc/typedefs.h"
35
36/*! \page g722_page G.722 encoding and decoding
37\section g722_page_sec_1 What does it do?
38The G.722 module is a bit exact implementation of the ITU G.722 specification for all three
39specified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests.
40
41To allow fast and flexible interworking with narrow band telephony, the encoder and decoder
42support an option for the linear audio to be an 8k samples/second stream. In this mode the
43codec is considerably faster, and still fully compatible with wideband terminals using G.722.
44
45\section g722_page_sec_2 How does it work?
46???.
47*/
48
49#define WEBRTC_INT16_MAX 32767
50#define WEBRTC_INT16_MIN -32768
51
52enum
53{
54    G722_SAMPLE_RATE_8000 = 0x0001,
55    G722_PACKED = 0x0002
56};
57
58typedef struct
59{
60    /*! TRUE if the operating in the special ITU test mode, with the band split filters
61             disabled. */
62    int itu_test_mode;
63    /*! TRUE if the G.722 data is packed */
64    int packed;
65    /*! TRUE if encode from 8k samples/second */
66    int eight_k;
67    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
68    int bits_per_sample;
69
70    /*! Signal history for the QMF */
71    int x[24];
72
73    struct
74    {
75        int s;
76        int sp;
77        int sz;
78        int r[3];
79        int a[3];
80        int ap[3];
81        int p[3];
82        int d[7];
83        int b[7];
84        int bp[7];
85        int sg[7];
86        int nb;
87        int det;
88    } band[2];
89
90    unsigned int in_buffer;
91    int in_bits;
92    unsigned int out_buffer;
93    int out_bits;
94} g722_encode_state_t;
95
96typedef struct
97{
98    /*! TRUE if the operating in the special ITU test mode, with the band split filters
99             disabled. */
100    int itu_test_mode;
101    /*! TRUE if the G.722 data is packed */
102    int packed;
103    /*! TRUE if decode to 8k samples/second */
104    int eight_k;
105    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
106    int bits_per_sample;
107
108    /*! Signal history for the QMF */
109    int x[24];
110
111    struct
112    {
113        int s;
114        int sp;
115        int sz;
116        int r[3];
117        int a[3];
118        int ap[3];
119        int p[3];
120        int d[7];
121        int b[7];
122        int bp[7];
123        int sg[7];
124        int nb;
125        int det;
126    } band[2];
127
128    unsigned int in_buffer;
129    int in_bits;
130    unsigned int out_buffer;
131    int out_bits;
132} g722_decode_state_t;
133
134#ifdef __cplusplus
135extern "C" {
136#endif
137
138g722_encode_state_t *WebRtc_g722_encode_init(g722_encode_state_t *s,
139                                             int rate,
140                                             int options);
141int WebRtc_g722_encode_release(g722_encode_state_t *s);
142int WebRtc_g722_encode(g722_encode_state_t *s,
143                       uint8_t g722_data[],
144                       const int16_t amp[],
145                       int len);
146
147g722_decode_state_t *WebRtc_g722_decode_init(g722_decode_state_t *s,
148                                             int rate,
149                                             int options);
150int WebRtc_g722_decode_release(g722_decode_state_t *s);
151int WebRtc_g722_decode(g722_decode_state_t *s,
152                       int16_t amp[],
153                       const uint8_t g722_data[],
154                       int len);
155
156#ifdef __cplusplus
157}
158#endif
159
160#endif
161