adpcm.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:20k
源码类别:

多媒体

开发平台:

MultiPlatform

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