G711Code.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package com.easygbs.easygbd.push;
  2. /**
  3. * 核心转换
  4. * Created by Magic.XL
  5. */
  6. public class G711Code {
  7. private final static int SIGN_BIT = 0x80;
  8. private final static int QUANT_MASK = 0xf;
  9. private final static int SEG_SHIFT = 4;
  10. private final static int SEG_MASK = 0x70;
  11. static short[] seg_end = {0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
  12. static short search(short val, short[] table, short size) {
  13. for (short i = 0; i < size; i++) {
  14. if (val <= table[i]) {
  15. return i;
  16. }
  17. }
  18. return size;
  19. }
  20. static byte linear2alaw(short pcm_val) {
  21. short mask;
  22. short seg;
  23. char aval;
  24. if (pcm_val >= 0) {
  25. mask = 0xD5;
  26. } else {
  27. mask = 0x55;
  28. pcm_val = (short) (-pcm_val - 1);
  29. if (pcm_val < 0) {
  30. pcm_val = 32767;
  31. }
  32. }
  33. /* Convert the scaled magnitude to segment number. */
  34. seg = search(pcm_val, seg_end, (short) 8);
  35. /* Combine the sign, segment, and quantization bits. */
  36. if (seg >= 8) /* out of range, return maximum value. */
  37. return (byte) (0x7F ^ mask);
  38. else {
  39. aval = (char) (seg << SEG_SHIFT);
  40. if (seg < 2)
  41. aval |= (pcm_val >> 4) & QUANT_MASK;
  42. else
  43. aval |= (pcm_val >> (seg + 3)) & QUANT_MASK;
  44. return (byte) (aval ^ mask);
  45. }
  46. }
  47. static short alaw2linear(byte a_val) {
  48. short t;
  49. short seg;
  50. a_val ^= 0x55;
  51. t = (short) ((a_val & QUANT_MASK) << 4);
  52. seg = (short) ((a_val & SEG_MASK) >> SEG_SHIFT);
  53. switch (seg) {
  54. case 0:
  55. t += 8;
  56. break;
  57. case 1:
  58. t += 0x108;
  59. break;
  60. default:
  61. t += 0x108;
  62. t <<= seg - 1;
  63. }
  64. return (a_val & SIGN_BIT) != 0 ? t : (short) -t;
  65. }
  66. /**
  67. * pcm 转 G711 a率
  68. *
  69. * @param pcm
  70. * @param code
  71. * @param size
  72. */
  73. public static void G711aEncoder(short[] pcm, byte[] code, int size) {
  74. for (int i = 0; i < size; i++) {
  75. code[i] = linear2alaw(pcm[i]);
  76. }
  77. }
  78. /**
  79. * G.711 转 PCM
  80. *
  81. * @param pcm
  82. * @param code
  83. * @param size
  84. */
  85. public static void G711aDecoder(short[] pcm, byte[] code, int size) {
  86. for (int i = 0; i < size; i++) {
  87. pcm[i] = alaw2linear(code[i]);
  88. }
  89. }
  90. }