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

流媒体/Mpeg4/MP4

开发平台:

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