l3bitstream.c
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:24k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
  4.  *
  5.  * $Id: l3bitstream.c,v 1.1 1996/02/14 04:04:23 rowlands Exp $
  6.  *
  7.  * $Log: l3bitstream.c,v $
  8.  * Revision 1.1  1996/02/14 04:04:23  rowlands
  9.  * Initial revision
  10.  *
  11.  * Received from Mike Coleman
  12.  **********************************************************************/
  13. /*
  14.   Revision History:
  15.   Date        Programmer                Comment
  16.   ==========  ========================= ===============================
  17.   1995/08/06  mc@fivebats.com           created
  18.   1995/09/06  mc@fivebats.com           modified to use formatBitstream
  19. */
  20. #include <stdlib.h>
  21. #include "l3bitstream.h" /* the public interface */
  22. #include "l3psy.h"
  23. #include "mdct.h"
  24. #include "loop.h"
  25. #include "formatBitstream.h"
  26. #include "huffman.h"
  27. #include <assert.h>
  28. #include "l3bitstream-pvt.h"
  29. static int stereo = 1;
  30. static frame_params *fr_ps  = NULL;
  31. static Bit_stream_struc *bs = NULL;
  32. BF_FrameData    *frameData    = NULL;
  33. BF_FrameResults *frameResults = NULL;
  34. int PartHoldersInitialized = 0;
  35. BF_PartHolder *headerPH;
  36. BF_PartHolder *frameSIPH;
  37. BF_PartHolder *channelSIPH[ MAX_CHANNELS ];
  38. BF_PartHolder *spectrumSIPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  39. BF_PartHolder *scaleFactorsPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  40. BF_PartHolder *codedDataPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  41. BF_PartHolder *userSpectrumPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  42. BF_PartHolder *userFrameDataPH;
  43. void putMyBits( uint32 val, uint16 len )
  44. {
  45.     putbits( bs, val, len );
  46. }
  47. /*
  48.   III_format_bitstream()
  49.   
  50.   This is called after a frame of audio has been quantized and coded.
  51.   It will write the encoded audio to the bitstream. Note that
  52.   from a layer3 encoder's perspective the bit stream is primarily
  53.   a series of main_data() blocks, with header and side information
  54.   inserted at the proper locations to maintain framing. (See Figure A.7
  55.   in the IS).
  56.   */
  57. void
  58. III_format_bitstream( int              bitsPerFrame,
  59.       frame_params     *in_fr_ps,
  60.       int              l3_enc[2][2][576],
  61.       III_side_info_t  *l3_side,
  62.       III_scalefac_t   *scalefac,
  63.       Bit_stream_struc *in_bs,
  64.       double           (*xr)[2][576],
  65.       char             *ancillary,
  66.       int              ancillary_bits )
  67. {
  68.     int gr, ch, i, mode_gr;
  69.     fr_ps = in_fr_ps;
  70.     bs = in_bs;
  71.     stereo = fr_ps->stereo;
  72.     mode_gr = (fr_ps->header->version == 1) ? 2 : 1;
  73.     
  74.     if ( frameData == NULL )
  75.     {
  76. frameData = calloc( 1, sizeof(*frameData) );
  77. assert( frameData );
  78.     }
  79.     if ( frameResults == NULL )
  80.     {
  81. frameResults = calloc( 1, sizeof(*frameData) );
  82. assert( frameData );
  83.     }
  84.     if ( !PartHoldersInitialized )
  85.     {
  86. headerPH = BF_newPartHolder( 12 );
  87. frameSIPH = BF_newPartHolder( 12 );
  88. for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  89.     channelSIPH[ch] = BF_newPartHolder( 8 );
  90. for ( gr = 0; gr < MAX_GRANULES; gr++ )
  91.     for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  92.     {
  93. spectrumSIPH[gr][ch]   = BF_newPartHolder( 32 );
  94. scaleFactorsPH[gr][ch] = BF_newPartHolder( 64 );
  95. codedDataPH[gr][ch]    = BF_newPartHolder( 576 );
  96. userSpectrumPH[gr][ch] = BF_newPartHolder( 4 );
  97.     }
  98. userFrameDataPH = BF_newPartHolder( 8 );
  99. PartHoldersInitialized = 1;
  100.     }
  101. #if 1
  102.     for ( gr = 0; gr < mode_gr; gr++ )
  103. for ( ch =  0; ch < stereo; ch++ )
  104. {
  105.     int *pi = &l3_enc[gr][ch][0];
  106.     double *pr = &xr[gr][ch][0];
  107.     for ( i = 0; i < 576; i++, pr++, pi++ )
  108.     {
  109. if ( (*pr < 0) && (*pi > 0) )
  110.     *pi *= -1;
  111.     }
  112. }
  113. #endif
  114.     encodeSideInfo( l3_side );
  115.     encodeMainData( l3_enc, l3_side, scalefac );
  116.     write_ancillary_data( ancillary, ancillary_bits );
  117.     if ( l3_side->resvDrain )
  118. drain_into_ancillary_data( l3_side->resvDrain );
  119.     /*
  120.       Put frameData together for the call
  121.       to BitstreamFrame()
  122.     */
  123.     frameData->putbits     = putMyBits;
  124.     frameData->frameLength = bitsPerFrame;
  125.     frameData->nGranules   = mode_gr;
  126.     frameData->nChannels   = stereo;
  127.     frameData->header      = headerPH->part;
  128.     frameData->frameSI     = frameSIPH->part;
  129.     for ( ch = 0; ch < stereo; ch++ )
  130. frameData->channelSI[ch] = channelSIPH[ch]->part;
  131.     for ( gr = 0; gr < mode_gr; gr++ )
  132. for ( ch = 0; ch < stereo; ch++ )
  133. {
  134.     frameData->spectrumSI[gr][ch]   = spectrumSIPH[gr][ch]->part;
  135.     frameData->scaleFactors[gr][ch] = scaleFactorsPH[gr][ch]->part;
  136.     frameData->codedData[gr][ch]    = codedDataPH[gr][ch]->part;
  137.     frameData->userSpectrum[gr][ch] = userSpectrumPH[gr][ch]->part;
  138. }
  139.     frameData->userFrameData = userFrameDataPH->part;
  140.     BF_BitstreamFrame( frameData, frameResults );
  141.     /* we set this here -- it will be tested in the next loops iteration */
  142.     l3_side->main_data_begin = frameResults->nextBackPtr;
  143. }
  144. void
  145. III_FlushBitstream()
  146. {
  147.     assert( PartHoldersInitialized );
  148.     BF_FlushBitstream( frameData, frameResults );
  149. }
  150. static unsigned slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
  151. static unsigned slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };
  152. static void
  153. encodeMainData( int              l3_enc[2][2][576],
  154. III_side_info_t  *si,
  155. III_scalefac_t   *scalefac )
  156. {
  157.     int i, gr, ch, sfb, window, mode_gr;
  158.     layer *info = fr_ps->header;
  159.     if ( info->version == 1 )
  160. mode_gr = 2;
  161.     else
  162. mode_gr = 1;
  163.     for ( gr = 0; gr < mode_gr; gr++ )
  164. for ( ch = 0; ch < stereo; ch++ )
  165.     scaleFactorsPH[gr][ch]->part->nrEntries = 0;
  166.     for ( gr = 0; gr < mode_gr; gr++ )
  167. for ( ch = 0; ch < stereo; ch++ )
  168.     codedDataPH[gr][ch]->part->nrEntries = 0;
  169.     if ( info->version == 1 )
  170.     {  /* MPEG 1 */
  171. for ( gr = 0; gr < 2; gr++ )
  172. {
  173.     for ( ch = 0; ch < stereo; ch++ )
  174.     {
  175. BF_PartHolder **pph = &scaleFactorsPH[gr][ch];
  176. gr_info *gi = &(si->gr[gr].ch[ch].tt);
  177. unsigned slen1 = slen1_tab[ gi->scalefac_compress ];
  178. unsigned slen2 = slen2_tab[ gi->scalefac_compress ];
  179. int *ix = &l3_enc[gr][ch][0];
  180. if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
  181. {
  182.     if ( gi->mixed_block_flag )
  183.     {
  184. for ( sfb = 0; sfb < 8; sfb++ )
  185.     *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  186. for ( sfb = 3; sfb < 6; sfb++ )
  187.     for ( window = 0; window < 3; window++ )
  188. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );
  189. for ( sfb = 6; sfb < 12; sfb++ )
  190.     for ( window = 0; window < 3; window++ )
  191. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );
  192.     }
  193.     else
  194.     {
  195. for ( sfb = 0; sfb < 6; sfb++ )
  196.     for ( window = 0; window < 3; window++ )
  197. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );
  198. for ( sfb = 6; sfb < 12; sfb++ )
  199.     for ( window = 0; window < 3; window++ )
  200. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );
  201.     }
  202. }
  203. else
  204. {
  205.     if ( (gr == 0) || (si->scfsi[ch][0] == 0) )
  206. for ( sfb = 0; sfb < 6; sfb++ )
  207.     *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  208.     if ( (gr == 0) || (si->scfsi[ch][1] == 0) )
  209. for ( sfb = 6; sfb < 11; sfb++ )
  210.     *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  211.     if ( (gr == 0) || (si->scfsi[ch][2] == 0) )
  212. for ( sfb = 11; sfb < 16; sfb++ )
  213.     *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen2 );
  214.     if ( (gr == 0) || (si->scfsi[ch][3] == 0) )
  215. for ( sfb = 16; sfb < 21; sfb++ )
  216.     *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen2 );
  217. }
  218. Huffmancodebits( &codedDataPH[gr][ch], ix, gi );
  219.     } /* for ch */
  220. } /* for gr */
  221.     }
  222.     else
  223.     {  /* MPEG 2 */
  224. gr = 0;
  225. for ( ch = 0; ch < stereo; ch++ )
  226. {
  227.     BF_PartHolder **pph = &scaleFactorsPH[gr][ch];
  228.     gr_info *gi = &(si->gr[gr].ch[ch].tt);
  229.     int *ix = &l3_enc[gr][ch][0];
  230.     int sfb_partition;
  231.     assert( gi->sfb_partition_table );
  232.     if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
  233.     {
  234. if ( gi->mixed_block_flag )
  235. {
  236.     sfb_partition = 0;
  237.     for ( sfb = 0; sfb < 8; sfb++ )
  238. *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], gi->slen[sfb_partition] );
  239.     for ( sfb = 3, sfb_partition = 1; sfb_partition < 4; sfb_partition++ )
  240.     {
  241. int sfbs = gi->sfb_partition_table[ sfb_partition ] / 3;
  242. int slen = gi->slen[ sfb_partition ];
  243. for ( i = 0; i < sfbs; i++, sfb++ )
  244.     for ( window = 0; window < 3; window++ )
  245. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen );
  246.     }
  247. }
  248. else
  249. {
  250.     for ( sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++ )
  251.     {
  252. int sfbs = gi->sfb_partition_table[ sfb_partition ] / 3;
  253. int slen = gi->slen[ sfb_partition ];
  254. for ( i = 0; i < sfbs; i++, sfb++ )
  255.     for ( window = 0; window < 3; window++ )
  256. *pph = BF_addEntry( *pph,  scalefac->s[gr][ch][sfb][window], slen );
  257.     }
  258. }
  259.     }
  260.     else
  261.     {
  262. for ( sfb = 0, sfb_partition = 0; sfb_partition < 4; sfb_partition++ )
  263. {
  264.     int sfbs = gi->sfb_partition_table[ sfb_partition ];
  265.     int slen = gi->slen[ sfb_partition ];
  266.     for ( i = 0; i < sfbs; i++, sfb++ )
  267. *pph = BF_addEntry( *pph,  scalefac->l[gr][ch][sfb], slen );
  268. }
  269.     }
  270.     Huffmancodebits( &codedDataPH[gr][ch], ix, gi );
  271. } /* for ch */
  272.     }
  273. } /* main_data */
  274. static unsigned int crc = 0;
  275. static int encodeSideInfo( III_side_info_t  *si )
  276. {
  277.     int gr, ch, scfsi_band, region, window, bits_sent, mode_gr;
  278.     layer *info = fr_ps->header;
  279.     
  280.     mode_gr =  (info->version == 1) ? 2 : 1;
  281.     headerPH->part->nrEntries = 0;
  282.     headerPH = BF_addEntry( headerPH, 0xfff,                    12 );
  283.     headerPH = BF_addEntry( headerPH, info->version,            1 );
  284.     headerPH = BF_addEntry( headerPH, 4 - info->lay,            2 );
  285.     headerPH = BF_addEntry( headerPH, !info->error_protection,  1 );
  286.     headerPH = BF_addEntry( headerPH, info->bitrate_index,      4 );
  287.     headerPH = BF_addEntry( headerPH, info->sampling_frequency, 2 );
  288.     headerPH = BF_addEntry( headerPH, info->padding,            1 );
  289.     headerPH = BF_addEntry( headerPH, info->extension,          1 );
  290.     headerPH = BF_addEntry( headerPH, info->mode,               2 );
  291.     headerPH = BF_addEntry( headerPH, info->mode_ext,           2 );
  292.     headerPH = BF_addEntry( headerPH, info->copyright,          1 );
  293.     headerPH = BF_addEntry( headerPH, info->original,           1 );
  294.     headerPH = BF_addEntry( headerPH, info->emphasis,           2 );
  295.     
  296.     bits_sent = 32;
  297.     if ( fr_ps->header->error_protection )
  298.     {
  299. headerPH = BF_addEntry( headerPH, crc, 16 );
  300. bits_sent += 16;
  301.     }
  302.     frameSIPH->part->nrEntries = 0;
  303.     for (ch = 0; ch < stereo; ch++ )
  304. channelSIPH[ch]->part->nrEntries = 0;
  305.     for ( gr = 0; gr < mode_gr; gr++ )
  306. for ( ch = 0; ch < stereo; ch++ )
  307.     spectrumSIPH[gr][ch]->part->nrEntries = 0;
  308.     if ( info->version == 1 )
  309.     {  /* MPEG1 */
  310. frameSIPH = BF_addEntry( frameSIPH, si->main_data_begin, 9 );
  311. if ( stereo == 2 )
  312.     frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 3 );
  313. else
  314.     frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 5 );
  315. for ( ch = 0; ch < stereo; ch++ )
  316.     for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ )
  317.     {
  318. BF_PartHolder **pph = &channelSIPH[ch];
  319. *pph = BF_addEntry( *pph, si->scfsi[ch][scfsi_band], 1 );
  320.     }
  321. for ( gr = 0; gr < 2; gr++ )
  322.     for ( ch = 0; ch < stereo; ch++ )
  323.     {
  324. BF_PartHolder **pph = &spectrumSIPH[gr][ch];
  325. gr_info *gi = &(si->gr[gr].ch[ch].tt);
  326. *pph = BF_addEntry( *pph, gi->part2_3_length,        12 );
  327. *pph = BF_addEntry( *pph, gi->big_values,            9 );
  328. *pph = BF_addEntry( *pph, gi->global_gain,           8 );
  329. *pph = BF_addEntry( *pph, gi->scalefac_compress,     4 );
  330. *pph = BF_addEntry( *pph, gi->window_switching_flag, 1 );
  331. if ( gi->window_switching_flag )
  332. {   
  333.     *pph = BF_addEntry( *pph, gi->block_type,       2 );
  334.     *pph = BF_addEntry( *pph, gi->mixed_block_flag, 1 );
  335.     for ( region = 0; region < 2; region++ )
  336. *pph = BF_addEntry( *pph, gi->table_select[region],  5 );
  337.     for ( window = 0; window < 3; window++ )
  338. *pph = BF_addEntry( *pph, gi->subblock_gain[window], 3 );
  339. }
  340. else
  341. {
  342.     assert( gi->block_type == 0 );
  343.     for ( region = 0; region < 3; region++ )
  344. *pph = BF_addEntry( *pph, gi->table_select[region], 5 );
  345.     *pph = BF_addEntry( *pph, gi->region0_count, 4 );
  346.     *pph = BF_addEntry( *pph, gi->region1_count, 3 );
  347. }
  348. *pph = BF_addEntry( *pph, gi->preflag,            1 );
  349. *pph = BF_addEntry( *pph, gi->scalefac_scale,     1 );
  350. *pph = BF_addEntry( *pph, gi->count1table_select, 1 );
  351.     }
  352. if ( stereo == 2 )
  353.     bits_sent += 256;
  354. else
  355.     bits_sent += 136;
  356.     }
  357.     else
  358.     {  /* MPEG2 */
  359. frameSIPH = BF_addEntry( frameSIPH, si->main_data_begin, 8 );
  360. if ( stereo == 2 )
  361.     frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 2 );
  362. else
  363.     frameSIPH = BF_addEntry( frameSIPH, si->private_bits, 1 );
  364. gr = 0;
  365. for ( ch = 0; ch < stereo; ch++ )
  366. {
  367.     BF_PartHolder **pph = &spectrumSIPH[gr][ch];
  368.     gr_info *gi = &(si->gr[gr].ch[ch].tt);
  369.     *pph = BF_addEntry( *pph, gi->part2_3_length,        12 );
  370.     *pph = BF_addEntry( *pph, gi->big_values,            9 );
  371.     *pph = BF_addEntry( *pph, gi->global_gain,           8 );
  372.     *pph = BF_addEntry( *pph, gi->scalefac_compress,     9 );
  373.     *pph = BF_addEntry( *pph, gi->window_switching_flag, 1 );
  374.     if ( gi->window_switching_flag )
  375.     {   
  376. *pph = BF_addEntry( *pph, gi->block_type,       2 );
  377. *pph = BF_addEntry( *pph, gi->mixed_block_flag, 1 );
  378. for ( region = 0; region < 2; region++ )
  379.     *pph = BF_addEntry( *pph, gi->table_select[region],  5 );
  380. for ( window = 0; window < 3; window++ )
  381.     *pph = BF_addEntry( *pph, gi->subblock_gain[window], 3 );
  382.     }
  383.     else
  384.     {
  385. for ( region = 0; region < 3; region++ )
  386.     *pph = BF_addEntry( *pph, gi->table_select[region], 5 );
  387. *pph = BF_addEntry( *pph, gi->region0_count, 4 );
  388. *pph = BF_addEntry( *pph, gi->region1_count, 3 );
  389.     }
  390.     *pph = BF_addEntry( *pph, gi->scalefac_scale,     1 );
  391.     *pph = BF_addEntry( *pph, gi->count1table_select, 1 );
  392. }
  393. if ( stereo == 2 )
  394.     bits_sent += 136;
  395. else
  396.     bits_sent += 72;
  397.     }
  398.     return bits_sent;
  399. }
  400. static void
  401. write_ancillary_data( char *theData, int lengthInBits )
  402. {
  403.     /*
  404.      */
  405.     int bytesToSend = lengthInBits / 8;
  406.     int remainingBits = lengthInBits % 8;
  407.     unsigned wrd;
  408.     int i;
  409.     userFrameDataPH->part->nrEntries = 0;
  410.     for ( i = 0; i < bytesToSend; i++ )
  411.     {
  412. wrd = theData[i];
  413. userFrameDataPH = BF_addEntry( userFrameDataPH, wrd, 8 );
  414.     }
  415.     if ( remainingBits )
  416.     {
  417. /* right-justify remaining bits */
  418. wrd = theData[bytesToSend] >> (8 - remainingBits);
  419. userFrameDataPH = BF_addEntry( userFrameDataPH, wrd, remainingBits );
  420.     }
  421.     
  422. }
  423. /*
  424.   Some combinations of bitrate, Fs, and stereo make it impossible to stuff
  425.   out a frame using just main_data, due to the limited number of bits to
  426.   indicate main_data_length. In these situations, we put stuffing bits into
  427.   the ancillary data...
  428. */
  429. static void
  430. drain_into_ancillary_data( int lengthInBits )
  431. {
  432.     /*
  433.      */
  434.     int wordsToSend   = lengthInBits / 32;
  435.     int remainingBits = lengthInBits % 32;
  436.     int i;
  437.     /*
  438.       userFrameDataPH->part->nrEntries set by call to write_ancillary_data()
  439.     */
  440.     for ( i = 0; i < wordsToSend; i++ )
  441. userFrameDataPH = BF_addEntry( userFrameDataPH, 0, 32 );
  442.     if ( remainingBits )
  443. userFrameDataPH = BF_addEntry( userFrameDataPH, 0, remainingBits );    
  444. }
  445. /*
  446.   Note the discussion of huffmancodebits() on pages 28
  447.   and 29 of the IS, as well as the definitions of the side
  448.   information on pages 26 and 27.
  449.   */
  450. static void
  451. Huffmancodebits( BF_PartHolder **pph, int *ix, gr_info *gi )
  452. {
  453.     int L3_huffman_coder_count1( BF_PartHolder **pph, struct huffcodetab *h, int v, int w, int x, int y );
  454.     int bigv_bitcount( int ix[576], gr_info *cod_info );
  455.     int region1Start;
  456.     int region2Start;
  457.     int i, bigvalues, count1End;
  458.     int v, w, x, y, bits, cbits, xbits, stuffingBits;
  459.     unsigned int code, ext;
  460.     struct huffcodetab *h;
  461.     int bvbits, c1bits, tablezeros, r0, r1, r2, rt, *pr;
  462.     int bitsWritten = 0;
  463.     int idx = 0;
  464.     tablezeros = 0;
  465.     r0 = r1 = r2 = 0;
  466.     
  467.     /* 1: Write the bigvalues */
  468.     bigvalues = gi->big_values * 2;
  469.     if ( bigvalues )
  470.     {
  471. if ( !(gi->mixed_block_flag) && gi->window_switching_flag && (gi->block_type == 2) )
  472. { /* Three short blocks */
  473.     /*
  474.       Within each scalefactor band, data is given for successive
  475.       time windows, beginning with window 0 and ending with window 2.
  476.       Within each window, the quantized values are then arranged in
  477.       order of increasing frequency...
  478.       */
  479.     int sfb, window, line, start, end;
  480.     I192_3 *ix_s;
  481.     int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency + (fr_ps->header->version * 3)].s[0];
  482.     
  483.     ix_s = (I192_3 *) ix;
  484.     region1Start = 12;
  485.     region2Start = 576;
  486.     for ( sfb = 0; sfb < 13; sfb++ )
  487.     {
  488. unsigned tableindex = 100;
  489. start = scalefac[ sfb ];
  490. end   = scalefac[ sfb+1 ];
  491. if ( start < region1Start )
  492.     tableindex = gi->table_select[ 0 ];
  493. else
  494.     tableindex = gi->table_select[ 1 ];
  495. assert( tableindex < 32 );
  496. for ( window = 0; window < 3; window++ )
  497.     for ( line = start; line < end; line += 2 )
  498.     {
  499. x = (*ix_s)[line][window];
  500. y = (*ix_s)[line + 1][window];
  501. assert( idx < 576 );
  502. assert( idx >= 0 );
  503. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  504. *pph = BF_addEntry( *pph,  code, cbits );
  505. *pph = BF_addEntry( *pph,  ext, xbits );
  506. bitsWritten += bits;
  507.     }
  508.     }
  509. }
  510. else
  511.     if ( gi->mixed_block_flag && gi->block_type == 2 )
  512.     {  /* Mixed blocks long, short */
  513. int sfb, window, line, start, end;
  514. unsigned tableindex;
  515. I192_3 *ix_s;
  516. int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency + (fr_ps->header->version * 3)].s[0];
  517. ix_s = (I192_3 *) ix;
  518. /* Write the long block region */
  519. tableindex = gi->table_select[0];
  520. if ( tableindex )
  521.     for ( i = 0; i < 36; i += 2 )
  522.     {
  523. x = ix[i];
  524. y = ix[i + 1];
  525. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  526. *pph = BF_addEntry( *pph,  code, cbits );
  527. *pph = BF_addEntry( *pph,  ext, xbits );
  528. bitsWritten += bits;
  529.     }
  530. /* Write the short block region */
  531. tableindex = gi->table_select[ 1 ];
  532. assert( tableindex < 32 );
  533. for ( sfb = 3; sfb < 13; sfb++ )
  534. {
  535.     start = scalefac[ sfb ];
  536.     end   = scalefac[ sfb+1 ];           
  537.     
  538.     for ( window = 0; window < 3; window++ )
  539. for ( line = start; line < end; line += 2 )
  540. {
  541.     x = (*ix_s)[line][window];
  542.     y = (*ix_s)[line + 1][window];
  543.     bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  544.     *pph = BF_addEntry( *pph,  code, cbits );
  545.     *pph = BF_addEntry( *pph,  ext, xbits );
  546.     bitsWritten += bits;
  547. }
  548. }
  549.     }
  550.     else
  551.     { /* Long blocks */
  552. int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency + (fr_ps->header->version * 3)].l[0];
  553. unsigned scalefac_index = 100;
  554. if ( gi->mixed_block_flag )
  555. {
  556.     region1Start = 36;
  557.     region2Start = 576;
  558. }
  559. else
  560. {
  561.     scalefac_index = gi->region0_count + 1;
  562.     assert( scalefac_index < 23 );
  563.     region1Start = scalefac[ scalefac_index ];
  564.     scalefac_index += gi->region1_count + 1;
  565.     assert( scalefac_index < 23 );    
  566.     region2Start = scalefac[ scalefac_index ];
  567.     assert( region1Start == gi->address1 );
  568. }
  569. for ( i = 0; i < bigvalues; i += 2 )
  570. {
  571.     unsigned tableindex = 100;
  572.     /* get table pointer */
  573.     if ( i < region1Start )
  574.     {
  575. tableindex = gi->table_select[0];
  576. pr = &r0;
  577.     }
  578.     else
  579. if ( i < region2Start )
  580. {
  581.     tableindex = gi->table_select[1];
  582.     pr = &r1;
  583. }
  584. else
  585. {
  586.     tableindex = gi->table_select[2];
  587.     pr = &r2;
  588. }
  589.     assert( tableindex < 32 );
  590.     h = &ht[ tableindex ];
  591.     /* get huffman code */
  592.     x = ix[i];
  593.     y = ix[i + 1];
  594.     if ( tableindex )
  595.     {
  596. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  597. *pph = BF_addEntry( *pph,  code, cbits );
  598. *pph = BF_addEntry( *pph,  ext, xbits );
  599. bitsWritten += rt = bits;
  600. *pr += rt;
  601.     }
  602.     else
  603.     {
  604. tablezeros += 1;
  605. *pr = 0;
  606.     }
  607. }
  608.     }
  609.     }
  610.     bvbits = bitsWritten; 
  611.     /* 2: Write count1 area */
  612.     assert( (gi->count1table_select < 2) );
  613.     h = &ht[gi->count1table_select + 32];
  614.     count1End = bigvalues + (gi->count1 * 4);
  615.     assert( count1End <= 576 );
  616.     for ( i = bigvalues; i < count1End; i += 4 )
  617.     {
  618. v = ix[i];
  619. w = ix[i+1];
  620. x = ix[i+2];
  621. y = ix[i+3];
  622. bitsWritten += L3_huffman_coder_count1( pph, h, v, w, x, y );
  623.     }
  624.     c1bits = bitsWritten - bvbits;
  625.     if ( (stuffingBits = gi->part2_3_length - gi->part2_length - bitsWritten) )
  626.     {
  627. int stuffingWords = stuffingBits / 32;
  628. int remainingBits = stuffingBits % 32;
  629. assert( stuffingBits > 0 );
  630. /*
  631.   Due to the nature of the Huffman code
  632.   tables, we will pad with ones
  633. */
  634. while ( stuffingWords-- )
  635.     *pph = BF_addEntry( *pph, ~0, 32 );
  636. if ( remainingBits )
  637.     *pph = BF_addEntry( *pph, ~0, remainingBits );
  638. bitsWritten += stuffingBits;
  639.     }
  640.     assert( bitsWritten == gi->part2_3_length - gi->part2_length );
  641. #ifdef DEBUG
  642.     printf( "#### %d Huffman bits written (%02d + %02d), part2_length = %d, part2_3_length = %d, %d stuffing ####n",
  643.     bitsWritten, bvbits, c1bits, gi->part2_length, gi->part2_3_length, stuffingBits );
  644. #endif
  645. }
  646. int
  647. abs_and_sign( int *x )
  648. {
  649.     if ( *x > 0 )
  650. return 0;
  651.     *x *= -1;
  652.     return 1;
  653. }
  654. int
  655. L3_huffman_coder_count1( BF_PartHolder **pph, struct huffcodetab *h, int v, int w, int x, int y )
  656. {
  657.     HUFFBITS huffbits;
  658.     unsigned int signv, signw, signx, signy, p;
  659.     int len;
  660.     int totalBits = 0;
  661.     
  662.     signv = abs_and_sign( &v );
  663.     signw = abs_and_sign( &w );
  664.     signx = abs_and_sign( &x );
  665.     signy = abs_and_sign( &y );
  666.     
  667.     p = v + (w << 1) + (x << 2) + (y << 3);
  668.     huffbits = h->table[p];
  669.     len = h->hlen[ p ];
  670.     *pph = BF_addEntry( *pph,  huffbits, len );
  671.     totalBits += len;
  672.     if ( v )
  673.     {
  674. *pph = BF_addEntry( *pph,  signv, 1 );
  675. totalBits += 1;
  676.     }
  677.     if ( w )
  678.     {
  679. *pph = BF_addEntry( *pph,  signw, 1 );
  680. totalBits += 1;
  681.     }
  682.     if ( x )
  683.     {
  684. *pph = BF_addEntry( *pph,  signx, 1 );
  685. totalBits += 1;
  686.     }
  687.     if ( y )
  688.     {
  689. *pph = BF_addEntry( *pph,  signy, 1 );
  690. totalBits += 1;
  691.     }
  692.     return totalBits;
  693. }
  694. /*
  695.   Implements the pseudocode of page 98 of the IS
  696.   */
  697. int
  698. HuffmanCode( int table_select, int x, int y, unsigned int *code, unsigned int *ext, int *cbits, int *xbits )
  699. {
  700.     unsigned signx, signy, linbitsx, linbitsy, linbits, xlen, ylen, idx;
  701.     struct huffcodetab *h;
  702.     *cbits = 0;
  703.     *xbits = 0;
  704.     *code  = 0;
  705.     *ext   = 0;
  706.     
  707.     if ( table_select == 0 )
  708. return 0;
  709.     
  710.     signx = abs_and_sign( &x );
  711.     signy = abs_and_sign( &y );
  712.     h = &(ht[table_select]);
  713.     xlen = h->xlen;
  714.     ylen = h->ylen;
  715.     linbits = h->linbits;
  716.     linbitsx = linbitsy = 0;
  717.     if ( table_select > 15 )
  718.     { /* ESC-table is used */
  719. if ( x > 14 )
  720. {
  721.     linbitsx = x - 15;
  722.     assert( linbitsx <= h->linmax );
  723.     x = 15;
  724. }
  725. if ( y > 14 )
  726. {
  727.     linbitsy = y - 15;
  728.     assert( linbitsy <= h->linmax );
  729.     y = 15;
  730. }
  731. idx = (x * ylen) + y;
  732. *code = h->table[idx];
  733. *cbits = h->hlen[ idx ];
  734. if ( x > 14 )
  735. {
  736.     *ext |= linbitsx;
  737.     *xbits += linbits;
  738. }
  739. if ( x != 0 )
  740. {
  741.     *ext <<= 1;
  742.     *ext |= signx;
  743.     *xbits += 1;
  744. }
  745. if ( y > 14 )
  746. {
  747.     *ext <<= linbits;
  748.     *ext |= linbitsy;
  749.     *xbits += linbits;
  750. }
  751. if ( y != 0 )
  752. {
  753.     *ext <<= 1;
  754.     *ext |= signy;
  755.     *xbits += 1;
  756. }
  757.     }
  758.     else
  759.     { /* No ESC-words */
  760. idx = (x * ylen) + y;
  761. *code = h->table[idx];
  762. *cbits += h->hlen[ idx ];
  763. if ( x != 0 )
  764. {
  765.     *code <<= 1;
  766.     *code |= signx;
  767.     *cbits += 1;
  768. }
  769. if ( y != 0 )
  770. {
  771.     *code <<= 1;
  772.     *code |= signy;
  773.     *cbits += 1;
  774. }
  775.     }
  776.     assert( *cbits <= 32 );
  777.     assert( *xbits <= 32 );
  778.     return *cbits + *xbits;
  779. }