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