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