1/* 2 * SpanDSP - a series of DSP components for telephony 3 * 4 * g722_encode.c - The ITU G.722 codec, encode part. 5 * 6 * Written by Steve Underwood <steveu@coppice.org> 7 * 8 * Copyright (C) 2005 Steve Underwood 9 * 10 * All rights reserved. 11 * 12 * Despite my general liking of the GPL, I place my own contributions 13 * to this code in the public domain for the benefit of all mankind - 14 * even the slimy ones who might try to proprietize my work and use it 15 * to my detriment. 16 * 17 * Based on a single channel 64kbps only G.722 codec which is: 18 * 19 ***** Copyright (c) CMU 1993 ***** 20 * Computer Science, Speech Group 21 * Chengxiang Lu and Alex Hauptmann 22 * 23 * $Id: g722_encode.c,v 1.14 2006/07/07 16:37:49 steveu Exp $ 24 * 25 * Modifications for WebRtc, 2011/04/28, by tlegrand: 26 * -Removed usage of inttypes.h and tgmath.h 27 * -Changed to use WebRtc types 28 * -Added option to run encoder bitexact with ITU-T reference implementation 29 */ 30 31/*! \file */ 32 33#ifdef HAVE_CONFIG_H 34#include <config.h> 35#endif 36 37#include <memory.h> 38#include <stdio.h> 39#include <stdlib.h> 40 41#include "g722_enc_dec.h" 42#include "webrtc/typedefs.h" 43 44#if !defined(FALSE) 45#define FALSE 0 46#endif 47#if !defined(TRUE) 48#define TRUE (!FALSE) 49#endif 50 51static __inline int16_t saturate(int32_t amp) 52{ 53 int16_t amp16; 54 55 /* Hopefully this is optimised for the common case - not clipping */ 56 amp16 = (int16_t) amp; 57 if (amp == amp16) 58 return amp16; 59 if (amp > WEBRTC_INT16_MAX) 60 return WEBRTC_INT16_MAX; 61 return WEBRTC_INT16_MIN; 62} 63/*- End of function --------------------------------------------------------*/ 64 65static void block4(G722EncoderState *s, int band, int d) 66{ 67 int wd1; 68 int wd2; 69 int wd3; 70 int i; 71 72 /* Block 4, RECONS */ 73 s->band[band].d[0] = d; 74 s->band[band].r[0] = saturate(s->band[band].s + d); 75 76 /* Block 4, PARREC */ 77 s->band[band].p[0] = saturate(s->band[band].sz + d); 78 79 /* Block 4, UPPOL2 */ 80 for (i = 0; i < 3; i++) 81 s->band[band].sg[i] = s->band[band].p[i] >> 15; 82 wd1 = saturate(s->band[band].a[1] << 2); 83 84 wd2 = (s->band[band].sg[0] == s->band[band].sg[1]) ? -wd1 : wd1; 85 if (wd2 > 32767) 86 wd2 = 32767; 87 wd3 = (wd2 >> 7) + ((s->band[band].sg[0] == s->band[band].sg[2]) ? 128 : -128); 88 wd3 += (s->band[band].a[2]*32512) >> 15; 89 if (wd3 > 12288) 90 wd3 = 12288; 91 else if (wd3 < -12288) 92 wd3 = -12288; 93 s->band[band].ap[2] = wd3; 94 95 /* Block 4, UPPOL1 */ 96 s->band[band].sg[0] = s->band[band].p[0] >> 15; 97 s->band[band].sg[1] = s->band[band].p[1] >> 15; 98 wd1 = (s->band[band].sg[0] == s->band[band].sg[1]) ? 192 : -192; 99 wd2 = (s->band[band].a[1]*32640) >> 15; 100 101 s->band[band].ap[1] = saturate(wd1 + wd2); 102 wd3 = saturate(15360 - s->band[band].ap[2]); 103 if (s->band[band].ap[1] > wd3) 104 s->band[band].ap[1] = wd3; 105 else if (s->band[band].ap[1] < -wd3) 106 s->band[band].ap[1] = -wd3; 107 108 /* Block 4, UPZERO */ 109 wd1 = (d == 0) ? 0 : 128; 110 s->band[band].sg[0] = d >> 15; 111 for (i = 1; i < 7; i++) 112 { 113 s->band[band].sg[i] = s->band[band].d[i] >> 15; 114 wd2 = (s->band[band].sg[i] == s->band[band].sg[0]) ? wd1 : -wd1; 115 wd3 = (s->band[band].b[i]*32640) >> 15; 116 s->band[band].bp[i] = saturate(wd2 + wd3); 117 } 118 119 /* Block 4, DELAYA */ 120 for (i = 6; i > 0; i--) 121 { 122 s->band[band].d[i] = s->band[band].d[i - 1]; 123 s->band[band].b[i] = s->band[band].bp[i]; 124 } 125 126 for (i = 2; i > 0; i--) 127 { 128 s->band[band].r[i] = s->band[band].r[i - 1]; 129 s->band[band].p[i] = s->band[band].p[i - 1]; 130 s->band[band].a[i] = s->band[band].ap[i]; 131 } 132 133 /* Block 4, FILTEP */ 134 wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]); 135 wd1 = (s->band[band].a[1]*wd1) >> 15; 136 wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]); 137 wd2 = (s->band[band].a[2]*wd2) >> 15; 138 s->band[band].sp = saturate(wd1 + wd2); 139 140 /* Block 4, FILTEZ */ 141 s->band[band].sz = 0; 142 for (i = 6; i > 0; i--) 143 { 144 wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]); 145 s->band[band].sz += (s->band[band].b[i]*wd1) >> 15; 146 } 147 s->band[band].sz = saturate(s->band[band].sz); 148 149 /* Block 4, PREDIC */ 150 s->band[band].s = saturate(s->band[band].sp + s->band[band].sz); 151} 152/*- End of function --------------------------------------------------------*/ 153 154G722EncoderState* WebRtc_g722_encode_init(G722EncoderState* s, 155 int rate, 156 int options) { 157 if (s == NULL) 158 { 159 if ((s = (G722EncoderState *) malloc(sizeof(*s))) == NULL) 160 return NULL; 161 } 162 memset(s, 0, sizeof(*s)); 163 if (rate == 48000) 164 s->bits_per_sample = 6; 165 else if (rate == 56000) 166 s->bits_per_sample = 7; 167 else 168 s->bits_per_sample = 8; 169 if ((options & G722_SAMPLE_RATE_8000)) 170 s->eight_k = TRUE; 171 if ((options & G722_PACKED) && s->bits_per_sample != 8) 172 s->packed = TRUE; 173 else 174 s->packed = FALSE; 175 s->band[0].det = 32; 176 s->band[1].det = 8; 177 return s; 178} 179/*- End of function --------------------------------------------------------*/ 180 181int WebRtc_g722_encode_release(G722EncoderState *s) 182{ 183 free(s); 184 return 0; 185} 186/*- End of function --------------------------------------------------------*/ 187 188/* WebRtc, tlegrand: 189 * Only define the following if bit-exactness with reference implementation 190 * is needed. Will only have any effect if input signal is saturated. 191 */ 192//#define RUN_LIKE_REFERENCE_G722 193#ifdef RUN_LIKE_REFERENCE_G722 194int16_t limitValues (int16_t rl) 195{ 196 197 int16_t yl; 198 199 yl = (rl > 16383) ? 16383 : ((rl < -16384) ? -16384 : rl); 200 201 return (yl); 202} 203#endif 204 205size_t WebRtc_g722_encode(G722EncoderState *s, uint8_t g722_data[], 206 const int16_t amp[], size_t len) 207{ 208 static const int q6[32] = 209 { 210 0, 35, 72, 110, 150, 190, 233, 276, 211 323, 370, 422, 473, 530, 587, 650, 714, 212 786, 858, 940, 1023, 1121, 1219, 1339, 1458, 213 1612, 1765, 1980, 2195, 2557, 2919, 0, 0 214 }; 215 static const int iln[32] = 216 { 217 0, 63, 62, 31, 30, 29, 28, 27, 218 26, 25, 24, 23, 22, 21, 20, 19, 219 18, 17, 16, 15, 14, 13, 12, 11, 220 10, 9, 8, 7, 6, 5, 4, 0 221 }; 222 static const int ilp[32] = 223 { 224 0, 61, 60, 59, 58, 57, 56, 55, 225 54, 53, 52, 51, 50, 49, 48, 47, 226 46, 45, 44, 43, 42, 41, 40, 39, 227 38, 37, 36, 35, 34, 33, 32, 0 228 }; 229 static const int wl[8] = 230 { 231 -60, -30, 58, 172, 334, 538, 1198, 3042 232 }; 233 static const int rl42[16] = 234 { 235 0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0 236 }; 237 static const int ilb[32] = 238 { 239 2048, 2093, 2139, 2186, 2233, 2282, 2332, 240 2383, 2435, 2489, 2543, 2599, 2656, 2714, 241 2774, 2834, 2896, 2960, 3025, 3091, 3158, 242 3228, 3298, 3371, 3444, 3520, 3597, 3676, 243 3756, 3838, 3922, 4008 244 }; 245 static const int qm4[16] = 246 { 247 0, -20456, -12896, -8968, 248 -6288, -4240, -2584, -1200, 249 20456, 12896, 8968, 6288, 250 4240, 2584, 1200, 0 251 }; 252 static const int qm2[4] = 253 { 254 -7408, -1616, 7408, 1616 255 }; 256 static const int qmf_coeffs[12] = 257 { 258 3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11, 259 }; 260 static const int ihn[3] = {0, 1, 0}; 261 static const int ihp[3] = {0, 3, 2}; 262 static const int wh[3] = {0, -214, 798}; 263 static const int rh2[4] = {2, 1, 2, 1}; 264 265 int dlow; 266 int dhigh; 267 int el; 268 int wd; 269 int wd1; 270 int ril; 271 int wd2; 272 int il4; 273 int ih2; 274 int wd3; 275 int eh; 276 int mih; 277 int i; 278 size_t j; 279 /* Low and high band PCM from the QMF */ 280 int xlow; 281 int xhigh; 282 size_t g722_bytes; 283 /* Even and odd tap accumulators */ 284 int sumeven; 285 int sumodd; 286 int ihigh; 287 int ilow; 288 int code; 289 290 g722_bytes = 0; 291 xhigh = 0; 292 for (j = 0; j < len; ) 293 { 294 if (s->itu_test_mode) 295 { 296 xlow = 297 xhigh = amp[j++] >> 1; 298 } 299 else 300 { 301 if (s->eight_k) 302 { 303 /* We shift by 1 to allow for the 15 bit input to the G.722 algorithm. */ 304 xlow = amp[j++] >> 1; 305 } 306 else 307 { 308 /* Apply the transmit QMF */ 309 /* Shuffle the buffer down */ 310 for (i = 0; i < 22; i++) 311 s->x[i] = s->x[i + 2]; 312 s->x[22] = amp[j++]; 313 s->x[23] = amp[j++]; 314 315 /* Discard every other QMF output */ 316 sumeven = 0; 317 sumodd = 0; 318 for (i = 0; i < 12; i++) 319 { 320 sumodd += s->x[2*i]*qmf_coeffs[i]; 321 sumeven += s->x[2*i + 1]*qmf_coeffs[11 - i]; 322 } 323 /* We shift by 12 to allow for the QMF filters (DC gain = 4096), plus 1 324 to allow for us summing two filters, plus 1 to allow for the 15 bit 325 input to the G.722 algorithm. */ 326 xlow = (sumeven + sumodd) >> 14; 327 xhigh = (sumeven - sumodd) >> 14; 328 329#ifdef RUN_LIKE_REFERENCE_G722 330 /* The following lines are only used to verify bit-exactness 331 * with reference implementation of G.722. Higher precision 332 * is achieved without limiting the values. 333 */ 334 xlow = limitValues(xlow); 335 xhigh = limitValues(xhigh); 336#endif 337 } 338 } 339 /* Block 1L, SUBTRA */ 340 el = saturate(xlow - s->band[0].s); 341 342 /* Block 1L, QUANTL */ 343 wd = (el >= 0) ? el : -(el + 1); 344 345 for (i = 1; i < 30; i++) 346 { 347 wd1 = (q6[i]*s->band[0].det) >> 12; 348 if (wd < wd1) 349 break; 350 } 351 ilow = (el < 0) ? iln[i] : ilp[i]; 352 353 /* Block 2L, INVQAL */ 354 ril = ilow >> 2; 355 wd2 = qm4[ril]; 356 dlow = (s->band[0].det*wd2) >> 15; 357 358 /* Block 3L, LOGSCL */ 359 il4 = rl42[ril]; 360 wd = (s->band[0].nb*127) >> 7; 361 s->band[0].nb = wd + wl[il4]; 362 if (s->band[0].nb < 0) 363 s->band[0].nb = 0; 364 else if (s->band[0].nb > 18432) 365 s->band[0].nb = 18432; 366 367 /* Block 3L, SCALEL */ 368 wd1 = (s->band[0].nb >> 6) & 31; 369 wd2 = 8 - (s->band[0].nb >> 11); 370 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); 371 s->band[0].det = wd3 << 2; 372 373 block4(s, 0, dlow); 374 375 if (s->eight_k) 376 { 377 /* Just leave the high bits as zero */ 378 code = (0xC0 | ilow) >> (8 - s->bits_per_sample); 379 } 380 else 381 { 382 /* Block 1H, SUBTRA */ 383 eh = saturate(xhigh - s->band[1].s); 384 385 /* Block 1H, QUANTH */ 386 wd = (eh >= 0) ? eh : -(eh + 1); 387 wd1 = (564*s->band[1].det) >> 12; 388 mih = (wd >= wd1) ? 2 : 1; 389 ihigh = (eh < 0) ? ihn[mih] : ihp[mih]; 390 391 /* Block 2H, INVQAH */ 392 wd2 = qm2[ihigh]; 393 dhigh = (s->band[1].det*wd2) >> 15; 394 395 /* Block 3H, LOGSCH */ 396 ih2 = rh2[ihigh]; 397 wd = (s->band[1].nb*127) >> 7; 398 s->band[1].nb = wd + wh[ih2]; 399 if (s->band[1].nb < 0) 400 s->band[1].nb = 0; 401 else if (s->band[1].nb > 22528) 402 s->band[1].nb = 22528; 403 404 /* Block 3H, SCALEH */ 405 wd1 = (s->band[1].nb >> 6) & 31; 406 wd2 = 10 - (s->band[1].nb >> 11); 407 wd3 = (wd2 < 0) ? (ilb[wd1] << -wd2) : (ilb[wd1] >> wd2); 408 s->band[1].det = wd3 << 2; 409 410 block4(s, 1, dhigh); 411 code = ((ihigh << 6) | ilow) >> (8 - s->bits_per_sample); 412 } 413 414 if (s->packed) 415 { 416 /* Pack the code bits */ 417 s->out_buffer |= (code << s->out_bits); 418 s->out_bits += s->bits_per_sample; 419 if (s->out_bits >= 8) 420 { 421 g722_data[g722_bytes++] = (uint8_t) (s->out_buffer & 0xFF); 422 s->out_bits -= 8; 423 s->out_buffer >>= 8; 424 } 425 } 426 else 427 { 428 g722_data[g722_bytes++] = (uint8_t) code; 429 } 430 } 431 return g722_bytes; 432} 433/*- End of function --------------------------------------------------------*/ 434/*- End of file ------------------------------------------------------------*/ 435