l3bitstream.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:24k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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