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