decode.c
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:3k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.  * decode.c
  3.  *
  4.  * CCITT ADPCM decoder
  5.  *
  6.  * Usage : decode [-3|4|5] [-a|u|l] < infile > outfile
  7.  */
  8. #include <stdio.h>
  9. #include "g72x.h"
  10. /*
  11.  * Unpack input codes and pass them back as bytes.
  12.  * Returns 1 if there is residual input, returns -1 if eof, else returns 0.
  13.  */
  14. int
  15. unpack_input(
  16. unsigned char *code,
  17. int bits)
  18. {
  19. static unsigned int in_buffer = 0;
  20. static int in_bits = 0;
  21. unsigned char in_byte;
  22. if (in_bits < bits) {
  23. if (fread(&in_byte, sizeof (char), 1, stdin) != 1) {
  24. *code = 0;
  25. return (-1);
  26. }
  27. in_buffer |= (in_byte << in_bits);
  28. in_bits += 8;
  29. }
  30. *code = in_buffer & ((1 << bits) - 1);
  31. in_buffer >>= bits;
  32. in_bits -= bits;
  33. return (in_bits > 0);
  34. }
  35. main(
  36. int argc,
  37. char **argv)
  38. {
  39. short sample;
  40. unsigned char code;
  41. int n;
  42. struct g72x_state state;
  43. int out_coding;
  44. int out_size;
  45. int (*dec_routine)();
  46. int dec_bits;
  47. g72x_init_state(&state);
  48. out_coding = AUDIO_ENCODING_ULAW;
  49. out_size = sizeof (char);
  50. dec_routine = g721_decoder;
  51. dec_bits = 4;
  52. /* Process encoding argument, if any */
  53. while ((argc > 1) && (argv[1][0] == '-')) {
  54. switch (argv[1][1]) {
  55. case '3':
  56. dec_routine = g723_24_decoder;
  57. dec_bits = 3;
  58. break;
  59. case '4':
  60. dec_routine = g721_decoder;
  61. dec_bits = 4;
  62. break;
  63. case '5':
  64. dec_routine = g723_40_decoder;
  65. dec_bits = 5;
  66. break;
  67. case 'u':
  68. out_coding = AUDIO_ENCODING_ULAW;
  69. out_size = sizeof (char);
  70. break;
  71. case 'a':
  72. out_coding = AUDIO_ENCODING_ALAW;
  73. out_size = sizeof (char);
  74. break;
  75. case 'l':
  76. out_coding = AUDIO_ENCODING_LINEAR;
  77. out_size = sizeof (short);
  78. break;
  79. default:
  80. fprintf(stderr, "CCITT ADPCM Decoder -- usage:n");
  81. fprintf(stderr, "tdecode [-3|4|5] [-a|u|l] < infile > outfilen");
  82. fprintf(stderr, "where:n");
  83. fprintf(stderr, "t-3tProcess G.723 24kbps (3-bit) input datan");
  84. fprintf(stderr, "t-4tProcess G.721 32kbps (4-bit) input data [default]n");
  85. fprintf(stderr, "t-5tProcess G.723 40kbps (5-bit) input datan");
  86. fprintf(stderr, "t-atGenerate 8-bit A-law datan");
  87. fprintf(stderr, "t-utGenerate 8-bit u-law data [default]n");
  88. fprintf(stderr, "t-ltGenerate 16-bit linear PCM datan");
  89. exit(1);
  90. }
  91. argc--;
  92. argv++;
  93. }
  94. /* Read and unpack input codes and process them */
  95. while (unpack_input(&code, dec_bits) >= 0) {
  96. sample = (*dec_routine)(code, out_coding, &state);
  97. if (out_size == 2) {
  98. fwrite(&sample, out_size, 1, stdout);
  99. } else {
  100. code = (unsigned char)sample;
  101. fwrite(&code, out_size, 1, stdout);
  102. }
  103. }
  104. fclose(stdout);
  105. }