pcm.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:15k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * PCM codecs
  3.  * Copyright (c) 2001 Fabrice Bellard.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19.  
  20. /**
  21.  * @file pcm.c
  22.  * PCM codecs
  23.  */
  24.  
  25. #include "avcodec.h"
  26. #include "bitstream.h" // for ff_reverse
  27. /* from g711.c by SUN microsystems (unrestricted use) */
  28. #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
  29. #define QUANT_MASK (0xf) /* Quantization field mask. */
  30. #define NSEGS (8) /* Number of A-law segments. */
  31. #define SEG_SHIFT (4) /* Left shift for segment number. */
  32. #define SEG_MASK (0x70) /* Segment field mask. */
  33. #define BIAS (0x84) /* Bias for linear code. */
  34. /*
  35.  * alaw2linear() - Convert an A-law value to 16-bit linear PCM
  36.  *
  37.  */
  38. static int alaw2linear(unsigned char a_val)
  39. {
  40. int t;
  41. int seg;
  42. a_val ^= 0x55;
  43. t = a_val & QUANT_MASK;
  44. seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
  45. if(seg) t= (t + t + 1 + 32) << (seg + 2);
  46. else    t= (t + t + 1     ) << 3;
  47. return ((a_val & SIGN_BIT) ? t : -t);
  48. }
  49. static int ulaw2linear(unsigned char u_val)
  50. {
  51. int t;
  52. /* Complement to obtain normal u-law value. */
  53. u_val = ~u_val;
  54. /*
  55.  * Extract and bias the quantization bits. Then
  56.  * shift up by the segment number and subtract out the bias.
  57.  */
  58. t = ((u_val & QUANT_MASK) << 3) + BIAS;
  59. t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
  60. return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
  61. }
  62. /* 16384 entries per table */
  63. static uint8_t *linear_to_alaw = NULL;
  64. static int linear_to_alaw_ref = 0;
  65. static uint8_t *linear_to_ulaw = NULL;
  66. static int linear_to_ulaw_ref = 0;
  67. static void build_xlaw_table(uint8_t *linear_to_xlaw, 
  68.                              int (*xlaw2linear)(unsigned char),
  69.                              int mask) 
  70. {
  71.     int i, j, v, v1, v2;
  72.     j = 0;
  73.     for(i=0;i<128;i++) {
  74.         if (i != 127) {
  75.             v1 = xlaw2linear(i ^ mask);
  76.             v2 = xlaw2linear((i + 1) ^ mask);
  77.             v = (v1 + v2 + 4) >> 3;
  78.         } else {
  79.             v = 8192;
  80.         }
  81.         for(;j<v;j++) {
  82.             linear_to_xlaw[8192 + j] = (i ^ mask);
  83.             if (j > 0)
  84.                 linear_to_xlaw[8192 - j] = (i ^ (mask ^ 0x80));
  85.         }
  86.     }
  87.     linear_to_xlaw[0] = linear_to_xlaw[1];
  88. }
  89. static int pcm_encode_init(AVCodecContext *avctx)
  90. {
  91.     avctx->frame_size = 1;
  92.     switch(avctx->codec->id) {
  93.     case CODEC_ID_PCM_ALAW:
  94.         if (linear_to_alaw_ref == 0) {
  95.             linear_to_alaw = av_malloc(16384);
  96.             if (!linear_to_alaw)
  97.                 return -1;
  98.             build_xlaw_table(linear_to_alaw, alaw2linear, 0xd5);
  99.         }
  100.         linear_to_alaw_ref++;
  101.         break;
  102.     case CODEC_ID_PCM_MULAW:
  103.         if (linear_to_ulaw_ref == 0) {
  104.             linear_to_ulaw = av_malloc(16384);
  105.             if (!linear_to_ulaw)
  106.                 return -1;
  107.             build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
  108.         }
  109.         linear_to_ulaw_ref++;
  110.         break;
  111.     default:
  112.         break;
  113.     }
  114.     
  115.     switch(avctx->codec->id) {
  116.     case CODEC_ID_PCM_S32LE:
  117.     case CODEC_ID_PCM_S32BE:
  118.     case CODEC_ID_PCM_U32LE:
  119.     case CODEC_ID_PCM_U32BE:
  120.         avctx->block_align = 4 * avctx->channels;
  121.         break;
  122.     case CODEC_ID_PCM_S24LE:
  123.     case CODEC_ID_PCM_S24BE:
  124.     case CODEC_ID_PCM_U24LE:
  125.     case CODEC_ID_PCM_U24BE:
  126.     case CODEC_ID_PCM_S24DAUD:
  127.         avctx->block_align = 3 * avctx->channels;
  128.         break;
  129.     case CODEC_ID_PCM_S16LE:
  130.     case CODEC_ID_PCM_S16BE:
  131.     case CODEC_ID_PCM_U16LE:
  132.     case CODEC_ID_PCM_U16BE:
  133.         avctx->block_align = 2 * avctx->channels;
  134.         break;
  135.     case CODEC_ID_PCM_S8:
  136.     case CODEC_ID_PCM_U8:
  137.     case CODEC_ID_PCM_MULAW:
  138.     case CODEC_ID_PCM_ALAW:
  139.         avctx->block_align = avctx->channels;
  140.         break;
  141.     default:
  142.         break;
  143.     }
  144.     avctx->coded_frame= avcodec_alloc_frame();
  145.     avctx->coded_frame->key_frame= 1;
  146.     
  147.     return 0;
  148. }
  149. static int pcm_encode_close(AVCodecContext *avctx)
  150. {
  151.     av_freep(&avctx->coded_frame);
  152.     switch(avctx->codec->id) {
  153.     case CODEC_ID_PCM_ALAW:
  154.         if (--linear_to_alaw_ref == 0)
  155.             av_free(linear_to_alaw);
  156.         break;
  157.     case CODEC_ID_PCM_MULAW:
  158.         if (--linear_to_ulaw_ref == 0)
  159.             av_free(linear_to_ulaw);
  160.         break;
  161.     default:
  162.         /* nothing to free */
  163.         break;
  164.     }
  165.     return 0;
  166. }
  167. /**
  168.  * brief convert samples from 16 bit
  169.  * param bps byte per sample for the destination format, must be >= 2
  170.  * param le 0 for big-, 1 for little-endian
  171.  * param us 0 for signed, 1 for unsigned output
  172.  * param samples input samples
  173.  * param dst output samples
  174.  * param n number of samples in samples buffer.
  175.  */
  176. static inline void encode_from16(int bps, int le, int us,
  177.                                short **samples, uint8_t **dst, int n) {
  178.     if (bps > 2)
  179.         memset(*dst, 0, n * bps);
  180.     if (le) *dst += bps - 2;
  181.     for(;n>0;n--) {
  182.         register int v = *(*samples)++;
  183.         if (us) v += 0x8000;
  184.         (*dst)[le] = v >> 8;
  185.         (*dst)[1 - le] = v;
  186.         *dst += bps;
  187.     }
  188.     if (le) *dst -= bps - 2;
  189. }
  190. static int pcm_encode_frame(AVCodecContext *avctx,
  191.     unsigned char *frame, int buf_size, void *data)
  192. {
  193.     int n, sample_size, v;
  194.     short *samples;
  195.     unsigned char *dst;
  196.     switch(avctx->codec->id) {
  197.     case CODEC_ID_PCM_S32LE:
  198.     case CODEC_ID_PCM_S32BE:
  199.     case CODEC_ID_PCM_U32LE:
  200.     case CODEC_ID_PCM_U32BE:
  201.         sample_size = 4;
  202.         break;
  203.     case CODEC_ID_PCM_S24LE:
  204.     case CODEC_ID_PCM_S24BE:
  205.     case CODEC_ID_PCM_U24LE:
  206.     case CODEC_ID_PCM_U24BE:
  207.     case CODEC_ID_PCM_S24DAUD:
  208.         sample_size = 3;
  209.         break;
  210.     case CODEC_ID_PCM_S16LE:
  211.     case CODEC_ID_PCM_S16BE:
  212.     case CODEC_ID_PCM_U16LE:
  213.     case CODEC_ID_PCM_U16BE:
  214.         sample_size = 2;
  215.         break;
  216.     default:
  217.         sample_size = 1;
  218.         break;
  219.     }
  220.     n = buf_size / sample_size;
  221.     samples = data;
  222.     dst = frame;
  223.     switch(avctx->codec->id) {
  224.     case CODEC_ID_PCM_S32LE:
  225.         encode_from16(4, 1, 0, &samples, &dst, n);
  226.         break;
  227.     case CODEC_ID_PCM_S32BE:
  228.         encode_from16(4, 0, 0, &samples, &dst, n);
  229.         break;
  230.     case CODEC_ID_PCM_U32LE:
  231.         encode_from16(4, 1, 1, &samples, &dst, n);
  232.         break;
  233.     case CODEC_ID_PCM_U32BE:
  234.         encode_from16(4, 0, 1, &samples, &dst, n);
  235.         break;
  236.     case CODEC_ID_PCM_S24LE:
  237.         encode_from16(3, 1, 0, &samples, &dst, n);
  238.         break;
  239.     case CODEC_ID_PCM_S24BE:
  240.         encode_from16(3, 0, 0, &samples, &dst, n);
  241.         break;
  242.     case CODEC_ID_PCM_U24LE:
  243.         encode_from16(3, 1, 1, &samples, &dst, n);
  244.         break;
  245.     case CODEC_ID_PCM_U24BE:
  246.         encode_from16(3, 0, 1, &samples, &dst, n);
  247.         break;
  248.     case CODEC_ID_PCM_S24DAUD:
  249.         for(;n>0;n--) {
  250.             uint32_t tmp = ff_reverse[*samples >> 8] +
  251.                            (ff_reverse[*samples & 0xff] << 8);
  252.             tmp <<= 4; // sync flags would go here
  253.             dst[2] = tmp & 0xff;
  254.             tmp >>= 8;
  255.             dst[1] = tmp & 0xff;
  256.             dst[0] = tmp >> 8;
  257.             samples++;
  258.             dst += 3;
  259.         }
  260.         break;
  261.     case CODEC_ID_PCM_S16LE:
  262.         for(;n>0;n--) {
  263.             v = *samples++;
  264.             dst[0] = v & 0xff;
  265.             dst[1] = v >> 8;
  266.             dst += 2;
  267.         }
  268.         break;
  269.     case CODEC_ID_PCM_S16BE:
  270.         for(;n>0;n--) {
  271.             v = *samples++;
  272.             dst[0] = v >> 8;
  273.             dst[1] = v;
  274.             dst += 2;
  275.         }
  276.         break;
  277.     case CODEC_ID_PCM_U16LE:
  278.         for(;n>0;n--) {
  279.             v = *samples++;
  280.             v += 0x8000;
  281.             dst[0] = v & 0xff;
  282.             dst[1] = v >> 8;
  283.             dst += 2;
  284.         }
  285.         break;
  286.     case CODEC_ID_PCM_U16BE:
  287.         for(;n>0;n--) {
  288.             v = *samples++;
  289.             v += 0x8000;
  290.             dst[0] = v >> 8;
  291.             dst[1] = v;
  292.             dst += 2;
  293.         }
  294.         break;
  295.     case CODEC_ID_PCM_S8:
  296.         for(;n>0;n--) {
  297.             v = *samples++;
  298.             dst[0] = v >> 8;
  299.             dst++;
  300.         }
  301.         break;
  302.     case CODEC_ID_PCM_U8:
  303.         for(;n>0;n--) {
  304.             v = *samples++;
  305.             dst[0] = (v >> 8) + 128;
  306.             dst++;
  307.         }
  308.         break;
  309.     case CODEC_ID_PCM_ALAW:
  310.         for(;n>0;n--) {
  311.             v = *samples++;
  312.             dst[0] = linear_to_alaw[(v + 32768) >> 2];
  313.             dst++;
  314.         }
  315.         break;
  316.     case CODEC_ID_PCM_MULAW:
  317.         for(;n>0;n--) {
  318.             v = *samples++;
  319.             dst[0] = linear_to_ulaw[(v + 32768) >> 2];
  320.             dst++;
  321.         }
  322.         break;
  323.     default:
  324.         return -1;
  325.     }
  326.     //avctx->frame_size = (dst - frame) / (sample_size * avctx->channels);
  327.     return dst - frame;
  328. }
  329. typedef struct PCMDecode {
  330.     short table[256];
  331. } PCMDecode;
  332. static int pcm_decode_init(AVCodecContext * avctx)
  333. {
  334.     PCMDecode *s = avctx->priv_data;
  335.     int i;
  336.     switch(avctx->codec->id) {
  337.     case CODEC_ID_PCM_ALAW:
  338.         for(i=0;i<256;i++)
  339.             s->table[i] = alaw2linear(i);
  340.         break;
  341.     case CODEC_ID_PCM_MULAW:
  342.         for(i=0;i<256;i++)
  343.             s->table[i] = ulaw2linear(i);
  344.         break;
  345.     default:
  346.         break;
  347.     }
  348.     return 0;
  349. }
  350. /**
  351.  * brief convert samples to 16 bit
  352.  * param bps byte per sample for the source format, must be >= 2
  353.  * param le 0 for big-, 1 for little-endian
  354.  * param us 0 for signed, 1 for unsigned input
  355.  * param src input samples
  356.  * param samples output samples
  357.  * param src_len number of bytes in src
  358.  */
  359. static inline void decode_to16(int bps, int le, int us,
  360.                                uint8_t **src, short **samples, int src_len)
  361. {
  362.     register int n = src_len / bps;
  363.     if (le) *src += bps - 2;
  364.     for(;n>0;n--) {
  365.         *(*samples)++ = ((*src)[le] << 8 | (*src)[1 - le]) - (us?0x8000:0);
  366.         *src += bps;
  367.     }
  368.     if (le) *src -= bps - 2;
  369. }
  370. static int pcm_decode_frame(AVCodecContext *avctx,
  371.     void *data, int *data_size,
  372.     uint8_t *buf, int buf_size)
  373. {
  374.     PCMDecode *s = avctx->priv_data;
  375.     int n;
  376.     short *samples;
  377.     uint8_t *src;
  378.     samples = data;
  379.     src = buf;
  380.     if(buf_size > AVCODEC_MAX_AUDIO_FRAME_SIZE/2)
  381.         buf_size = AVCODEC_MAX_AUDIO_FRAME_SIZE/2;
  382.     switch(avctx->codec->id) {
  383.     case CODEC_ID_PCM_S32LE:
  384.         decode_to16(4, 1, 0, &src, &samples, buf_size);
  385.         break;
  386.     case CODEC_ID_PCM_S32BE:
  387.         decode_to16(4, 0, 0, &src, &samples, buf_size);
  388.         break;
  389.     case CODEC_ID_PCM_U32LE:
  390.         decode_to16(4, 1, 1, &src, &samples, buf_size);
  391.         break;
  392.     case CODEC_ID_PCM_U32BE:
  393.         decode_to16(4, 0, 1, &src, &samples, buf_size);
  394.         break;
  395.     case CODEC_ID_PCM_S24LE:
  396.         decode_to16(3, 1, 0, &src, &samples, buf_size);
  397.         break;
  398.     case CODEC_ID_PCM_S24BE:
  399.         decode_to16(3, 0, 0, &src, &samples, buf_size);
  400.         break;
  401.     case CODEC_ID_PCM_U24LE:
  402.         decode_to16(3, 1, 1, &src, &samples, buf_size);
  403.         break;
  404.     case CODEC_ID_PCM_U24BE:
  405.         decode_to16(3, 0, 1, &src, &samples, buf_size);
  406.         break;
  407.     case CODEC_ID_PCM_S24DAUD:
  408.         n = buf_size / 3;
  409.         for(;n>0;n--) {
  410.           uint32_t v = src[0] << 16 | src[1] << 8 | src[2];
  411.           v >>= 4; // sync flags are here
  412.           *samples++ = ff_reverse[(v >> 8) & 0xff] +
  413.                        (ff_reverse[v & 0xff] << 8);
  414.           src += 3;
  415.         }
  416.         break;
  417.     case CODEC_ID_PCM_S16LE:
  418.         n = buf_size >> 1;
  419.         for(;n>0;n--) {
  420.             *samples++ = src[0] | (src[1] << 8);
  421.             src += 2;
  422.         }
  423.         break;
  424.     case CODEC_ID_PCM_S16BE:
  425.         n = buf_size >> 1;
  426.         for(;n>0;n--) {
  427.             *samples++ = (src[0] << 8) | src[1];
  428.             src += 2;
  429.         }
  430.         break;
  431.     case CODEC_ID_PCM_U16LE:
  432.         n = buf_size >> 1;
  433.         for(;n>0;n--) {
  434.             *samples++ = (src[0] | (src[1] << 8)) - 0x8000;
  435.             src += 2;
  436.         }
  437.         break;
  438.     case CODEC_ID_PCM_U16BE:
  439.         n = buf_size >> 1;
  440.         for(;n>0;n--) {
  441.             *samples++ = ((src[0] << 8) | src[1]) - 0x8000;
  442.             src += 2;
  443.         }
  444.         break;
  445.     case CODEC_ID_PCM_S8:
  446.         n = buf_size;
  447.         for(;n>0;n--) {
  448.             *samples++ = src[0] << 8;
  449.             src++;
  450.         }
  451.         break;
  452.     case CODEC_ID_PCM_U8:
  453.         n = buf_size;
  454.         for(;n>0;n--) {
  455.             *samples++ = ((int)src[0] - 128) << 8;
  456.             src++;
  457.         }
  458.         break;
  459.     case CODEC_ID_PCM_ALAW:
  460.     case CODEC_ID_PCM_MULAW:
  461.         n = buf_size;
  462.         for(;n>0;n--) {
  463.             *samples++ = s->table[src[0]];
  464.             src++;
  465.         }
  466.         break;
  467.     default:
  468.         return -1;
  469.     }
  470.     *data_size = (uint8_t *)samples - (uint8_t *)data;
  471.     return src - buf;
  472. }
  473. #define PCM_CODEC(id, name)                     
  474. AVCodec name ## _encoder = {                    
  475.     #name,                                      
  476.     CODEC_TYPE_AUDIO,                           
  477.     id,                                         
  478.     0,                                          
  479.     pcm_encode_init,
  480.     pcm_encode_frame,
  481.     pcm_encode_close,
  482.     NULL,                                       
  483. };                                              
  484. AVCodec name ## _decoder = {                    
  485.     #name,                                      
  486.     CODEC_TYPE_AUDIO,                           
  487.     id,                                         
  488.     sizeof(PCMDecode),                          
  489.     pcm_decode_init,
  490.     NULL,                                       
  491.     NULL,                                       
  492.     pcm_decode_frame,                           
  493. }
  494. PCM_CODEC(CODEC_ID_PCM_S32LE, pcm_s32le);
  495. PCM_CODEC(CODEC_ID_PCM_S32BE, pcm_s32be);
  496. PCM_CODEC(CODEC_ID_PCM_U32LE, pcm_u32le);
  497. PCM_CODEC(CODEC_ID_PCM_U32BE, pcm_u32be);
  498. PCM_CODEC(CODEC_ID_PCM_S24LE, pcm_s24le);
  499. PCM_CODEC(CODEC_ID_PCM_S24BE, pcm_s24be);
  500. PCM_CODEC(CODEC_ID_PCM_U24LE, pcm_u24le);
  501. PCM_CODEC(CODEC_ID_PCM_U24BE, pcm_u24be);
  502. PCM_CODEC(CODEC_ID_PCM_S24DAUD, pcm_s24daud);
  503. PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le);
  504. PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be);
  505. PCM_CODEC(CODEC_ID_PCM_U16LE, pcm_u16le);
  506. PCM_CODEC(CODEC_ID_PCM_U16BE, pcm_u16be);
  507. PCM_CODEC(CODEC_ID_PCM_S8, pcm_s8);
  508. PCM_CODEC(CODEC_ID_PCM_U8, pcm_u8);
  509. PCM_CODEC(CODEC_ID_PCM_ALAW, pcm_alaw);
  510. PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw);
  511. #undef PCM_CODEC