adpcm.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:23k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * adpcm.c : adpcm variant audio decoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 the VideoLAN team
  5.  * $Id: d62cdaa5bffc305d03fbdf33994821f577ba1a4c $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Rémi Denis-Courmont <rem # videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *
  27.  * Documentation: http://www.pcisys.net/~melanson/codecs/adpcm.txt
  28.  *****************************************************************************/
  29. #ifdef HAVE_CONFIG_H
  30. # include "config.h"
  31. #endif
  32. #include <vlc_common.h>
  33. #include <vlc_plugin.h>
  34. #include <vlc_aout.h>
  35. #include <vlc_codec.h>
  36. /*****************************************************************************
  37.  * Module descriptor
  38.  *****************************************************************************/
  39. static int  OpenDecoder( vlc_object_t * );
  40. static void CloseDecoder( vlc_object_t * );
  41. static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
  42. vlc_module_begin ()
  43.     set_description( N_("ADPCM audio decoder") )
  44.     set_capability( "decoder", 50 )
  45.     set_category( CAT_INPUT )
  46.     set_subcategory( SUBCAT_INPUT_ACODEC )
  47.     set_callbacks( OpenDecoder, CloseDecoder )
  48. vlc_module_end ()
  49. /*****************************************************************************
  50.  * Local prototypes
  51.  *****************************************************************************/
  52. enum adpcm_codec_e
  53. {
  54.     ADPCM_IMA_QT,
  55.     ADPCM_IMA_WAV,
  56.     ADPCM_MS,
  57.     ADPCM_DK3,
  58.     ADPCM_DK4,
  59.     ADPCM_EA
  60. };
  61. struct decoder_sys_t
  62. {
  63.     enum adpcm_codec_e codec;
  64.     size_t              i_block;
  65.     size_t              i_samplesperblock;
  66.     audio_date_t        end_date;
  67. };
  68. static void DecodeAdpcmMs    ( decoder_t *, int16_t *, uint8_t * );
  69. static void DecodeAdpcmImaWav( decoder_t *, int16_t *, uint8_t * );
  70. static void DecodeAdpcmImaQT ( decoder_t *, int16_t *, uint8_t * );
  71. static void DecodeAdpcmDk4   ( decoder_t *, int16_t *, uint8_t * );
  72. static void DecodeAdpcmDk3   ( decoder_t *, int16_t *, uint8_t * );
  73. static void DecodeAdpcmEA    ( decoder_t *, int16_t *, uint8_t * );
  74. static const int pi_channels_maps[6] =
  75. {
  76.     0,
  77.     AOUT_CHAN_CENTER,
  78.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
  79.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
  80.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT,
  81.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
  82.      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT
  83. };
  84. /* Various table from http://www.pcisys.net/~melanson/codecs/adpcm.txt */
  85. static const int i_index_table[16] =
  86. {
  87.     -1, -1, -1, -1, 2, 4, 6, 8,
  88.     -1, -1, -1, -1, 2, 4, 6, 8
  89. };
  90. static const int i_step_table[89] =
  91. {
  92.     7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
  93.     19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
  94.     50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
  95.     130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
  96.     337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
  97.     876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
  98.     2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
  99.     5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
  100.     15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
  101. };
  102. static const int i_adaptation_table[16] =
  103. {
  104.     230, 230, 230, 230, 307, 409, 512, 614,
  105.     768, 614, 512, 409, 307, 230, 230, 230
  106. };
  107. static const int i_adaptation_coeff1[7] =
  108. {
  109.     256, 512, 0, 192, 240, 460, 392
  110. };
  111. static const int i_adaptation_coeff2[7] =
  112. {
  113.     0, -256, 0, 64, 0, -208, -232
  114. };
  115. /*****************************************************************************
  116.  * OpenDecoder: probe the decoder and return score
  117.  *****************************************************************************/
  118. static int OpenDecoder( vlc_object_t *p_this )
  119. {
  120.     decoder_t *p_dec = (decoder_t*)p_this;
  121.     decoder_sys_t *p_sys;
  122.     switch( p_dec->fmt_in.i_codec )
  123.     {
  124.         case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
  125.         case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
  126.         case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
  127.         case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
  128.         case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
  129.         case VLC_FOURCC('X','A','J', 0): /* EA ADPCM */
  130.             break;
  131.         default:
  132.             return VLC_EGENERIC;
  133.     }
  134.     if( p_dec->fmt_in.audio.i_channels <= 0 ||
  135.         p_dec->fmt_in.audio.i_channels > 5 )
  136.     {
  137.         msg_Err( p_dec, "invalid number of channel (not between 1 and 5): %i",
  138.                  p_dec->fmt_in.audio.i_channels );
  139.         return VLC_EGENERIC;
  140.     }
  141.     if( p_dec->fmt_in.audio.i_rate <= 0 )
  142.     {
  143.         msg_Err( p_dec, "bad samplerate" );
  144.         return VLC_EGENERIC;
  145.     }
  146.     /* Allocate the memory needed to store the decoder's structure */
  147.     if( ( p_dec->p_sys = p_sys =
  148.           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
  149.         return VLC_ENOMEM;
  150.     switch( p_dec->fmt_in.i_codec )
  151.     {
  152.         case VLC_FOURCC('i','m','a', '4'): /* IMA ADPCM */
  153.             p_sys->codec = ADPCM_IMA_QT;
  154.             break;
  155.         case VLC_FOURCC('m','s',0x00,0x11): /* IMA ADPCM */
  156.             p_sys->codec = ADPCM_IMA_WAV;
  157.             break;
  158.         case VLC_FOURCC('m','s',0x00,0x02): /* MS ADPCM */
  159.             p_sys->codec = ADPCM_MS;
  160.             break;
  161.         case VLC_FOURCC('m','s',0x00,0x61): /* Duck DK4 ADPCM */
  162.             p_sys->codec = ADPCM_DK4;
  163.             break;
  164.         case VLC_FOURCC('m','s',0x00,0x62): /* Duck DK3 ADPCM */
  165.             p_sys->codec = ADPCM_DK3;
  166.             break;
  167.         case VLC_FOURCC('X','A','J', 0): /* EA ADPCM */
  168.             p_sys->codec = ADPCM_EA;
  169.             p_dec->fmt_in.p_extra = calloc( 2 * p_dec->fmt_in.audio.i_channels,
  170.                                             sizeof( int16_t ) );
  171.             if( p_dec->fmt_in.p_extra == NULL )
  172.             {
  173.                 free( p_sys );
  174.                 return VLC_ENOMEM;
  175.             }
  176.             break;
  177.     }
  178.     if( p_dec->fmt_in.audio.i_blockalign <= 0 )
  179.     {
  180.         p_sys->i_block = (p_sys->codec == ADPCM_IMA_QT) ?
  181.             34 * p_dec->fmt_in.audio.i_channels : 1024;
  182.         msg_Warn( p_dec, "block size undefined, using %zu", p_sys->i_block );
  183.     }
  184.     else
  185.     {
  186.         p_sys->i_block = p_dec->fmt_in.audio.i_blockalign;
  187.     }
  188.     /* calculate samples per block */
  189.     switch( p_sys->codec )
  190.     {
  191.     case ADPCM_IMA_QT:
  192.         p_sys->i_samplesperblock = 64;
  193.         break;
  194.     case ADPCM_IMA_WAV:
  195.         p_sys->i_samplesperblock =
  196.             2 * ( p_sys->i_block - 4 * p_dec->fmt_in.audio.i_channels ) /
  197.             p_dec->fmt_in.audio.i_channels;
  198.         break;
  199.     case ADPCM_MS:
  200.         p_sys->i_samplesperblock =
  201.             2 * (p_sys->i_block - 7 * p_dec->fmt_in.audio.i_channels) /
  202.             p_dec->fmt_in.audio.i_channels + 2;
  203.         break;
  204.     case ADPCM_DK4:
  205.         p_sys->i_samplesperblock =
  206.             2 * (p_sys->i_block - 4 * p_dec->fmt_in.audio.i_channels) /
  207.             p_dec->fmt_in.audio.i_channels + 1;
  208.         break;
  209.     case ADPCM_DK3:
  210.         p_dec->fmt_in.audio.i_channels = 2;
  211.         p_sys->i_samplesperblock = ( 4 * ( p_sys->i_block - 16 ) + 2 )/ 3;
  212.         break;
  213.     case ADPCM_EA:
  214.         p_sys->i_samplesperblock =
  215.             2 * (p_sys->i_block - p_dec->fmt_in.audio.i_channels) /
  216.             p_dec->fmt_in.audio.i_channels;
  217.     }
  218.     msg_Dbg( p_dec, "format: samplerate:%d Hz channels:%d bits/sample:%d "
  219.              "blockalign:%zu samplesperblock:%zu",
  220.              p_dec->fmt_in.audio.i_rate, p_dec->fmt_in.audio.i_channels,
  221.              p_dec->fmt_in.audio.i_bitspersample, p_sys->i_block,
  222.              p_sys->i_samplesperblock );
  223.     p_dec->fmt_out.i_cat = AUDIO_ES;
  224.     p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
  225.     p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
  226.     p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
  227.     p_dec->fmt_out.audio.i_physical_channels =
  228.         p_dec->fmt_out.audio.i_original_channels =
  229.             pi_channels_maps[p_dec->fmt_in.audio.i_channels];
  230.     aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
  231.     aout_DateSet( &p_sys->end_date, 0 );
  232.     p_dec->pf_decode_audio = DecodeBlock;
  233.     return VLC_SUCCESS;
  234. }
  235. /*****************************************************************************
  236.  * DecodeBlock:
  237.  *****************************************************************************/
  238. static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
  239. {
  240.     decoder_sys_t *p_sys  = p_dec->p_sys;
  241.     block_t *p_block;
  242.     if( !pp_block || !*pp_block ) return NULL;
  243.     p_block = *pp_block;
  244.     if( p_block->i_pts != 0 &&
  245.         p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
  246.     {
  247.         aout_DateSet( &p_sys->end_date, p_block->i_pts );
  248.     }
  249.     else if( !aout_DateGet( &p_sys->end_date ) )
  250.     {
  251.         /* We've just started the stream, wait for the first PTS. */
  252.         block_Release( p_block );
  253.         return NULL;
  254.     }
  255.     /* Don't re-use the same pts twice */
  256.     p_block->i_pts = 0;
  257.     if( p_block->i_buffer >= p_sys->i_block )
  258.     {
  259.         aout_buffer_t *p_out;
  260.         p_out = decoder_NewAudioBuffer( p_dec, p_sys->i_samplesperblock );
  261.         if( p_out == NULL )
  262.         {
  263.             block_Release( p_block );
  264.             return NULL;
  265.         }
  266.         p_out->start_date = aout_DateGet( &p_sys->end_date );
  267.         p_out->end_date =
  268.             aout_DateIncrement( &p_sys->end_date, p_sys->i_samplesperblock );
  269.         switch( p_sys->codec )
  270.         {
  271.         case ADPCM_IMA_QT:
  272.             DecodeAdpcmImaQT( p_dec, (int16_t*)p_out->p_buffer,
  273.                               p_block->p_buffer );
  274.             break;
  275.         case ADPCM_IMA_WAV:
  276.             DecodeAdpcmImaWav( p_dec, (int16_t*)p_out->p_buffer,
  277.                                p_block->p_buffer );
  278.             break;
  279.         case ADPCM_MS:
  280.             DecodeAdpcmMs( p_dec, (int16_t*)p_out->p_buffer,
  281.                            p_block->p_buffer );
  282.             break;
  283.         case ADPCM_DK4:
  284.             DecodeAdpcmDk4( p_dec, (int16_t*)p_out->p_buffer,
  285.                             p_block->p_buffer );
  286.             break;
  287.         case ADPCM_DK3:
  288.             DecodeAdpcmDk3( p_dec, (int16_t*)p_out->p_buffer,
  289.                             p_block->p_buffer );
  290.             break;
  291.         case ADPCM_EA:
  292.             DecodeAdpcmEA( p_dec, (int16_t*)p_out->p_buffer,
  293.                            p_block->p_buffer );
  294.         default:
  295.             break;
  296.         }
  297.         p_block->p_buffer += p_sys->i_block;
  298.         p_block->i_buffer -= p_sys->i_block;
  299.         return p_out;
  300.     }
  301.     block_Release( p_block );
  302.     return NULL;
  303. }
  304. /*****************************************************************************
  305.  * CloseDecoder:
  306.  *****************************************************************************/
  307. static void CloseDecoder( vlc_object_t *p_this )
  308. {
  309.     decoder_t *p_dec = (decoder_t *)p_this;
  310.     decoder_sys_t *p_sys = p_dec->p_sys;
  311.     if( p_sys->codec == ADPCM_EA )
  312.         free( p_dec->fmt_in.p_extra );
  313.     free( p_sys );
  314. }
  315. /*****************************************************************************
  316.  * Local functions
  317.  *****************************************************************************/
  318. #define CLAMP( v, min, max ) 
  319.     if( (v) < (min) ) (v) = (min); 
  320.     if( (v) > (max) ) (v) = (max)
  321. #define GetByte( v ) 
  322.     (v) = *p_buffer; p_buffer++;
  323. #define GetWord( v ) 
  324.     (v) = *p_buffer; p_buffer++; 
  325.     (v) |= ( *p_buffer ) << 8; p_buffer++; 
  326.     if( (v)&0x8000 ) (v) -= 0x010000;
  327. /*
  328.  * MS
  329.  */
  330. typedef struct adpcm_ms_channel_s
  331. {
  332.     int i_idelta;
  333.     int i_sample1, i_sample2;
  334.     int i_coeff1, i_coeff2;
  335. } adpcm_ms_channel_t;
  336. static int AdpcmMsExpandNibble(adpcm_ms_channel_t *p_channel,
  337.                                int i_nibble )
  338. {
  339.     int i_predictor;
  340.     int i_snibble;
  341.     /* expand sign */
  342.     i_snibble = i_nibble - ( i_nibble&0x08 ? 0x10 : 0 );
  343.     i_predictor = ( p_channel->i_sample1 * p_channel->i_coeff1 +
  344.                     p_channel->i_sample2 * p_channel->i_coeff2 ) / 256 +
  345.                   i_snibble * p_channel->i_idelta;
  346.     CLAMP( i_predictor, -32768, 32767 );
  347.     p_channel->i_sample2 = p_channel->i_sample1;
  348.     p_channel->i_sample1 = i_predictor;
  349.     p_channel->i_idelta = ( i_adaptation_table[i_nibble] *
  350.                             p_channel->i_idelta ) / 256;
  351.     if( p_channel->i_idelta < 16 )
  352.     {
  353.         p_channel->i_idelta = 16;
  354.     }
  355.     return( i_predictor );
  356. }
  357. static void DecodeAdpcmMs( decoder_t *p_dec, int16_t *p_sample,
  358.                            uint8_t *p_buffer )
  359. {
  360.     decoder_sys_t *p_sys  = p_dec->p_sys;
  361.     adpcm_ms_channel_t channel[2];
  362.     int i_nibbles;
  363.     int b_stereo;
  364.     int i_block_predictor;
  365.     b_stereo = p_dec->fmt_in.audio.i_channels == 2 ? 1 : 0;
  366.     GetByte( i_block_predictor );
  367.     CLAMP( i_block_predictor, 0, 6 );
  368.     channel[0].i_coeff1 = i_adaptation_coeff1[i_block_predictor];
  369.     channel[0].i_coeff2 = i_adaptation_coeff2[i_block_predictor];
  370.     if( b_stereo )
  371.     {
  372.         GetByte( i_block_predictor );
  373.         CLAMP( i_block_predictor, 0, 6 );
  374.         channel[1].i_coeff1 = i_adaptation_coeff1[i_block_predictor];
  375.         channel[1].i_coeff2 = i_adaptation_coeff2[i_block_predictor];
  376.     }
  377.     GetWord( channel[0].i_idelta );
  378.     if( b_stereo )
  379.     {
  380.         GetWord( channel[1].i_idelta );
  381.     }
  382.     GetWord( channel[0].i_sample1 );
  383.     if( b_stereo )
  384.     {
  385.         GetWord( channel[1].i_sample1 );
  386.     }
  387.     GetWord( channel[0].i_sample2 );
  388.     if( b_stereo )
  389.     {
  390.         GetWord( channel[1].i_sample2 );
  391.     }
  392.     if( b_stereo )
  393.     {
  394.         *p_sample++ = channel[0].i_sample2;
  395.         *p_sample++ = channel[1].i_sample2;
  396.         *p_sample++ = channel[0].i_sample1;
  397.         *p_sample++ = channel[1].i_sample1;
  398.     }
  399.     else
  400.     {
  401.         *p_sample++ = channel[0].i_sample2;
  402.         *p_sample++ = channel[0].i_sample1;
  403.     }
  404.     for( i_nibbles = 2 * (p_sys->i_block - 7 * p_dec->fmt_in.audio.i_channels);
  405.          i_nibbles > 0; i_nibbles -= 2, p_buffer++ )
  406.     {
  407.         *p_sample++ = AdpcmMsExpandNibble( &channel[0], (*p_buffer) >> 4);
  408.         *p_sample++ = AdpcmMsExpandNibble( &channel[b_stereo ? 1 : 0],
  409.                                            (*p_buffer)&0x0f);
  410.     }
  411. }
  412. /*
  413.  * IMA-WAV
  414.  */
  415. typedef struct adpcm_ima_wav_channel_s
  416. {
  417.     int i_predictor;
  418.     int i_step_index;
  419. } adpcm_ima_wav_channel_t;
  420. static int AdpcmImaWavExpandNibble(adpcm_ima_wav_channel_t *p_channel,
  421.                                    int i_nibble )
  422. {
  423.     int i_diff;
  424.     i_diff = i_step_table[p_channel->i_step_index] >> 3;
  425.     if( i_nibble&0x04 ) i_diff += i_step_table[p_channel->i_step_index];
  426.     if( i_nibble&0x02 ) i_diff += i_step_table[p_channel->i_step_index]>>1;
  427.     if( i_nibble&0x01 ) i_diff += i_step_table[p_channel->i_step_index]>>2;
  428.     if( i_nibble&0x08 )
  429.         p_channel->i_predictor -= i_diff;
  430.     else
  431.         p_channel->i_predictor += i_diff;
  432.     CLAMP( p_channel->i_predictor, -32768, 32767 );
  433.     p_channel->i_step_index += i_index_table[i_nibble];
  434.     CLAMP( p_channel->i_step_index, 0, 88 );
  435.     return( p_channel->i_predictor );
  436. }
  437. static void DecodeAdpcmImaWav( decoder_t *p_dec, int16_t *p_sample,
  438.                                uint8_t *p_buffer )
  439. {
  440.     decoder_sys_t *p_sys  = p_dec->p_sys;
  441.     adpcm_ima_wav_channel_t channel[2];
  442.     int                     i_nibbles;
  443.     int                     b_stereo;
  444.     b_stereo = p_dec->fmt_in.audio.i_channels == 2 ? 1 : 0;
  445.     GetWord( channel[0].i_predictor );
  446.     GetByte( channel[0].i_step_index );
  447.     CLAMP( channel[0].i_step_index, 0, 88 );
  448.     p_buffer++;
  449.     if( b_stereo )
  450.     {
  451.         GetWord( channel[1].i_predictor );
  452.         GetByte( channel[1].i_step_index );
  453.         CLAMP( channel[1].i_step_index, 0, 88 );
  454.         p_buffer++;
  455.     }
  456.     if( b_stereo )
  457.     {
  458.         for( i_nibbles = 2 * (p_sys->i_block - 8);
  459.              i_nibbles > 0;
  460.              i_nibbles -= 16 )
  461.         {
  462.             int i;
  463.             for( i = 0; i < 4; i++ )
  464.             {
  465.                 p_sample[i * 4] =
  466.                     AdpcmImaWavExpandNibble(&channel[0],p_buffer[i]&0x0f);
  467.                 p_sample[i * 4 + 2] =
  468.                     AdpcmImaWavExpandNibble(&channel[0],p_buffer[i] >> 4);
  469.             }
  470.             p_buffer += 4;
  471.             for( i = 0; i < 4; i++ )
  472.             {
  473.                 p_sample[i * 4 + 1] =
  474.                     AdpcmImaWavExpandNibble(&channel[1],p_buffer[i]&0x0f);
  475.                 p_sample[i * 4 + 3] =
  476.                     AdpcmImaWavExpandNibble(&channel[1],p_buffer[i] >> 4);
  477.             }
  478.             p_buffer += 4;
  479.             p_sample += 16;
  480.         }
  481.     }
  482.     else
  483.     {
  484.         for( i_nibbles = 2 * (p_sys->i_block - 4);
  485.              i_nibbles > 0;
  486.              i_nibbles -= 2, p_buffer++ )
  487.         {
  488.             *p_sample++ =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer)&0x0f );
  489.             *p_sample++ =AdpcmImaWavExpandNibble( &channel[0], (*p_buffer) >> 4 );
  490.         }
  491.     }
  492. }
  493. /*
  494.  * Ima4 in QT file
  495.  */
  496. static void DecodeAdpcmImaQT( decoder_t *p_dec, int16_t *p_sample,
  497.                               uint8_t *p_buffer )
  498. {
  499.     adpcm_ima_wav_channel_t channel[2];
  500.     int                     i_nibbles;
  501.     int                     i_ch;
  502.     int                     i_step;
  503.     i_step = p_dec->fmt_in.audio.i_channels;
  504.     for( i_ch = 0; i_ch < p_dec->fmt_in.audio.i_channels; i_ch++ )
  505.     {
  506.         /* load preambule */
  507.         channel[i_ch].i_predictor  = (int16_t)((( ( p_buffer[0] << 1 )|(  p_buffer[1] >> 7 ) ))<<7);
  508.         channel[i_ch].i_step_index = p_buffer[1]&0x7f;
  509.         CLAMP( channel[i_ch].i_step_index, 0, 88 );
  510.         p_buffer += 2;
  511.         for( i_nibbles = 0; i_nibbles < 64; i_nibbles +=2 )
  512.         {
  513.             *p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer)&0x0f);
  514.             p_sample += i_step;
  515.             *p_sample = AdpcmImaWavExpandNibble( &channel[i_ch], (*p_buffer >> 4)&0x0f);
  516.             p_sample += i_step;
  517.             p_buffer++;
  518.         }
  519.         /* Next channel */
  520.         p_sample += 1 - 64 * i_step;
  521.     }
  522. }
  523. /*
  524.  * Dk4
  525.  */
  526. static void DecodeAdpcmDk4( decoder_t *p_dec, int16_t *p_sample,
  527.                             uint8_t *p_buffer )
  528. {
  529.     decoder_sys_t *p_sys  = p_dec->p_sys;
  530.     adpcm_ima_wav_channel_t channel[2];
  531.     size_t                  i_nibbles;
  532.     int                     b_stereo;
  533.     b_stereo = p_dec->fmt_in.audio.i_channels == 2 ? 1 : 0;
  534.     GetWord( channel[0].i_predictor );
  535.     GetByte( channel[0].i_step_index );
  536.     CLAMP( channel[0].i_step_index, 0, 88 );
  537.     p_buffer++;
  538.     if( b_stereo )
  539.     {
  540.         GetWord( channel[1].i_predictor );
  541.         GetByte( channel[1].i_step_index );
  542.         CLAMP( channel[1].i_step_index, 0, 88 );
  543.         p_buffer++;
  544.     }
  545.     /* first output predictor */
  546.     *p_sample++ = channel[0].i_predictor;
  547.     if( b_stereo )
  548.     {
  549.         *p_sample++ = channel[1].i_predictor;
  550.     }
  551.     for( i_nibbles = 0;
  552.          i_nibbles < p_sys->i_block - 4 * (b_stereo ? 2:1 );
  553.          i_nibbles++ )
  554.     {
  555.         *p_sample++ = AdpcmImaWavExpandNibble( &channel[0],
  556.                                               (*p_buffer) >> 4);
  557.         *p_sample++ = AdpcmImaWavExpandNibble( &channel[b_stereo ? 1 : 0],
  558.                                                (*p_buffer)&0x0f);
  559.         p_buffer++;
  560.     }
  561. }
  562. /*
  563.  * Dk3
  564.  */
  565. static void DecodeAdpcmDk3( decoder_t *p_dec, int16_t *p_sample,
  566.                             uint8_t *p_buffer )
  567. {
  568.     decoder_sys_t *p_sys  = p_dec->p_sys;
  569.     uint8_t                 *p_end = &p_buffer[p_sys->i_block];
  570.     adpcm_ima_wav_channel_t sum;
  571.     adpcm_ima_wav_channel_t diff;
  572.     int                     i_diff_value;
  573.     p_buffer += 10;
  574.     GetWord( sum.i_predictor );
  575.     GetWord( diff.i_predictor );
  576.     GetByte( sum.i_step_index );
  577.     GetByte( diff.i_step_index );
  578.     i_diff_value = diff.i_predictor;
  579.     /* we process 6 nibbles at once */
  580.     while( p_buffer + 1 <= p_end )
  581.     {
  582.         /* first 3 nibbles */
  583.         AdpcmImaWavExpandNibble( &sum,
  584.                                  (*p_buffer)&0x0f);
  585.         AdpcmImaWavExpandNibble( &diff,
  586.                                  (*p_buffer) >> 4 );
  587.         i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
  588.         *p_sample++ = sum.i_predictor + i_diff_value;
  589.         *p_sample++ = sum.i_predictor - i_diff_value;
  590.         p_buffer++;
  591.         AdpcmImaWavExpandNibble( &sum,
  592.                                  (*p_buffer)&0x0f);
  593.         *p_sample++ = sum.i_predictor + i_diff_value;
  594.         *p_sample++ = sum.i_predictor - i_diff_value;
  595.         /* now last 3 nibbles */
  596.         AdpcmImaWavExpandNibble( &sum,
  597.                                  (*p_buffer)>>4);
  598.         p_buffer++;
  599.         if( p_buffer < p_end )
  600.         {
  601.             AdpcmImaWavExpandNibble( &diff,
  602.                                      (*p_buffer)&0x0f );
  603.             i_diff_value = ( i_diff_value + diff.i_predictor ) / 2;
  604.             *p_sample++ = sum.i_predictor + i_diff_value;
  605.             *p_sample++ = sum.i_predictor - i_diff_value;
  606.             AdpcmImaWavExpandNibble( &sum,
  607.                                      (*p_buffer)>>4);
  608.             p_buffer++;
  609.             *p_sample++ = sum.i_predictor + i_diff_value;
  610.             *p_sample++ = sum.i_predictor - i_diff_value;
  611.         }
  612.     }
  613. }
  614. /*
  615.  * EA ADPCM
  616.  */
  617. #define MAX_CHAN 5
  618. static void DecodeAdpcmEA( decoder_t *p_dec, int16_t *p_sample,
  619.                            uint8_t *p_buffer )
  620. {
  621.     static const uint32_t EATable[]=
  622.     {
  623.         0x00000000, 0x000000F0, 0x000001CC, 0x00000188,
  624.         0x00000000, 0x00000000, 0xFFFFFF30, 0xFFFFFF24,
  625.         0x00000000, 0x00000001, 0x00000003, 0x00000004,
  626.         0x00000007, 0x00000008, 0x0000000A, 0x0000000B,
  627.         0x00000000, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFC
  628.     };
  629.     decoder_sys_t *p_sys  = p_dec->p_sys;
  630.     uint8_t *p_end;
  631.     unsigned i_channels, c;
  632.     int16_t *prev, *cur;
  633.     int32_t c1[MAX_CHAN], c2[MAX_CHAN];
  634.     int8_t d[MAX_CHAN];
  635.     i_channels = p_dec->fmt_in.audio.i_channels;
  636.     p_end = &p_buffer[p_sys->i_block];
  637.     prev = (int16_t *)p_dec->fmt_in.p_extra;
  638.     cur = prev + i_channels;
  639.     for (c = 0; c < i_channels; c++)
  640.     {
  641.         uint8_t input;
  642.         input = p_buffer[c];
  643.         c1[c] = EATable[input >> 4];
  644.         c2[c] = EATable[(input >> 4) + 4];
  645.         d[c] = (input & 0xf) + 8;
  646.     }
  647.     for( p_buffer += i_channels; p_buffer < p_end ; p_buffer += i_channels)
  648.     {
  649.         for (c = 0; c < i_channels; c++)
  650.         {
  651.             int32_t spl;
  652.             spl = (p_buffer[c] >> 4) & 0xf;
  653.             spl = (spl << 0x1c) >> d[c];
  654.             spl = (spl + cur[c] * c1[c] + prev[c] * c2[c] + 0x80) >> 8;
  655.             CLAMP( spl, -32768, 32767 );
  656.             prev[c] = cur[c];
  657.             cur[c] = spl;
  658.             *(p_sample++) = spl;
  659.         }
  660.         for (c = 0; c < i_channels; c++)
  661.         {
  662.             int32_t spl;
  663.             spl = p_buffer[c] & 0xf;
  664.             spl = (spl << 0x1c) >> d[c];
  665.             spl = (spl + cur[c] * c1[c] + prev[c] * c2[c] + 0x80) >> 8;
  666.             CLAMP( spl, -32768, 32767 );
  667.             prev[c] = cur[c];
  668.             cur[c] = spl;
  669.             *(p_sample++) = spl;
  670.         }
  671.     }
  672. }