encode.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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