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

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. #include <stdlib.h>
  17. #include "system.h"
  18. #include "l3bitstream.h" /* the public interface */
  19. #include "l3psy.h"
  20. #include "mdct.h"
  21. #include "loop.h"
  22. #include "formatbitstream2.h"
  23. #include "huffman.h"
  24. #include <assert.h>
  25. #include "l3bitstream-pvt.h"
  26. static int stereo = 1;
  27. static frame_params *fr_ps  = NULL;
  28. int PartHoldersInitialized = 0;
  29. BitHolder *headerPH;
  30. BitHolder *frameSIPH;
  31. BitHolder *channelSIPH[ MAX_CHANNELS ];
  32. BitHolder *spectrumSIPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  33. BitHolder *scaleFactorsPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  34. BitHolder *codedDataPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  35. BitHolder *userSpectrumPH[ MAX_GRANULES ][ MAX_CHANNELS ];
  36. BitHolder *userFrameDataPH;
  37. BF_FrameData sFrameData;
  38. BF_FrameResults sFrameResults;
  39. /*
  40.   III_format_bitstream()
  41.   
  42.   This is called after a frame of audio has been quantized and coded.
  43.   It will write the encoded audio to the bitstream. Note that
  44.   from a layer3 encoder's perspective the bit stream is primarily
  45.   a series of main_data() blocks, with header and side information
  46.   inserted at the proper locations to maintain framing. (See Figure A.7
  47.   in the IS).
  48.   */
  49. void III_format_bitstream( int              bitsPerFrame,
  50. frame_params     *in_fr_ps,
  51. int              l3_enc[2][2][576],
  52. III_side_info_t  *l3_side,
  53. III_scalefac_t   *scalefac,
  54. double           (*xr)[2][576],
  55. char             *ancillary,
  56. int              ancillary_bits )
  57. {
  58.   int gr, ch, i, mode_gr;
  59.   fr_ps = in_fr_ps;
  60.   stereo = fr_ps->stereo;
  61.   mode_gr = 2;
  62.   
  63.   if ( !PartHoldersInitialized )
  64.   {
  65. headerPH = initBitHolder( &sFrameData.header, 16*2 );
  66. frameSIPH = initBitHolder( &sFrameData.frameSI, 4*2 );
  67. for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  68.     channelSIPH[ch] = initBitHolder( &sFrameData.channelSI[ch], 8*2 );
  69. for ( gr = 0; gr < MAX_GRANULES; gr++ )
  70.     for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  71.     {
  72. spectrumSIPH[gr][ch]   = initBitHolder( &sFrameData.spectrumSI[gr][ch], 32*2 );
  73. scaleFactorsPH[gr][ch] = initBitHolder( &sFrameData.scaleFactors[gr][ch], 64*2 );
  74. codedDataPH[gr][ch]    = initBitHolder( &sFrameData.codedData[gr][ch], 576*2 );
  75. userSpectrumPH[gr][ch] = initBitHolder( &sFrameData.userSpectrum[gr][ch], 4*2 );
  76.     }
  77. userFrameDataPH = initBitHolder( &sFrameData.userFrameData, 8*2 );
  78. PartHoldersInitialized = 1;
  79.   }
  80. #if 1
  81.   for ( gr = 0; gr < mode_gr; gr++ )
  82. for ( ch =  0; ch < stereo; ch++ )
  83. {
  84.     int *pi = &l3_enc[gr][ch][0];
  85.     double *pr = &xr[gr][ch][0];
  86.     for ( i = 0; i < 576; i++, pr++, pi++ )
  87.   {
  88. if ( (*pr < 0) && (*pi > 0) )
  89.   *pi *= -1;
  90.     }
  91. }
  92. #endif
  93.   encodeSideInfo( l3_side );
  94.   encodeMainData( l3_enc, l3_side, scalefac );
  95.   write_ancillary_data( ancillary, ancillary_bits );
  96.   if ( l3_side->resvDrain )
  97. drain_into_ancillary_data( l3_side->resvDrain );
  98.   sFrameData.frameLength = bitsPerFrame;
  99.   sFrameData.nGranules   = mode_gr;
  100.   sFrameData.nChannels   = stereo;
  101.   writeFrame( &sFrameData, &sFrameResults );
  102.   /* we set this here -- it will be tested in the next loops iteration */
  103.   l3_side->main_data_begin = sFrameResults.nextBackPtr;
  104. }
  105. void III_FlushBitstream()
  106. {
  107. int ch, gr;
  108.   if ( PartHoldersInitialized )
  109.   {
  110. exitBitHolder( &sFrameData.header );
  111. exitBitHolder( &sFrameData.frameSI );
  112. for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  113.     exitBitHolder( &sFrameData.channelSI[ch] );
  114. for ( gr = 0; gr < MAX_GRANULES; gr++ )
  115.     for ( ch = 0; ch < MAX_CHANNELS; ch++ )
  116.     {
  117. exitBitHolder( &sFrameData.spectrumSI[gr][ch] );
  118. exitBitHolder( &sFrameData.scaleFactors[gr][ch] );
  119. exitBitHolder( &sFrameData.codedData[gr][ch] );
  120. exitBitHolder( &sFrameData.userSpectrum[gr][ch] );
  121.     }
  122. exitBitHolder( &sFrameData.userFrameData );
  123. PartHoldersInitialized = 0;
  124.   }
  125.  /* BF_FlushBitstream( frameData, frameResults ); */
  126. }
  127. static unsigned slen1_tab[16] = { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 };
  128. static unsigned slen2_tab[16] = { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 };
  129. static void encodeMainData( int l3_enc[2][2][576],
  130. III_side_info_t  *si,
  131. III_scalefac_t   *scalefac )
  132. {
  133.   int gr, ch, sfb, window, mode_gr;
  134. mode_gr = 2;
  135.   for ( gr = 0; gr < mode_gr; gr++ )
  136. for ( ch = 0; ch < stereo; ch++ )
  137.     scaleFactorsPH[gr][ch]->nrEntries = 0;
  138.   for ( gr = 0; gr < mode_gr; gr++ )
  139. for ( ch = 0; ch < stereo; ch++ )
  140.     codedDataPH[gr][ch]->nrEntries = 0;
  141. for ( gr = 0; gr < 2; gr++ )
  142. {
  143.   for ( ch = 0; ch < stereo; ch++ )
  144.   {
  145. BitHolder **pph = &scaleFactorsPH[gr][ch];
  146. gr_info *gi = &(si->gr[gr].ch[ch].tt);
  147. unsigned slen1 = slen1_tab[ gi->scalefac_compress ];
  148. unsigned slen2 = slen2_tab[ gi->scalefac_compress ];
  149. int *ix = &l3_enc[gr][ch][0];
  150. if ( (gi->window_switching_flag == 1) && (gi->block_type == 2) )
  151. {
  152. if ( gi->mixed_block_flag )
  153. {
  154. for ( sfb = 0; sfb < 8; sfb++ )
  155. addBits( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  156. for ( sfb = 3; sfb < 6; sfb++ )
  157. for ( window = 0; window < 3; window++ )
  158. addBits( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );
  159. for ( sfb = 6; sfb < 12; sfb++ )
  160. for ( window = 0; window < 3; window++ )
  161. addBits( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );
  162. }
  163. else
  164. {
  165. for ( sfb = 0; sfb < 6; sfb++ )
  166. for ( window = 0; window < 3; window++ )
  167. addBits( *pph,  scalefac->s[gr][ch][sfb][window], slen1 );
  168. for ( sfb = 6; sfb < 12; sfb++ )
  169. for ( window = 0; window < 3; window++ )
  170. addBits( *pph,  scalefac->s[gr][ch][sfb][window], slen2 );
  171. }
  172. }
  173. else
  174. {
  175. if ( (gr == 0) || (si->scfsi[ch][0] == 0) )
  176. for ( sfb = 0; sfb < 6; sfb++ )
  177. addBits( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  178. if ( (gr == 0) || (si->scfsi[ch][1] == 0) )
  179. for ( sfb = 6; sfb < 11; sfb++ )
  180. addBits( *pph,  scalefac->l[gr][ch][sfb], slen1 );
  181. if ( (gr == 0) || (si->scfsi[ch][2] == 0) )
  182. for ( sfb = 11; sfb < 16; sfb++ )
  183. addBits( *pph,  scalefac->l[gr][ch][sfb], slen2 );
  184. if ( (gr == 0) || (si->scfsi[ch][3] == 0) )
  185. for ( sfb = 16; sfb < 21; sfb++ )
  186. addBits( *pph,  scalefac->l[gr][ch][sfb], slen2 );
  187. }
  188. Huffmancodebits( &codedDataPH[gr][ch], ix, gi );
  189.   } /* for ch */
  190. } /* for gr */
  191. } /* main_data */
  192. /*____ encodeSideInfo() _____________________________________________________*/
  193. static int encodeSideInfo( III_side_info_t  *si )
  194. {
  195.   int gr, ch, scfsi_band, region, window, bits_sent, mode_gr;
  196.   layer *info = fr_ps->header;
  197.   mode_gr =  2;
  198.   headerPH->nrEntries = 0;
  199.   addBits( headerPH, 0xfff,                   12 );
  200.   addBits( headerPH, 1,    1 );
  201.   addBits( headerPH, 4 - 3,                2 );  /* 4 - Layer */
  202.   addBits( headerPH, !info->error_protection,  1 );
  203.   addBits( headerPH, info->bitrate_index,      4 );
  204.   addBits( headerPH, info->sampling_frequency, 2 );
  205.   addBits( headerPH, info->padding,            1 );
  206.   addBits( headerPH, info->extension,          1 );
  207.   addBits( headerPH, info->mode,               2 );
  208.   addBits( headerPH, info->mode_ext,           2 );
  209.   addBits( headerPH, info->copyright,          1 );
  210.   addBits( headerPH, info->original,           1 );
  211.   addBits( headerPH, info->emphasis,           2 );
  212.     
  213.   bits_sent = 32;
  214.   if ( info->error_protection )
  215.   {
  216. addBits( headerPH, 0, 16 ); /* Just a dummy add. Real CRC calculated & inserted in writeSideInfo() */
  217. bits_sent += 16;
  218.   }
  219.   frameSIPH->nrEntries = 0;
  220.   for (ch = 0; ch < stereo; ch++ )
  221. channelSIPH[ch]->nrEntries = 0;
  222.   for ( gr = 0; gr < 2; gr++ )
  223. for ( ch = 0; ch < stereo; ch++ )
  224.     spectrumSIPH[gr][ch]->nrEntries = 0;
  225. addBits( frameSIPH, si->main_data_begin, 9 );
  226. if ( stereo == 2 )
  227.   addBits( frameSIPH, si->private_bits, 3 );
  228. else
  229.   addBits( frameSIPH, si->private_bits, 5 );
  230. for ( ch = 0; ch < stereo; ch++ )
  231.   for ( scfsi_band = 0; scfsi_band < 4; scfsi_band++ )
  232.   {
  233. BitHolder **pph = &channelSIPH[ch];
  234. addBits( *pph, si->scfsi[ch][scfsi_band], 1 );
  235.   }
  236. for ( gr = 0; gr < 2; gr++ )
  237.   for ( ch = 0; ch < stereo; ch++ )
  238.   {
  239. BitHolder **pph = &spectrumSIPH[gr][ch];
  240. gr_info *gi = &(si->gr[gr].ch[ch].tt);
  241. addBits( *pph, gi->part2_3_length,        12 );
  242. addBits( *pph, gi->big_values,            9 );
  243. addBits( *pph, gi->global_gain,           8 );
  244. addBits( *pph, gi->scalefac_compress,     4 );
  245. addBits( *pph, gi->window_switching_flag, 1 );
  246. if ( gi->window_switching_flag )
  247. {   
  248. addBits( *pph, gi->block_type,       2 );
  249. addBits( *pph, gi->mixed_block_flag, 1 );
  250. for ( region = 0; region < 2; region++ )
  251. addBits( *pph, gi->table_select[region],  5 );
  252. for ( window = 0; window < 3; window++ )
  253. addBits( *pph, gi->subblock_gain[window], 3 );
  254. }
  255. else
  256. {
  257. /* assert( gi->block_type == 0 ); */
  258. for ( region = 0; region < 3; region++ )
  259. addBits( *pph, gi->table_select[region], 5 );
  260. addBits( *pph, gi->region0_count, 4 );
  261. addBits( *pph, gi->region1_count, 3 );
  262. }
  263. addBits( *pph, gi->preflag,            1 );
  264. addBits( *pph, gi->scalefac_scale,     1 );
  265. addBits( *pph, gi->count1table_select, 1 );
  266. }
  267. if ( stereo == 2 )
  268. bits_sent += 256;
  269. else
  270. bits_sent += 136;
  271.   return bits_sent;
  272. }
  273. /*____ write_ancillary_data() _______________________________________________*/
  274. static void write_ancillary_data( char *theData, int lengthInBits )
  275. {
  276.     /*
  277.      */
  278.   int bytesToSend = lengthInBits / 8;
  279.   int remainingBits = lengthInBits % 8;
  280.   unsigned wrd;
  281.   int i;
  282.   userFrameDataPH->nrEntries = 0;
  283.   for ( i = 0; i < bytesToSend; i++ )
  284.   {
  285. wrd = theData[i];
  286. addBits( userFrameDataPH, wrd, 8 );
  287.   }
  288.   if ( remainingBits )
  289.   {
  290. /* right-justify remaining bits */
  291. wrd = theData[bytesToSend] >> (8 - remainingBits);
  292. addBits( userFrameDataPH, wrd, remainingBits );
  293.   }
  294.     
  295. }
  296. /*
  297.   Some combinations of bitrate, Fs, and stereo make it impossible to stuff
  298.   out a frame using just main_data, due to the limited number of bits to
  299.   indicate main_data_length. In these situations, we put stuffing bits into
  300.   the ancillary data...
  301. */
  302. static void drain_into_ancillary_data( int lengthInBits )
  303. {
  304.   /*
  305.    */
  306.   int wordsToSend   = lengthInBits / 32;
  307.   int remainingBits = lengthInBits % 32;
  308.   int i;
  309.   /*
  310.     userFrameDataPH->part->nrEntries set by call to write_ancillary_data()
  311.   */
  312.   for ( i = 0; i < wordsToSend; i++ )
  313. addBits( userFrameDataPH, 0, 32 );
  314.   if ( remainingBits )
  315. addBits( userFrameDataPH, 0, remainingBits );    
  316. }
  317. /*
  318.   Note the discussion of huffmancodebits() on pages 28
  319.   and 29 of the IS, as well as the definitions of the side
  320.   information on pages 26 and 27.
  321.   */
  322. static void Huffmancodebits( BitHolder **pph, int *ix, gr_info *gi )
  323. {
  324.   int L3_huffman_coder_count1( BitHolder **pph, struct huffcodetab *h, int v, int w, int x, int y );
  325.   int bigv_bitcount( int ix[576], gr_info *cod_info );
  326.   int region1Start;
  327.   int region2Start;
  328.   int i, bigvalues, count1End;
  329.   int v, w, x, y, bits, cbits, xbits, stuffingBits;
  330.   unsigned int code, ext;
  331.   struct huffcodetab *h;
  332.   int bvbits, c1bits, tablezeros, r0, r1, r2, rt, *pr;
  333.   int bitsWritten = 0;
  334.   tablezeros = 0;
  335.   r0 = r1 = r2 = 0;
  336.   
  337.   /* 1: Write the bigvalues */
  338.   bigvalues = gi->big_values * 2;
  339.   if ( bigvalues )
  340.   {
  341. if ( !(gi->mixed_block_flag) && gi->window_switching_flag && (gi->block_type == 2) )
  342. { /* Three short blocks */
  343.     /*
  344.       Within each scalefactor band, data is given for successive
  345.       time windows, beginning with window 0 and ending with window 2.
  346.       Within each window, the quantized values are then arranged in
  347.       order of increasing frequency...
  348.       */
  349.     int sfb, window, line, start, end;
  350.     I192_3 *ix_s;
  351.     int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].s[0];
  352.     
  353.     ix_s = (I192_3 *) ix;
  354.     region1Start = 12;
  355.     region2Start = 576;
  356.     for ( sfb = 0; sfb < 13; sfb++ )
  357.     {
  358. unsigned tableindex = 100;
  359. start = scalefac[ sfb ];
  360. end   = scalefac[ sfb+1 ];
  361. if ( start < region1Start )
  362.     tableindex = gi->table_select[ 0 ];
  363. else
  364.     tableindex = gi->table_select[ 1 ];
  365. /* assert( tableindex < 32 ); */
  366. for ( window = 0; window < 3; window++ )
  367.     for ( line = start; line < end; line += 2 )
  368.     {
  369. x = (*ix_s)[line][window];
  370. y = (*ix_s)[line + 1][window];
  371. /* assert( idx < 576 );
  372. assert( idx >= 0 ); */
  373. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  374. addBits( *pph,  code, cbits );
  375. addBits( *pph,  ext, xbits );
  376. bitsWritten += bits;
  377.     }
  378.     }
  379. }
  380. else if ( gi->mixed_block_flag && gi->block_type == 2 )
  381.   {  /* Mixed blocks long, short */
  382. int sfb, window, line, start, end;
  383. unsigned tableindex;
  384. I192_3 *ix_s;
  385. int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].s[0];
  386. ix_s = (I192_3 *) ix;
  387. /* Write the long block region */
  388. tableindex = gi->table_select[0];
  389. if ( tableindex )
  390.     for ( i = 0; i < 36; i += 2 )
  391.     {
  392. x = ix[i];
  393. y = ix[i + 1];
  394. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  395. addBits( *pph,  code, cbits );
  396. addBits( *pph,  ext, xbits );
  397. bitsWritten += bits;
  398.     }
  399. /* Write the short block region */
  400. tableindex = gi->table_select[ 1 ];
  401. /* assert( tableindex < 32 ); */
  402. for ( sfb = 3; sfb < 13; sfb++ )
  403. {
  404.     start = scalefac[ sfb ];
  405.     end   = scalefac[ sfb+1 ];           
  406.     
  407.     for ( window = 0; window < 3; window++ )
  408. for ( line = start; line < end; line += 2 )
  409. {
  410. x = (*ix_s)[line][window];
  411. y = (*ix_s)[line + 1][window];
  412. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  413. addBits( *pph,  code, cbits );
  414. addBits( *pph,  ext, xbits );
  415. bitsWritten += bits;
  416. }
  417. }
  418.     }
  419.     else
  420.     { /* Long blocks */
  421. int *scalefac = &sfBandIndex[fr_ps->header->sampling_frequency].l[0];
  422. unsigned scalefac_index = 100;
  423. if ( gi->mixed_block_flag )
  424. {
  425.     region1Start = 36;
  426.     region2Start = 576;
  427. }
  428. else
  429. {
  430.     scalefac_index = gi->region0_count + 1;
  431.     region1Start = scalefac[ scalefac_index ];
  432.     scalefac_index += gi->region1_count + 1;
  433.     region2Start = scalefac[ scalefac_index ];
  434. }
  435. for ( i = 0; i < bigvalues; i += 2 )
  436. {
  437.     unsigned tableindex = 100;
  438.     /* get table pointer */
  439.     if ( i < region1Start )
  440.     {
  441. tableindex = gi->table_select[0];
  442. pr = &r0;
  443.     }
  444.     else if ( i < region2Start )
  445. {
  446.     tableindex = gi->table_select[1];
  447.     pr = &r1;
  448. }
  449. else
  450. {
  451.     tableindex = gi->table_select[2];
  452.     pr = &r2;
  453. }
  454. /*     assert( tableindex < 32 ); */
  455.     h = &ht[ tableindex ];
  456.     /* get huffman code */
  457.     x = ix[i];
  458.     y = ix[i + 1];
  459.     if ( tableindex )
  460.     {
  461. bits = HuffmanCode( tableindex, x, y, &code, &ext, &cbits, &xbits );
  462. addBits( *pph,  code, cbits );
  463. addBits( *pph,  ext, xbits );
  464. bitsWritten += rt = bits;
  465. *pr += rt;
  466.     }
  467.     else
  468.     {
  469. tablezeros += 1;
  470. *pr = 0;
  471.     }
  472. }
  473.     }
  474.   }
  475.   bvbits = bitsWritten; 
  476.   /* 2: Write count1 area */
  477.   h = &ht[gi->count1table_select + 32];
  478.   count1End = bigvalues + (gi->count1 * 4);
  479.   for ( i = bigvalues; i < count1End; i += 4 )
  480.   {
  481. v = ix[i];
  482. w = ix[i+1];
  483. x = ix[i+2];
  484. y = ix[i+3];
  485. bitsWritten += L3_huffman_coder_count1( pph, h, v, w, x, y );
  486.   }
  487.   c1bits = bitsWritten - bvbits;
  488.   if ( (stuffingBits = gi->part2_3_length - gi->part2_length - bitsWritten) )
  489.   {
  490. int stuffingWords = stuffingBits / 32;
  491. int remainingBits = stuffingBits % 32;
  492. /* assert( stuffingBits > 0 ); */
  493. /*
  494.   Due to the nature of the Huffman code
  495.   tables, we will pad with ones
  496. */
  497. while ( stuffingWords-- )
  498.     addBits( *pph, ~0, 32 );
  499. if ( remainingBits )
  500.     addBits( *pph, ~0, remainingBits );
  501. bitsWritten += stuffingBits;
  502.   }
  503. }
  504. int __inline abs_and_sign( int *x )
  505. {
  506.   if ( *x > 0 )
  507. return 0;
  508.   *x *= -1;
  509.     return 1;
  510. }
  511. int L3_huffman_coder_count1( BitHolder **pph, struct huffcodetab *h, int v, int w, int x, int y )
  512. {
  513.   HUFFBITS huffbits;
  514.   unsigned int signv, signw, signx, signy, p;
  515.   int len;
  516.   int totalBits = 0;
  517.   
  518.   signv = abs_and_sign( &v );
  519.   signw = abs_and_sign( &w );
  520.   signx = abs_and_sign( &x );
  521.   signy = abs_and_sign( &y );
  522.   
  523.   p = v + (w << 1) + (x << 2) + (y << 3);
  524.   huffbits = h->table[p];
  525.   len = h->hlen[ p ];
  526.   addBits( *pph,  huffbits, len );
  527.   totalBits += len;
  528.   if ( v )
  529.   {
  530. addBits( *pph,  signv, 1 );
  531. totalBits += 1;
  532.   }
  533.   if ( w )
  534.   {
  535. addBits( *pph,  signw, 1 );
  536. totalBits += 1;
  537.   }
  538.   if ( x )
  539.   {
  540. addBits( *pph,  signx, 1 );
  541. totalBits += 1;
  542.   }
  543.   if ( y )
  544.   {
  545. addBits( *pph,  signy, 1 );
  546. totalBits += 1;
  547.   }
  548.   return totalBits;
  549. }
  550. /*
  551.   Implements the pseudocode of page 98 of the IS
  552.   */
  553. int HuffmanCode( int table_select, int x, int y, unsigned int *code, unsigned int *ext, int *cbits, int *xbits )
  554. {
  555.   unsigned signx, signy, linbitsx, linbitsy, linbits, xlen, ylen, idx;
  556.   struct huffcodetab *h;
  557.   *cbits = 0;
  558.   *xbits = 0;
  559.   *code  = 0;
  560.   *ext   = 0;
  561.   
  562.   if ( table_select == 0 )
  563. return 0;
  564.     
  565.   signx = abs_and_sign( &x );
  566.   signy = abs_and_sign( &y );
  567.   h = &(ht[table_select]);
  568.   xlen = h->xlen;
  569.   ylen = h->ylen;
  570.   linbits = h->linbits;
  571.   linbitsx = linbitsy = 0;
  572.   if ( table_select > 15 )
  573.   { /* ESC-table is used */
  574. if ( x > 14 )
  575. {
  576.     linbitsx = x - 15;
  577. /*     assert( linbitsx <= h->linmax ); */
  578.     x = 15;
  579. }
  580. if ( y > 14 )
  581. {
  582.     linbitsy = y - 15;
  583. /*     assert( linbitsy <= h->linmax ); */
  584.     y = 15;
  585. }
  586. idx = (x * ylen) + y;
  587. *code = h->table[idx];
  588. *cbits = h->hlen[ idx ];
  589. if ( x > 14 )
  590. {
  591.     *ext |= linbitsx;
  592.     *xbits += linbits;
  593. }
  594. if ( x != 0 )
  595. {
  596.     *ext <<= 1;
  597.     *ext |= signx;
  598.     *xbits += 1;
  599. }
  600. if ( y > 14 )
  601. {
  602.     *ext <<= linbits;
  603.     *ext |= linbitsy;
  604.     *xbits += linbits;
  605. }
  606. if ( y != 0 )
  607. {
  608.     *ext <<= 1;
  609.     *ext |= signy;
  610.     *xbits += 1;
  611. }
  612.   }
  613.   else
  614.   { /* No ESC-words */
  615. idx = (x * ylen) + y;
  616. *code = h->table[idx];
  617. *cbits += h->hlen[ idx ];
  618. if ( x != 0 )
  619. {
  620.     *code <<= 1;
  621.     *code |= signx;
  622.     *cbits += 1;
  623. }
  624. if ( y != 0 )
  625. {
  626.     *code <<= 1;
  627.     *code |= signy;
  628.     *cbits += 1;
  629. }
  630.   }
  631. /*assert( *cbits <= 32 );
  632.   assert( *xbits <= 32 ); */
  633.   return *cbits + *xbits;
  634. }