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

语音压缩

开发平台:

C/C++

  1. /*
  2.  * encode.c
  3.  *
  4.  * CCITT ADPCM encoder
  5.  *
  6.  * Usage : encode [-3|4|5] [-a|u|l] < infile > outfile
  7.  */
  8. #include <stdio.h>
  9. #include "g72x.h"
  10. /*
  11.  * Pack output codes into bytes and write them to stdout.
  12.  * Returns 1 if there is residual output, else returns 0.
  13.  */
  14. int
  15. pack_output(
  16. unsigned code,
  17. int bits)
  18. {
  19. static unsigned int out_buffer = 0;
  20. static int out_bits = 0;
  21. unsigned char out_byte;
  22. out_buffer |= (code << out_bits);
  23. out_bits += bits;
  24. if (out_bits >= 8) {
  25. out_byte = out_buffer & 0xff;
  26. out_bits -= 8;
  27. out_buffer >>= 8;
  28. fwrite(&out_byte, sizeof (char), 1, stdout);
  29. }
  30. return (out_bits > 0);
  31. }
  32. main(
  33. int argc,
  34. char **argv)
  35. {
  36. struct g72x_state state;
  37. unsigned char sample_char;
  38. short sample_short;
  39. unsigned char code;
  40. int resid;
  41. int in_coding;
  42. int in_size;
  43. unsigned *in_buf;
  44. int (*enc_routine)();
  45. int enc_bits;
  46. g72x_init_state(&state);
  47. /* Set defaults to u-law input, G.721 output */
  48. in_coding = AUDIO_ENCODING_ULAW;
  49. in_size = sizeof (char);
  50. in_buf = (unsigned *)&sample_char;
  51. enc_routine = g721_encoder;
  52. enc_bits = 4;
  53. /* Process encoding argument, if any */
  54. while ((argc > 1) && (argv[1][0] == '-')) {
  55. switch (argv[1][1]) {
  56. case '3':
  57. enc_routine = g723_24_encoder;
  58. enc_bits = 3;
  59. break;
  60. case '4':
  61. enc_routine = g721_encoder;
  62. enc_bits = 4;
  63. break;
  64. case '5':
  65. enc_routine = g723_40_encoder;
  66. enc_bits = 5;
  67. break;
  68. case 'u':
  69. in_coding = AUDIO_ENCODING_ULAW;
  70. in_size = sizeof (char);
  71. in_buf = (unsigned *)&sample_char;
  72. break;
  73. case 'a':
  74. in_coding = AUDIO_ENCODING_ALAW;
  75. in_size = sizeof (char);
  76. in_buf = (unsigned *)&sample_char;
  77. break;
  78. case 'l':
  79. in_coding = AUDIO_ENCODING_LINEAR;
  80. in_size = sizeof (short);
  81. in_buf = (unsigned *)&sample_short;
  82. break;
  83. default:
  84. fprintf(stderr, "CCITT ADPCM Encoder -- usage:n");
  85. fprintf(stderr, "tencode [-3|4|5] [-a|u|l] < infile > outfilen");
  86. fprintf(stderr, "where:n");
  87. fprintf(stderr, "t-3tGenerate G.723 24kbps (3-bit) datan");
  88. fprintf(stderr, "t-4tGenerate G.721 32kbps (4-bit) data [default]n");
  89. fprintf(stderr, "t-5tGenerate G.723 40kbps (5-bit) datan");
  90. fprintf(stderr, "t-atProcess 8-bit A-law input datan");
  91. fprintf(stderr, "t-utProcess 8-bit u-law input data [default]n");
  92. fprintf(stderr, "t-ltProcess 16-bit linear PCM input datan");
  93. exit(1);
  94. }
  95. argc--;
  96. argv++;
  97. }
  98. /* Read input file and process */
  99. while (fread(in_buf, in_size, 1, stdin) == 1) {
  100. code = (*enc_routine)(in_size == 2 ? sample_short : sample_char,
  101.     in_coding, &state);
  102. resid = pack_output(code, enc_bits);
  103. }
  104. /* Write zero codes until all residual codes are written out */
  105. while (resid) {
  106. resid = pack_output(0, enc_bits);
  107. }
  108. fclose(stdout);
  109. }