1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * SpanDSP - a series of DSP components for telephony
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * g722.h - The ITU G.722 codec.
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Written by Steve Underwood <steveu@coppice.org>
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Copyright (C) 2005 Steve Underwood
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Despite my general liking of the GPL, I place my own contributions
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  to this code in the public domain for the benefit of all mankind -
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  even the slimy ones who might try to proprietize my work and use it
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  to my detriment.
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Based on a single channel G.722 codec which is:
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *****    Copyright (c) CMU    1993      *****
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Computer Science, Speech Group
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Chengxiang Lu and Alex Hauptmann
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * $Id: g722.h,v 1.10 2006/06/16 12:45:53 steveu Exp $
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Modifications for WebRtc, 2011/04/28, by tlegrand:
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * -Changed to use WebRtc types
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * -Added new defines for minimum and maximum values of short int
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*! \file */
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#if !defined(_G722_ENC_DEC_H_)
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define _G722_ENC_DEC_H_
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
34262e676a08fc29ee6c414f5858d68697be983515andresp@webrtc.org#include "webrtc/typedefs.h"
35262e676a08fc29ee6c414f5858d68697be983515andresp@webrtc.org
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*! \page g722_page G.722 encoding and decoding
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com\section g722_page_sec_1 What does it do?
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comThe G.722 module is a bit exact implementation of the ITU G.722 specification for all three
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comspecified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests.
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comTo allow fast and flexible interworking with narrow band telephony, the encoder and decoder
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comsupport an option for the linear audio to be an 8k samples/second stream. In this mode the
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comcodec is considerably faster, and still fully compatible with wideband terminals using G.722.
44470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com\section g722_page_sec_2 How does it work?
46470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com???.
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com*/
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_INT16_MAX 32767
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_INT16_MIN -32768
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comenum
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    G722_SAMPLE_RATE_8000 = 0x0001,
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    G722_PACKED = 0x0002
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comtypedef struct
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if the operating in the special ITU test mode, with the band split filters
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com             disabled. */
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int itu_test_mode;
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if the G.722 data is packed */
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int packed;
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if encode from 8k samples/second */
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int eight_k;
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int bits_per_sample;
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! Signal history for the QMF */
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int x[24];
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    struct
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int s;
76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sp;
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sz;
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int r[3];
79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int a[3];
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int ap[3];
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int p[3];
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int d[7];
83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int b[7];
84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int bp[7];
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sg[7];
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int nb;
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int det;
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } band[2];
89470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned int in_buffer;
91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int in_bits;
92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned int out_buffer;
93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int out_bits;
94eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org} G722EncoderState;
95470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comtypedef struct
97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if the operating in the special ITU test mode, with the band split filters
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com             disabled. */
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int itu_test_mode;
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if the G.722 data is packed */
102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int packed;
103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! TRUE if decode to 8k samples/second */
104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int eight_k;
105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int bits_per_sample;
107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    /*! Signal history for the QMF */
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int x[24];
110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    struct
112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int s;
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sp;
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sz;
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int r[3];
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int a[3];
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int ap[3];
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int p[3];
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int d[7];
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int b[7];
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int bp[7];
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int sg[7];
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int nb;
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        int det;
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    } band[2];
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned int in_buffer;
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int in_bits;
130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    unsigned int out_buffer;
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    int out_bits;
132eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org} G722DecoderState;
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef __cplusplus
135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comextern "C" {
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
138eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.orgG722EncoderState* WebRtc_g722_encode_init(G722EncoderState* s,
139eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org                                          int rate,
140eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org                                          int options);
141eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.orgint WebRtc_g722_encode_release(G722EncoderState *s);
142dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingsize_t WebRtc_g722_encode(G722EncoderState *s,
143dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          uint8_t g722_data[],
144dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          const int16_t amp[],
145dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          size_t len);
146ebcb6421b19b9dc4852b7c852f93f706aa8cc9fcpwestin@webrtc.org
147eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.orgG722DecoderState* WebRtc_g722_decode_init(G722DecoderState* s,
148eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org                                          int rate,
149eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.org                                          int options);
150eb544460e47140d494dddf1217a698a1dcf4dee0pbos@webrtc.orgint WebRtc_g722_decode_release(G722DecoderState *s);
151dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingsize_t WebRtc_g722_decode(G722DecoderState *s,
152dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          int16_t amp[],
153dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          const uint8_t g722_data[],
154dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          size_t len);
155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef __cplusplus
157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
161